PWM输出一般为PA6和PA7对应的定时器是TIM16和TIM17
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);
HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
__HAL_TIM_SetCounter(htim,0);
void key_scan()//按键扫描函数
{
if(key[0].single_sta==1)
{
view=!view;
LCD_Clear(Black);
key[0].single_sta=0;
}
if(key[1].single_sta==1)
{
LCD_Clear(Black);
pa6_duty+=10;
if(pa6_duty>90)
pa6_duty=10;
TIM16->CCR1=pa6_duty;
// __HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);可以用这个函数代替
key[1].single_sta=0;
}
if(key[2].single_sta==1)
{
LCD_Clear(Black);
pa7_duty+=10;
if(pa7_duty>90)
pa7_duty=10;
TIM17->CCR1=pa7_duty;
key[2].single_sta=0;
}
}
void disp_proc()//屏幕显示
{
char text[30];
if(view)
{
sprintf(text," Para");
LCD_DisplayStringLine(Line0,(u8 *)text);
sprintf(text," PA6:%d%%",pa6_duty);
LCD_DisplayStringLine(Line2,(u8*)text);
sprintf(text," PA7:%d%%",pa7_duty);
LCD_DisplayStringLine(Line4,(u8*)text);
}
else
{
sprintf(text," Data");
LCD_DisplayStringLine(Line0,(u8 *)text);
}
}
频率测量很简单,一般比赛会用到TIM2和TIM3的ch1通道,为引脚PA15和PB4;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
ccr_val1a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
ccr_val1b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
fre1=1000000/ccr_val1a;
duty1=(ccr_val1b/ccr_val1a)*100;
__HAL_TIM_SetCounter(htim,0);
// HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
// HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
}
}
if(htim->Instance==TIM3)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
ccr_val2a=TIM3->CCR1;
ccr_val2b=TIM3->CCR2;
duty2=ccr_val2b*100/ccr_val2a;
fre2=1000000/ccr_val2a;
TIM3->CNT=0;
// HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
}
}
}
这里可以用间接模式测量占空比,这里要十分注意,一定要是在中断回调函数中确定是ch1通道时才进入,还需注意也要打开通道2的输入捕获,不然捕获不到值。
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);
本文章使用limfx的vscode插件快速发布