用STM32触发捕捉实现高速高精度测频
黄春平
中山职业技术学院电子信息工程系,中山528404
摘要: 介绍利用STM32F103单片机实现高速、高精度测频的原理及方法。利用16位定时器4(TIM4)产生1 s的溢出触发脉冲复位定时器2(TIM2),同时清零前的计数值被捕捉到通道1的捕捉比较寄存器TIM2_CCR1中。为了提高整个程序的效率,可及时响应各个中断,采用了消息驱动的方式,当1 s溢出中断时,投递消息完成对显示器缓冲区的定时刷新。该测频系统最高频率可测到288 MHz,最低可测到4 Hz,性能稳定。
关键词: STM32F103;触发捕捉;高速;高精度;消息驱动 中图分类号: TN98文献标识码: A
High Speed High Precision Frequency Measurement Based on STM32 Capture Trigger Function Huang Chunping
Electronic and Information Engineering,Zhongshan Polytechnic, Zhongshan 528404,China Abstract: The paper uses STM32F103 microcontroller to achieve highspeed, highprecision frequency measurement principles and methods. The design adopts 16bits timer 4(TIM4) to generate 1s overflow trigger pulse to reset timer 2(TIM2), and cleared before the count value are captured to channel 1's capture compare register TIM2_CCR1. In order to improve efficiency of the entire program, timely responding to each interrupt ,and it takes the messagedriven way when the 1s
overflow interrupt, the delivery messages completes timing refresh of the display buffer. The highest frequency of the frequency measurement system can be measured to 288 MHz, the minimum can be measured to 4 Hz, and the system has stable performance.
Key words: STM32F103;trigger to capture; high-speed; high-precision; message-driven 引言
STM32F103单片机具有高速数据运算能力、强大的中断处理能力[1]、强大的定时器内部处理结构、极低的功耗,被广泛应用于电子仪器仪表、工业控制、电机控制、通信、信号处理等领域[2]。本文介绍应用STM32F103单片机[3]强大的定时器时基系统、输入触发、输入捕捉,实现高速、高精度测频的原理和方法。
1 测频原理及误差分析 1.1 测频原理
测频原理如图1所示。定时器对内部时钟CK_INT进行1 s的上行计数,通过预装载分频器TIM4_PSC将系统主频FREQ_SYSTEM(72 MHz)7200分频变成10 kHz,当前预分频计数器PSC_CNT对CE上升沿进行上行计数,当前预分频计数器PSC_CNT计的数值与预装载分频器TIM4_PSC相等时,通过或门产生对当前预分频计数器的清零信号SR(signal reset),并产生一个上升沿提供给定时器4的主计数器TIM4_CNT的CE(clock reset),定时器4自动重装寄存器TIM4_ARR设置为9999,将10 kHz频率计到(9999+1)次恰好产生1 s的更新中断。主计数器TIM4_CNT对CE上升沿进行上行计数,当计数到自动重装寄存器TIM4_ARR,就产生了更新中断。当更新产生时,会在定时器4的状态寄存器TIM4_SR的更新标志位UIF置1,并通过设置TIM4_CR2将主控模式设置为输出溢出触发脉冲。
图1 测频原理框图
被测信号通过定时器2的外部触发引脚,经过4分频后,通过设置定时器2的从模式控制寄存器TIM2_SMCR的ETPS为10可将外部信号实现4分频。设置TIM2_SMCR的ECE使能外部时钟使能位,外部时钟输入为ETRF,设置SMS为100,选中的触发输入TRGI的上升沿(这里是来自1 s的TIM4的触发输出),TRGO重新初始化计数器,并且产生一个更新寄存器的信号。分频寄存器TIM2_PSC设置为0分频,TIM2_ARR设置16位计数器最大值为0xffff,当外部信号计数到0xffff时,会产生更新中断标志位UIF置1。
定时器2对TIM2_SMCR将触发输入TRGI设置为TIM4_TRGO,从控制器模式设置为复位模式/TRGI的上升沿初始化定时器。通过设置定时器2的比较捕捉寄存器1的CC1S为11,将IC1映射在TRC上,当TIM4溢出事件时,会触发定时器2将TIM2_CNT的值锁存到TIM2_CCR1中,并清除所有定时器的计数器。 时序图如图2所示,图中小黑点为计数开始有效时刻,可以看到,当CK_INT为上升沿,且TIM2_ETRF即TIM2_CNT的CE为高时,若定时器4产生溢出TIM4_OV,此时会同步清零信号TIM2_TRGI(SR),锁存信号TIM2_TRC(LE)产生一个有效脉冲,把TIM2_CNT锁存到TIM2_CCR1,然后清除TIM2_CNT。
图2 测频时序图 1.2 误差分析
触发捕捉测频法按照频率的定义(即f=N/t)对信号的频率进行测量,其原理如图3所示。图3中,在与门的两个输入端分别输入从TIM2_ETR进来的被测信号,以及持续时间为t(1 s)的有效信号,则上升沿产生复位。这样,只有在时间间隔t内,被测的脉冲信号才能被计数器计到。
图3 触发捕捉测频法测量信号频率原理图 误差分析由f=N/t可得:
考虑到极限情况,相对误差的最大值为:
式中,Δf/f为测量频率时的相对误差;ΔN/N为计数值的相对误差;Δt/t为时间的相对误差。
ΔN/N误差是在测量过程中产生的,定时器4的上升沿开启时刻与计数器脉冲之间的时间关系是不相关的,即它们在时间轴上的相对位置是随机的。读数相差脉冲如图4所示,第一次计数的开闭时刻和被测计数脉冲随机配合的结果使计数器读数为N;第二次计数的开闭时刻和被测计数脉冲配合与第一次不同,结果使计数器为N+1。即两次误差相差一个脉冲,此误差常被称为“±1误差”[4]。
图4 两次计数器读数相差一个脉冲
Δt/t误差产生:时间基准t一般是由石英振荡器提供的标准频率经整形电路、分频电路后产生的。随着微电子技术的发展,整形电路、分频电路和控制器的反应速度所引起的误差已经越来越小,可以认为Δt/t主要取决于晶体振荡器的稳定度,即:
式中,f0为晶振频率,G为晶振稳定度。 1.3 误差解决
ΔN/N误差即“±1误差”,对测量影响为:
测量时间t在这里设定为1 s,所以要减小ΔN/N误差,就要增大f的频率即测量频率比较高的信号。而本设计用触发捕捉方法就是为了高速、高精度地测量100 kHz的信号,因此这项误差可以很小,基本忽略。
Δt/t误差取决于晶体振荡器的稳定度,而设计的开发板采用无源晶振,为了消除这种误差,根据测试结果,补偿一个双精度常数1000 055 303 058 259 121 729 431 637 569 6。 2 软件流程 2.1 主程序流程
主程序主要完成键盘、LED显示、系统时基、定时器2、定时器4的测频模块的初始化。在主函数死循环中完成取消息任务,判断消息是否分拣处理好:是则继续取新的消息,否则说明消息没处理好,继续投递消息到消息队列的尾部去。图5给出了主程序流程图。
图5 主程序流程图
由于查询或中断直接处理任务而影响了其他事件的服务。本次设计中引入了消息驱动机制[5],在STM32单片机软件体系中,使用任务调度的方法。这种方法不仅有清晰的体系层次结构,而且有科学的写作风格,使今后的很多工作易于被升华和升级。通过建立动态连接库[6],中断源通过消息投递函数PostMessage()将消息投递到消息队列尾部之后转而去执行其他任务,不会将时间消耗在某一个任务上,中断函数处理迅速。具体的工作则是由主函数中消息循环中的拾取消息函数GetMessage()来获得新的消息,通过分拣函数DispatchMessage()来指向某一个具体的处理函数,再返回处理结果。 2.2 中断服务函数
定时器2更新中断和比较中断共用定时器2的中断服务函数,更新中断是定时器2通过外部触发引脚TIM2_ETR对外部被测信号进行计数,当计数到0xffff时(因为定时器2主计数器是16位)发生溢出,产生更新中断。由于定时器2计数器只有16位,测量频率范围太窄,需要扩展成32位计数器。为了扩展计数器,这里设置了一个32位的扩展计数器FreqExtCounter,每当发生更新中断时,FreqExtCounter则加上0x10000。
比较中断发生在定时器4输出溢出触发脉冲时,当溢出1 Hz脉冲的上升沿时,比较中断产生,TIM2_CNT的值锁存到TIM2_CCR1。捕捉标志位为1时,当TIM2_CCR1为0xffff且更新中断标志位为1时,则表明发生了更新中断,但未执行更新中断操作,FreqExtCounter没加上0x10000。当执行完TIM2比较中断,再执行更新中断时会加上0x10000,因此这里频率Frequency等于FreqExtCounter。其他情况则是频率Frequency等于FreqExtCounter加上捕捉寄存器TIM2_CCR1的值再加上1。中断程序流程如图6所示。比较中断1 s发生一次,发生时频率Frequency更新一次,更新后将频率送到频率缓冲区,等待主函数通过GetMessage()取得ISR (中断服务程序)发出的消息,送到DispatchMessage()处理。
图6 中断程序流程图
LED动态扫描通过系统定时器SysTick发生中断时更新,1 ms刷新一次LED显示。 结语
上述测频采用了定时器对内部时钟CK_INT计数到1 s, 输出溢出触发复位定时器2, 定时器2对外部信号进行计数,此次对外部频率进行了4分频,而内部时钟为72 MHz。根据采样定理,最大频率可以测到72 MHz×4/2=144 MHz,由于实验室条件所限,只有120 MHz的信号发生器,经过测量可准确无误地显示120 MHz,最低可以测到4 Hz。若设置为最大分频数是8,则最大频率可以测到72 MHz×8/2=288 MHz。 本文的创新点:利用了触发捕捉方法测量输入信号的频率,用同一个脉冲捕捉并初始化计数器,可以提高采样速率,减少中断服务函数的执行时间,实现了高速测频。将16位的定时计数器扩展成了32位的定时计数器,这样最大的测频范围可以达到288 MHz。通过对晶振的双精度补偿,能实现测量基本无误差,实现了高精度。用消息驱动的方式,中断服务函数不再去执行消耗大量时间的中断处理函数,而是将中断处理函数地址和参数投递到消息队列,等待用户级函数去获取消息,分拣处理消息,这样做每个中断处理时间缩短了,处理器可以及时地响应多个中断。 参考文献
[1] 王选民,黄利君.应用SPCE061A单片机实现高精度测频[J].微计算机信息,2006(11):103104. [2] 黄春平,万其明 ,贺贵腾. 直接数字频率合成信号发生器的设计[J].压电与声光,2011(5):840845. [3] 黄春平,黄晓林,贺贵腾. 三相共补复合开关的研制[J].山西电子技术,2010(4):7274. [4] 朱欣华.智能仪器原理与设计[M].北京:中国计量出版社,2002.
[5] 文闻,门爱东,蒋飞. 基于消息驱动的嵌入式数字电视系统研究[J].电视技术,2010(5):1113.
[6] 王恒,王中训,杜思良. 基于ARM9的USB摄像头图像采集压缩及无线传输[J].电视技术,2011,35(3). 黄春平(硕士),研究方向为智能仪器。