目录
按键
if(HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0)
{
KeyCnt[0]++;
}
else
{
if(KeyCnt[0]<30&&KeyCnt[0]>0) //易错点1
{
Keynum=1;
}
else if(KeyCnt[0]>=30) //易错点2
{
Keynum=6;
}
KeyCnt[0]=0;
}
易错点1:if中判断不明确,没有确保值大于0,导致没按下去时执行。
易错点2:没加大于判断,在一的基础上导致没按时执行。
输入捕获
void IC_POLL()
{
switch (IC_STA)
{
case 0:
__HAL_TIM_SetCounter(&htim3,0);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);
memset(capture,0,sizeof(capture));
IC_STA++;
break;
case 4:
IC_STA=0;
IC_T=capture[2]-capture[0];
IC_zhankong=(capture[1]-capture[0])*100/IC_T;
IC_F=1000000.0/IC_T;
default:
break;
}
}
一般来说,问题不大,但存在其他地方,如sprintf中数组溢出导致捕获值出错的bug。
输出比较
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(htim);
static int Oc_cnt=0;
Oc_cnt=__HAL_TIM_GetCounter(&htim2);
if(htim->Instance==TIM2)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==1)
{
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,Oc_cnt+10000.0*OC_zhankong[0]/OC_f[0]);
}
else
{
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,Oc_cnt+10000.0*(100-OC_zhankong[0])/OC_f[0]);
}
}
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_3)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==1)
{
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_3,Oc_cnt+10000.0*OC_zhankong[1]/OC_f[1]);
}
else
{
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_3,Oc_cnt+10000.0*(100-OC_zhankong[1])/OC_f[1]);
}
}
}
}