首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用STM32触发捕捉实现高速高精度测频

用STM32触发捕捉实现高速高精度测频

引言
  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误差取决于晶体振荡器的稳定度,而设计的开发板采用无源晶振,为了消除这种误差,根据测试结果,补偿一个双精度常数1000 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()处理。
继承事业,薪火相传
返回列表