APP下载

基于单片机的信号测量教学案例设计

2021-07-17李向阳

锦绣·中旬刊 2021年7期

摘要:为了锻炼学生单片机系统软硬件设计能力,为工程实际应用打下坚实基础,根据学生专业特点,精心设计了基于单片机的信号测量实践教学案例。本案例实现了信号的周期、频率测量和通过串口传输,经过改进后还可以实现占空比的测量。

关键词:CubeMx,前后台编程,输入捕获,占空比

一、引言

《单片机原理及应用》是计算机科学与技术专业嵌入式方向的一门研究微机原理、接口技術及程序设计的专业拓展课程。本课程担负着认识理解微控制器工作原理、掌握单片机控制系统应用设计,为嵌入式专业课程打下专业基础的任务[1-2]。本课程简明扼要地讲授STM32单片机芯片的硬件结构和工作原理,系统讨论了单片机主要系统资源的设计方法,并为单片机系统设计进行了必要准备。主要内容包括STM32单片机的硬件结构、C语言程序设计、单片机内部主要模块的功能实现、外部接口的应用设计以及初步的单片机应用系统设计等内容。

考虑到课程应用性强的特点,为了锻炼学生单片机系统软硬件设计能力,为工程实际应用打下坚实基础,课程以STM32CubeMX软件和MDK-ARM软件来学习单片机编程,其中STM32CubeMX采用图形化方式完成外设初始化的设计[3],在MDK-ARM编程中,引入了较多先进的编程思想,硬件采用较新的STM32Nucleo开发板和STM32F411RE控制器。

课程在锻炼学生软硬件设计能力的同时,引入了前后台编程思想、图形化的初始化设计思想、状态机设计思想等,并引入了实际项目开发中自定义帧格式、复杂信号测量等常用的综合性技能项目,对于学生实践能力的锻炼很有好处。本文以信号测量项目为案例,可以在较短的课时内让学生掌握单片机定时器、串口的实践应用。

二、信号测量案例分析

1、任务内容

本次信号测量任务属于定时器的输入捕获功能应用[4-5],并用到之前学习的定时器PWM输出功能,以及后续将要介绍的串口通讯。知识点包括引脚选择、参数计算,数据定义,接口函数调用等,具体实现了信号的周期、频率测量和通过串口传输,经过改进后还可以实现占空比的测量。

外部脉冲信号利用A定时器的某通道产生,利用B定时器的某通道来测量一个外部脉冲信号的周期、频率和占空比,通过杜邦线与前述测量通道连接。如图1所示,通过计算t2,t3与t1的时间差,即可实现信号测量,时间差为对应的计数脉冲个数乘以计数脉冲周期数,计数脉冲个数通过输入捕获功能进行记录。

2、设计思路

1)、设置某引脚为定时器A的通道,利用定时器A的PWM输出功能,输出一定频率和占空比的方波;

2)、配置B定时器的某通道为输入捕获模式,采用上升沿触发。设置合理的预分频系数和最大计数值;

3)、采用前后台编程模式。在输入捕获中断的回调函数中,设置测量完成标志,主程序中检测该标志,一旦置位则计算信号的周期和频率,并清除标志位。

三、项目设置

1、引脚选择

引导学生在CubeMx软件的Pinoutview界面查看STM32F411RETx芯片引脚功能。

1)、串口RX、TX引脚选择。USART1使用PA10、PA9引脚;USART2使用PA3、PA2引脚;USART1使用PC7、PC6引脚。根据硬件实际情况,选择USART2作为示例,使用PA3、PA2引脚。

2)、在本任务中既需要定时器作输入捕获,也需要作PWM输出来使用,经观察,在排除PA3、PA2引脚的条件下,定时器的引脚列于下方。

TIM1_CH1:PA8;TIM1_CH2:PA9;TIM1_CH3:PA10;TIM1_CH4:PA11;

TIM2_CH1:PA0,PA5,PA15;TIM2_CH2:PA1,PB3;TIM2_CH3:PB10;

TIM3_CH1:PA6,PB4,PC6;TIM3_CH2:PA7,PB5,PC7;TIM3_CH3:PB0,PC8;TIM3_CH4:PB1,PC9;

TIM4_CH1:PB6;TIM4_CH2:PB7;TIM4_CH3:PB8;TIM4_CH4:PB9;

TIM5_CH1:PA0;TIM5_CH2:PA1;

TIM10_CH1:PB8;TIM11_CH1:PB9;

经讨论,根据被提问学生的意见选择一组,比如示例中选择TIM1_CH1的PA8、TIM2_CH1的PA0,分别作为PWM输出和输入捕获功能使用,实物中将两引脚连接起来。选择的引脚如图2所示。

2、TIM1配置:

1)ClockSource:InternalClock,选择时钟源为内部时钟;

2)Channel1:PWMGenerationCH1,选择通道1为PWM输出;

3)如果输出一个频率为50KHz,占空比60%的方波,该如何设计参数?

根据公式Period=(ARR+1)(PSC+1)/TIM1_CLK,其中周期Period=1/50K=20us,TIM1_CLK=100MHz,引导学生计算ARR和PSC的取值,从学生计算的结果中选择一组,比如ARR=19(CounterSettings的CounterPeriod参数),PSC=99(CounterSettings的Prescaler参数);

根据占空比60%,易于算出CCR(PWMGenerationChannel 1 的Pulse参数)应为12。

3、TIM2配置:

1)ClockSource:InternalClock,选择时钟源为内部时钟;

2)Channel1:InputCapturedirectmode,选择通道1为输入捕获模式,捕获通道为直接输入方式;

3)引导学生分析ARR和PSC的值该如何选取:输入的方波信号在边沿处将进行捕获,此时记录下计数值(最大为ARR),显然ARR越大,可以测量的信号脉宽越大,故此处应将ARR设的足够大,建议ARR(CounterSettings的CounterPeriod参数)取最大值0XFFFFFFFF;计数的周期越小,对信号周期的测量越准确,故没必要预分频,建议PSC(CounterSettings的Prescaler参数)取0;

4)在边沿处进行捕获时,采用中断方式处理较为方便,故将NVICSettings的TIM4 globalinterrupt使能。

4、系统内核设置

1)在RCC模式和配置中,将HSE来源设为旁路时钟源(BYPASS Clock Source);

2)在SYS模式和配置中,将debug设置为串口调试(SerialWire);

5、时钟配置

1)Inputfrequency(输入时钟频率):8MHz;

2)PLLSourceMux(锁相环时钟源):HSE;

3)SystemClockMux(系统时钟源):PLLCLK;

4)HCLK:100MHz。

四、程序设计

1、变量定义

2、用户初始化设置

用户初始化流程如图3(a)所示,是在由CubeMx软件自动生成的外设初始化代码之后,由用户编写的初始化代码,实现了启动TIM2_CH1的输入捕获和启动TIM1_CH1的PWM输出功能。

3、前台程序

前台程序如图3(b)所示,其中第一、第二次捕获分别对应图1的t1和t3时刻,完成2次捕获后,将置位测量完成标志MeasureFlag = 1,供后台程序使用。

4、后台程序

当前台(即TIM2的输入捕获中断函数)测量完成,即捕获到图1中的t1和t3时刻计数值,后台将在死循环中计算捕获差值,并计算信号周期、频率通过串口输出,当然还要清除测量完成标志,以利于新的捕获,其流程如图4(a)所示。

讨论:程序中通过计算TIM2两次捕获值之差,乘以1个脉冲的周期(1/100000000s),计算得到测量信号周期。很明显只适用于测量信号周期不太大的情况,因为一旦测量信号周期太大,TIM2的第二个捕获值可能溢出。引导学生讨论测量信号周期的最大值,易于计算得到,应为(0xFFFFFFFF+)/100000000=42.95s,足够满足普通应用需求。

如果想扩大对被测信号周期的测量,可以考虑第二次捕获加上计数溢出值即可。对应的程序流程如图4(b)所示。当然修改后的程序,对测量信号周期仍然有范围限制,易于想到,其值约为42.95×2=84s。

5、实验结果

编译并烧写可执行文件后,可在实物上观察对信号周期和频率的测量结果。连接串口,接收到的结果如下框所示,非常准确。

五、案例的改进

在上述案例中,通过捕获t1,t3时刻的计数值后计算差值,即可完成对信号周期和频率的测量。如果想实现占空比的测量,思路也较为简单,下面从前后台程序分别进行介绍。

1、前台程序

如图5所示,第一次捕获对应t1时刻(见图1),将保存捕获值CapVal1,修改捕获标识CapIndex=1,以及设置为下降沿中断。接下来在下降沿时,将再次成功捕获对应t2时刻,根据捕获标志即可判断出属于第二次捕获,此时保存捕获值CapVal2,修改捕获标识CapIndex=2,以及设置为上升沿中断。接下来在上升沿时,将再次成功捕获对应t3时刻,根据捕获标志即可判断出属于第三次捕获,此时保存捕获值CapVal3,重置捕获标识CapIndex=0,并置位测量完成标识MeasureFlag=1,供后台程序查询使用。

2、后台程序

后台程序流程图见图6所示,分别根据CapVal2与CapVal1的差值、CapVal3与CapVal1的差值是否大于零,判断TIM2是否在图1中的t2与t1中间、t3与t1中间存在计数溢出情况,如存在将分别加上2^32,从而扩大了对信号周期的测量范围,具体分析与四、4节的分析类似。

3、实验结果

编译并烧写可执行文件后,可在实物上观察对信号周期、频率和占空比的测量结果。连接串口,接收到的结果如下所示,非常准确。

六、总结

从本案例可以看出,课程体现了较强的应用性,学生通过STM32CubeMX软件的图形化操作完成外设初始化的设计,将在MDK-ARM软件中自动生成初始化代码;在MDK-ARM编程应用时,采用了前后台的编程思想,使得程序结构较为清晰;案例实践中,引入了定时器计数溢出、通过修改边沿捕获方式计算信号占空比等讨论,对定时器的设计应用学习更为深入。通过对本案例的设计、讨论与实现,培养了硬件设计和软件设计技能,开发了学生的创新思维,提高学生的自学、分析和解决问题的能力。

参考文献

[1]许江河, 高绪红. 基于单片机的多路信号采集测量系统设计与实现[J]. 电子科学技术, 2015, 2(005):547-551.

[2]金国华, 滕君华. 基于单片机的出租车计价器实验教学案例设计[J]. 信息技术与信息化, 2019, 000(003):93-95.

[3]罗清龙, 冯敏, 李清涛. 基于STM32CubeMX嵌入式实验教学改革实践[J]. 计算机教育, 2018, 000(001):155-158.

[4]李建波, 张永亮, 梁振华. STM32CubeMX定时器中断回调函数的研究[J]. 电脑知识与技术, 2020, v.16(08):254-255+279.

[5]李建波, 潘必超, 邱陽林. 基于STM32CubeMX外部中断回调函数的研究[J]. 电子世界, 2020, No.586(04):13-14.

作者简介:李向阳(1984-),男,浙江宁波人,博士,副教授,主要研究方向为嵌入式系统开发

[项目]教育部2019年第二批产学合作协同育人项目:《单片机原理及应用》重构式教学示范课程(项目编号:201902312002);宁波市公益项目(项目编号:2019C10051)