STM 32——TIM定时器频率测量

STM 32——TIM定时器频率测量

1.定时器不同工作模式的配置

在使用STM32进行脉冲频率测量时,免不了会碰上TIM定时器的配置问题,这里做一个简单介绍

STM 32——TIM定时器频率测量_第1张图片

1.1计数器模式

STM 32——TIM定时器频率测量_第2张图片

首先我们选择内部时钟(PCLK)作为定时器的时钟源,PHB总线时钟的频率配置为170MHZ,在不采用预分频的情况下计数加一的时间即为1/(170M)秒。

STM 32——TIM定时器频率测量_第3张图片

如上图所示,预分频系数(Prescaler)为1(0+1),向上计数模式,计数溢出值为65535(16位),若需要出发定时器中断(计数溢出中断)就要在NVIC Setting中勾选对应的中断,此外在CUBEMX生成的代码中还需要添加额外的启动定时器函数。

STM 32——TIM定时器频率测量_第4张图片
STM 32——TIM定时器频率测量_第5张图片

若需要使用定时器中断,则需要在主函数中重新定义定时中断回调函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)需要执行的内容。这里用到了两个宏用来读取和写入计数器的计数值,__HAL_TIM_SET_COUNTER(&htim4,0); //计数清零,__HAL_TIM_GET_COUNTER(&htim4); //读取当前计数值。

1.2PWM模式

配置时钟源为内部时钟,通道一模式为PWM Generation CH1
STM 32——TIM定时器频率测量_第6张图片

PWM波的频率等于时钟源的频率/((预分频系数+1)*(计数周期值+1),下图配置为时钟源170M/(170**1000)=1KHZ,占空比等于Pulse/counter Period
STM 32——TIM定时器频率测量_第7张图片
同样的需要在生成的代码中添加启动PWM输出函数

STM 32——TIM定时器频率测量_第8张图片

1.3输入捕获模式

输入捕获简单点说就是在外部输入脉冲的边沿设置中断,通过计算两个连续的边沿间的计数值差,从而计算出外部输入脉冲的频率。通过读取两次连续的中断读取计数值后计数差值,就可以根据计数频率(时钟源)和计数差值计算出输入脉冲频率。

STM 32——TIM定时器频率测量_第9张图片

设置计数器的时钟源为内部时钟,CH1的工作模式为输入捕获模式。

STM 32——TIM定时器频率测量_第10张图片

计数脉冲的频率还和预分频和计数周期值有关,我们还可以选择捕获的边沿是上升沿,下降沿还是双边沿触发中断。

2.测频率的方法

2.1采用单通道输入捕获模式

输入捕获:与定时器类似,在计数达到预设值后可以触发中断或DMA,不同的地方在于输入捕获的值有由硬件直接保存到寄存器TIMx_CCRx,故保存的计数值是进入中断或DMA前的值,不会受进入中断前出入栈带来的时间误差影响。
单通道输入捕获的优点是:1.精度高误差可以控制在千分之几,2.占用的资源少,但是缺点是在测高频方面还是有不足,实测在时钟源为170M的情况下,最高只能采集700k左右的频率,原因是两次中断间隔太小,导致第一次的中断函数还没运行结束,第二个中断就发生了,无法有效的测量出连续的两个边沿间的计数值。

2.2采用两个计数器,一个做计数一个做定时中断

通过读取两次定时中断内的计数差值推算出实际的外部输入脉冲频率。优点是可检测的频率范围可以到达几十兆,但是与之而来的是测量精度和响应速度间的权衡,如果定时的时间过长每次测频率的时间就会影响整个系统的响应速度,反之测评的时间如果过短就会但来的是精度的等比例较少。比如频率变化了100HZ,你的采样间隔为1S得到的改变量100,而你采样时间缩短为10ms(缩小100倍)后频率的变化只有1也会缩小100倍。

2.3采用两个定时器,一个分频PWM输出一个作输入捕获

在2.2的方法基础上我们可以进一步改进,先将输入脉冲作为计数器1的时钟源,然后选择一个通道进行PWM输出通过修改PWM的周期脉冲数,我们可以实现对输入脉冲的分频(硬件直接实现)。定时器二的时钟源采用PCLK(170M),与2.1的输入捕获中断,对其进行输入捕获实测可以稳定测量脉冲波动在1以内。

你可能感兴趣的:(ARM,stm32)