1. 引言
2022年3月22日,中国高等教育学会高校竞赛评估与管理体系研究工作组发布2021年全国普通高校大学生竞赛排行榜中,蓝桥杯全国软件和信息技术专业人才大赛已经连续3年成功上榜,是高校教育教学改革和创新人才培养的重要竞赛项目,持续有力支撑综合测评、奖学金评定、升学考研、工作就业。
蓝桥杯大赛由工业和信息化部人才交流中心主办、面向全国高校大学生的IT类学科竞赛,坚持以“立足行业,突出实践,广泛参与,促进就业”为宗旨,围绕当前社会发展急需的信息技术专业重点领域,进行高校青年学子专业IT技能及创新能力的培养 [1]。
竞赛项目“单片机设计与开发”是蓝桥杯的一项主要竞赛类别,主要考核参赛学生在规定5个小时内,利用掌握的电子技术、传感器技术、单片机控制技术等知识点,通过嵌入式C语言编程,实现单片机控制系统功能,是一项需要多门专业课知识交叉运用的学科竞赛,为后续学生参加全国大学生电子设计大赛打下扎实基础。
“信号频率的测量”是在第七届、第八届、第十届、第十三届蓝桥杯“单片机设计与开发”中多次出现的相关考核知识点,相关考核知识点主要是对单片机系统资源外部中断、定时器的灵活使用。本文使用蓝桥杯“单片机设计与开发”竞赛平台控制器(型号CT107D),分析了传统定时器和外部中断实现信号频率测量的优缺点,在此基础上提出了双定时器自适应高精度频率测量算法,解决使用外部中断频率测量法频繁打断CPU的缺陷,根据信号频率的大小自适应选择双定时器频率测量法 [2] [3]。
2. 频率测量方法原理
四种信号频率测量方法及其信号频率范围如表1所示。

Table 1. Adapted frequency of four methods of measurement
表1. 四种测量方法适应频率
2.1. 定时器和外部中断测频法(固定测量时间)
外部中断引脚接被测频率信号,初始化外部中断方式为下降沿触发,固定定时器定时时间T,在T时间内记录外部中断脉冲个数N。根据频率定义,可以换算出被测信号频率值f为:
(1)
本方法实现信号频率测量存在两个缺陷:
1) 启动定时器时间无法与外部脉冲信号边沿保证同步,理论上存在实际测量个数N与理论测量个数M会可能相差±1个脉冲。
(2)
利用软件冒泡排序算法降低启动定时器和外部脉冲信号无法同步带来测量误差。统计n次单位时间内脉冲个数Ni,冒泡排序后,求数据的平均值作为最终的脉冲个数N。
(3)
2) 外部中断响应程序会打断CPU正常运行,当被测信号频率越高时,产生外部中断的次数越多,频繁中断CPU的运行,会降低CPU运行效率,比如测量信号频率为10 KHz,那么单位时间内CPU会响应外部中断10000次 [4]。
本方法适用于高频率信号,频率越高,外部中断统计个数越多,±1脉冲所产生误差越小。
2.2. 定时器和外部中断测周法(固定测量个数)
外部中断引脚接被测频率信号,初始化外部中断为下降沿触发。在外部中断检测到信号下降沿时,启动定时器,记录定时器时间t1,当检测到下一个下降沿时停止定时器,记录定时器时间t2,因此被测信号频率值f为:
(4)
本方法实现信号频率测量存在的缺陷是:被测信号边沿无法保证与定时器内部时钟源保持同步,理论上存在定时器内部脉冲计数,可能会相差±1个脉冲。
本方法适用于低频率信号,当信号频率越低,定时器内部脉冲计数就越多,定时器所产生误差越小。
2.3. 双定时器测频法(固定测量时间)
双定时器测频法利用两个定时器,其中一个定时器用于定时;一个定时器用作计数,时钟源为被测信号。双定时器测频法工作原理以STC15F2K60S2单片机定时器0内部结构图1来分析 [5]。
由图1所示,
为计数功能,时钟源为单片机T0 Pin引脚外部信号;
为定时功能,时钟源为内部时钟。
工作原理:使用两个定时器,定时器1用于定时单位时间,定时器0用作计数器。启动定时器1的同时,将定时器0数据寄存器TH0和TL0清零,当定时器1达到单位时间时,此时TH0和TL0的值为被测信号频率f的数值:
(5)

Figure 1. Internal structure block diagram of STC15F2K60S2 Timer 0
图1. STC15F2K60S2定时器0内部结构框图
双定时器测频法(固定测量时间)方法相对于外部中断测频法而言,最大的优点在于不用频繁打断CPU的正常运行,但是仍然还存在定时器1和定时器0无法做到真正意义上的同步,可能会存在±1个脉冲数误差,适用于高频率信号,因为频率越高,定时器0统计外部脉冲个数越多,所产生误差越小。
2.4. 双定时器测周法(固定测量个数)
双定时器测频法(固定测量时间)适用于高频率信号,当被测信号频率越低时,定时器0统计个数越少,所产生误差越大。因此对于低频率被测信号,可采用双定时器测周法(固定测量脉冲个数) [6]。
如图1所示,当定时器0固定测量脉冲个数为N个时,计数器TH0和TL0的初值可以设为:
(6)
当定时器0计数溢出时,进入中断响应服务程序,计算定时器1在N个脉冲期间运行时间T,推算信号频率为:
(7)
本方法仍存在定时器1和定时器0无法做到真正意义上的同步,定时器内部时钟源计数可能会存在±1个脉冲数,适用于低频率信号,因为信号频率越低,定时器内部脉冲次数就越多,所产生误差越小。
3. 双定时器的自适应频率测量法
对于固定测量时间法,适用于被测信号为高频信号,可能的±1个脉冲数误差来自被测信号。对于固定测量个数法,适用于被测信号为低频信号,可能的±1个脉冲数误差来自定时器内部时钟源。
为了使得测量信号频率范围宽、测量精度高,在系统程序设计,应根据测量信号频率值实现双定时固定测量时间法和固定测量个数法自适应 [7]。
如图1所示,假设系统主频为12 MHz,定时器内部时钟源为系统主频12分频之后的1 MHz,定时器时钟源周期为1 us。
当被测信号频率为1 KHz以上时,采用固定测量时间法,在单位时间内,被测信号源±1脉冲误差个数带来最大误差D为:
(8)
当被测信号频率为1 KHz以下时,采用固定测量个数法,被测信号为1 KHz,周期为1 ms,对应定时器统计内部时钟源个数C为:
(9)
在被测信号一个周期内,定时器内部时钟源±1脉冲误差个数带来最大误差D为:
(10)
综上分析,假设定时器内部时钟源为1 MHz时,系统采用双定时器自适应算法测量信号频率的最大误差为0.1%,自适应调整频率为1 KHz。当信号频率大于1 KHz时,采用固定测量时间法;当信号频率小于1 KHz时,采用固定测量个数法,考虑到被测信号可能会在1 KHz频率时,存在上下波动,会造成双定时器自适应算法的反复切换,因此在程序流程设计时,需考虑加入迟滞特性。
4. 双定时器自适应测频程序流程图
微控制器STC15F2K60S2片上资源有6路定时器/计数器,使用2路定时器完成信号频率的测量功能。定时器1作为定时单位时间,使用内部时钟作为时钟源;定时器0作为计数器,使用被测信号作为时钟源,双定时器自适应算法切换如图2所示。
如图2所示,双定时器自适应算法切换加入了迟滞特性。程序中有两个频率阈值f2,f1。当测量信号频率按增加的趋势,且大于f2时,选择固定测量时间法;信号测量频率按减小的趋势,且小于f1时,选择固定测量个数法;其他频率时刻,频率测量方法保持原有不变。
f2 − f1称为回差频率,其数值大小表示信号频率的抗干扰能力,避免在临界频率比较时,因信号频率不稳定,而出现自适应算法的反复切换。阈值频率f1,f2可以根据中心频率f0 = 1 KHz,来灵活取值。
如图3程序流程图所示,系统上电时,会对两个定时器进行初始化配置,一个作为定时器,一个作为计数器,开机运行之时会默认选择固定测量时间算法,然后开始信号频率测量,当测量信号频率大于阈值频率f2,且趋势增加时,切换到固定测量时间法;当测量频率小于阈值f1,且趋势减少时,切换固定测量个数法;其他频率范围,测量算法保持原有不变。

Figure 3. Flow chart of frequency measurement program
图3. 频率测量程序流程图
5. 结束语
本文将蓝桥杯电子类“单片机设计与开发”学科竞赛知识点与课程教学融合一起,将竞赛知识点进行项目化改造,融赛入课,让学生在情景教学中感受竞赛氛围的同时,也掌握课程知识要点,培养学生思考问题的逻辑能力,也推动单片机类课程教学改革。
本文提取历年蓝桥杯电子类“单片机设计与开发”学科竞赛高频考点“信号频率测量”,提出了双定时器自适应高精度信号频率测量,利用单片机系统两大重要知识点:中断系统和定时器计数器系统,推动赛教融合,以达到提高教师教学能力,提升学生解决实际问题能力的目的。
基金项目
本文得到江西省教育厅科学技术研究重点项目(GJJ216402、GJJ216403)、江西省高等学校教学改革研究重点课题(JXJG-21-87-1)资助。