其实这一部分在历年的省赛题中是没有考过的,而且在国赛中考的也不是我们主板上的55芯片发出的PWM信号。但我们可以将这一个做成一个检测频率以及占空比的东西,当作一个示波器。这样我们就可以知道在实验过程中我们输出的PWM的频率了。
开发板上使用了一个信号发生器,使用的是55芯片,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/0713495a1a3b3c9627719eb412a3eac1.png)
55芯片通过一个跳线帽分别连接到芯片上的PA15和PB4引脚上,接着就可以去配置cubemax,PA15选TIM2_CH1,PB4选TIM3_CH1。
![](https://i-blog.csdnimg.cn/blog_migrate/392785ecc4c332f23c832b959ab457b4.png)
接着配置时钟的通道1为输入模式,通道2为间接模式
![](https://i-blog.csdnimg.cn/blog_migrate/2f8daeb40d286a665e552a5594a9d7bd.png)
接着让直接通道测上升沿,间接的去测下降沿。
![](https://i-blog.csdnimg.cn/blog_migrate/e723c7d21e72046d45205fd17bd578da.png)
后续将分频系数设置为80-1,重装载值默认就可以,然后使能NVIC时钟,PB4的TIM3也同样的操作,接着就可以生成代码了。
接着直接放下源码
//测量频率+占空比//
double ccrl_val1a=0,ccrl_val2a=0;
uint ccrl_val1b=0,ccrl_val2b=0;
uint frq=0,frq2=0;//频率
float duty1=0,duty2=0;//占空比
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)//判断是来自定时器3的
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//中断消息来源 选择直接输入的通道
{
ccrl_val1a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);//直接
ccrl_val1b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);//间接
__HAL_TIM_SetCounter(htim,0);//定时器清零
frq=(80000000/80)/ccrl_val1a;
duty1=(ccrl_val1b/ccrl_val1a)*100;
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
}
}
if(htim->Instance==TIM3)//判断是来自定时器3的
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//中断消息来源 选择直接输入的通道
{
ccrl_val2a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);//直接
ccrl_val2b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);//间接
__HAL_TIM_SetCounter(htim,0);//定时器清零
frq2=(80000000/80)/ccrl_val2a;
duty2=(ccrl_val2b/ccrl_val2a)*100;
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
}
}
}
但是别忘了在main函数中将定时器打开
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//频率测量捕获定时器开启
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);//频率测量捕获定时器开启 间接通道
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);