上一章介绍了STM32定时器的PWM输出功能,定时器的几个通道除了有输出功能外,还可以做输入用,可捕获信号的上升沿或下降沿,可以用于测量信号的频率、周期、占空比等。本篇文章将介绍用STM32的定时器输入捕获功能测量方波的频率。
前期准备
STM32硬件电路板及仿真器(以STM32F072C8单片机为例)
Keilv5以上版本(MDK-ARM)
信号发生器
测量频率的原理是用定时器的捕获功能捕获信号的上升沿,并用定时器的定时功能统计两次捕获之间的时间(两次捕获时计数器的差值/定时器的频率),即为信号的周期,周期的倒数即为频率。
STM32CubeMX配置
首先新建工程后,配置系统时钟为48MHz(参考之前的文章STM32CubeMX之GPIO的使用)。以TIM1为例,使能TIM1的时钟源为InternalClock(即48MHz系统时钟),设置通道1为InputCapturedirectmode,可以看到对应到PA8引脚自动被设置为TIM1_CH1功能。定时器基本参数的配置参考STM32CubeMx之TIM定时中断,其它具体配置如下图。
STM32的定时器通道可以设置上升沿捕获、下降沿捕获或者上升沿下降沿都捕获。当捕获到信号的上升沿或下降沿时,产生一个捕获中断。这里设置为上升沿捕获。
其中PrescalerDivisionratio参数为可预置分频比,可设置为不分频或2/4/8分频,若设置为2分频,表示捕获到2个上升沿才产生一次中断。
InputFilter为输入滤波器参数,滤波器的功能简单来说就是多次检测视为一次有效,也就是说连续N次采样检测,如果都是高电平,则说明这是一个有效的电平信号,这样便可以过滤掉那些因为某些而干扰产生的一些信号。
设置完成后,打开定时器的溢出中断和捕获中断。
之所以需要打开溢出中断,是因为两次捕获之间,定时器可能会溢出,需要在中断中记录溢出次数,才能统计两次捕获之间的总时间。
程序编写
在初始化后添加以下代码:
HAL_TIM_Base_Start_IT(htim1);//启动定时器1中断HAL_TIM_IC_Start_IT(htim1,TIM_CHANNEL_1);//开启定时器1通道1捕获中断
编写两个中断回调函数,定时器溢出中断用于统计溢出次数,在捕获中断中记录当前的捕获值,两次捕获的总计数值=溢出次数*65535+两次捕获的差值。程序如下:
uint32_tTIM1_Over_Cnt=0;//溢出次数计数uint8_tTIM1_Cap_Flag=0;//捕获标志0表示第一次捕获1表示第二次捕获uint32_tTIM1_Cap_Value[2]={0,0};//两次捕获的定时器计数值uint32_tTIM1_Counter=0;//两次捕获的计数差值//定时器溢出中断回调函数voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim==(htim1)){TIM1_Over_Cnt++;//溢出次数+1}}//定时器捕获中断voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef*htim){if(htim-Channel==HAL_TIM_ACTIVE_CHANNEL_1){if(TIM1_Cap_Flag==0)//上次测量值已经处理完,第一次捕获{TIM1_Cap_Flag=1;TIM1_Cap_Value[0]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);TIM1_Over_Cnt=0;}elseif(TIM1_Cap_Flag==1)//第2次捕获{TIM1_Cap_Value[1]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);TIM1_Counter=(TIM1_Over_Cnt16)+TIM1_Cap_Value[1]-TIM1_Cap_Value[0];//溢出次数16+两次捕获的差值为总计数次数TIM1_Cap_Flag=2;//两次捕获完成开始计算}}}第二次捕获完成后,可以计算信号的频率:
if(TIM1_Cap_Flag==2)//通道1捕获完成标志{Frequence=(float)48000000/TIM1_Counter;TIM1_Cap_Flag=0;//重新开始下次捕获标志}采用这种计数方式测量频率属于测周法(测量周期),存在±1误差,当信号的频率较高时,TIM1_Counter值会变小,±1误差的影响将会被放大。因此,被测信号的频率越高,这种方法的测量误差越大。
另外一种方法为测频法,用定时器设定一个确定的闸门时间(比如1秒),在1秒内记录捕获到的上升沿的次数。捕获次数/闸门时间即为被测信号的频率。这种方式同样存在±1误差,被测信号频率越低,误差的影响就越大。
两种方法互补,工程师可根据被测信号的频率范围决定使用哪种方法。下一章将介绍另外一种频率测量的方法,等精度测频。顾名思义,该方法的测量误差不受被测信号的影响,在全频率段内精度一致。