我是靠谱客的博主 复杂大船,这篇文章主要介绍配置cubemx并利用输入捕获,使用一个比较寄存器CCR1实现对脉冲的频率和占空比测量,现在分享给大家,希望可以做个参考。

上一篇使用两个比较寄存器来测量信号频率和占空比,这次使用一个比较寄存器来实现该功能。目前只能测量一次,并不能循环测量。这里推荐使用一个按键来复位定时器,就可以实现多次测量。这里使用TIM2_CH1作为信号输入端。到这个文章为止都是属于数字频率计的范围,等之后会出文章关于利用adc和快速傅里叶变换(FFT)来实现测频。

原理部分:与上一篇类似,只是在一个通道内触发多次中断,并改变中断触发方式,就可以测量高(低)电平时钟脉冲总数。

cubemx配置如下:

 

 

代码部分分析:

各种初始化:

复制代码
1
2
3
4
HAL_TIM_PWM_Init(&htim3); //PWM生成初始化 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2); HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //开启TIM2通道1中断

while(1)循环中,flag为进入中断的次数,每进一次中断即有一种边沿被触发进入中断,并在每次进入中断时读取脉冲数,默认第一次触发为上升沿触发,在cubemx中TIM2配置中设置。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ __HAL_TIM_SET_AUTORELOAD(&htim3, duty-1); //设置频率 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, duty/2); //设置占空比 if(flag==1) { first=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1); __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); }else if(flag==2) { second=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1); __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); pul_high=second-first; //信号高电平时钟脉冲数量 }else if(flag==3) { third=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1); pul_num=third-first; //1个周期信号时钟脉冲数量 } d=100*(float)pul_high/pul_num; //计算占空比 pul_frq = 80000000 /pul_num; //计算频率 if(KEY_Scan(0)==1) { //HAL_TIM_Base_Start_IT(&htim2);//tim2开始中断 duty+=100; if(duty>2000) duty=100; } }

中断回调函数中,当触发三次后便停止通道1的输入捕获中断。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim==&htim2) //查询更新事件中断是否产生 { flag++ ;//溢出次数加一 if(flag==4) { flag=0; HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); } } }

结果测试:

最后

以上就是复杂大船最近收集整理的关于配置cubemx并利用输入捕获,使用一个比较寄存器CCR1实现对脉冲的频率和占空比测量的全部内容,更多相关配置cubemx并利用输入捕获,使用一个比较寄存器CCR1实现对脉冲内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(125)

评论列表共有 0 条评论

立即
投稿
返回
顶部