知名高端网站建设报价,有网站源代码能自己做网站吗,公司简介模板免费下载,wordpress支持移动前言#xff1a; 定时器的三大功能还剩下最后一个捕获#xff0c;而这在蓝桥杯嵌入式开发板上也有555定时器可以作为信号发生器供定时器来测量。
原理图部分#xff1a; 开发板上集成了两个555定时器#xff0c;一个通过跳线帽跟PA15相连#xff0c;最终接到了旋钮R40上 定时器的三大功能还剩下最后一个捕获而这在蓝桥杯嵌入式开发板上也有555定时器可以作为信号发生器供定时器来测量。
原理图部分 开发板上集成了两个555定时器一个通过跳线帽跟PA15相连最终接到了旋钮R40上另一个接到了旋钮R39上。了解了这些我们下一步到STM32Cubemx上配置就有数了。
STM32Cubemx配置 我个人是将PA15设定为了TIM2_CH1 PB4设定为了TIM16_CH1 接下来我们进入TIM2和TIM16的配置界面配置对应的通道 然后我们再配置一下响应的参数分频系数我们设置为79重装载值我们就不需要改了 然后我们再打开中断 接下来我们对PB4进行配置点击TIM16 设置分频系数和使能中断 代码部分 在原有的interrupt.c文件里面我们新增加一个回调函数HAL_TIM_IC_CaptureCallback这个回调函数在stm32g4xx_hal_tim.h的2550行的位置如果大家记不住的话可以去看一下 然后我们可以重新书写回调函数的代码了
unsigned int ccr1_val1 0,ccr1_val2 0;
unsigned int frq1 0,frq2 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //中断回调函数
{if(htim-Instance TIM2) //PA15{ccr1_val1 HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);__HAL_TIM_SetCounter(htim,0); //读完之后将计时值清零frq1 (80000000/80)/ccr1_val1; //计算频率HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);}if(htim-Instance TIM16) //PB4{ccr1_val2 HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);__HAL_TIM_SetCounter(htim,0); //读完之后将计时值清零frq2 (80000000/80)/ccr1_val2; //计算频率HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);}} 然后在main.c里面开启定时器中断
HAL_TIM_IC_Start_IT(htim2,TIM_CHANNEL_1); //开启定时器R39 - PB4
HAL_TIM_IC_Start_IT(htim16,TIM_CHANNEL_1); //开启定时器R40 - PA15 这就是最终的一个效果 补发 采用杜邦线将PA7和PB4相连将PA6与PA15相连就可以测量一下上一篇博客定时器输出可调PWM 中提到的PWM频率如图所示 这里我们甚至还可以进一步测量其占空比。通过一个定时器通道去测量整个周期的时间再用一个定时器的通道去测量高电平持续的时间其中高电平持续的时间可以通过检测下变沿来得出。 接下来我们进入到STM32Cubemx中去配置一下参数因为我们的TIM16定时器只有一个通道所以这里我们只能用TIM2来做一下占空比测量 选择一个通道设定为间接模式 将间接模式的通道的触发方式设定为下降沿触发 点击生成代码 我们再进入一下中断回调函数增加几句代码在main.c里面只需要声明几个变量即可不需要额外开启第二通道的函数。
float ccrl_val1a,ccrl_val1b 0;
unsigned int frq1 0,frq2 0;
float duty1,duty2 0;void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //中断回调函数
{if(htim-Instance TIM2) //PA15{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); //计数值清零frq1 (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 TIM16) //PB4{ccr1_val2 HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);__HAL_TIM_SetCounter(htim,0); //读完之后将计时值清零frq2 (80000000/80)/ccr1_val2; //计算频率HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);}} 最终效果如下