关于这篇文章不是很懂,哪位大神给解释一下,主要是实现288M频率测量是如何初始化定时器的,如何扩展成32位计数器的,能附上程序更好。
黄春平
中山职业技术学院
电子信息工程系,中山
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
)
.
黄春平(硕士),研究方向为智能仪器。
4