STM32的频率采集方法在实时操作系统的应用

2021-03-11 03:34吕新张博刘志坚王瑞阚京波
电子技术与软件工程 2021年21期
关键词:中断计数精度

吕新 张博 刘志坚 王瑞 阚京波

(中车大连机车研究所有限公司 辽宁省大连市 116000)

STM32F4 系列是意法公司基于arm 内核的中端产品,拥有数量较多的通用定时器[1],及DMA 通道。针对捕获频率方法,通用定时器拥有丰富的配置方案。

工控系统中,频率采集是一项基本功能。频率输入量一般为PWM 波或者正弦波样式,通过硬件光耦转换为高低电平。软件计算频率方法根据ST 系统配置模式的不同,会稍有区别。但为了精度要求,都要满足奈奎斯特采样定律,在大于10 倍采样频率才会有较高的精度[2]。对于一般捕获模式及计频方法,通过电平变化时间差,计算频率;对与PWM 输入捕获模式,只需要设置定时器采样频率,计数上升沿或者下降沿数量,可计算出频率,通过DMA模式,不中断实时系统的任务,很大程度减轻系统的工作量。

1 控制方案

1.1 捕获采样

配置定时器模式为捕获模式,捕获上升、下降沿时间,若捕获周期过低,则会存在N 次溢出,就需要对可能溢出次数预估,做出判断。如图1所示,若定时器周期为T,t1 时刻计数值CNT1,t2 时刻捕获值为CNT2,两次捕获值相减,需要注意,加上溢出次数,否则会丢失频率。若预分频设为0,自动重装值设为T,计算公式为CNT1>CNT2 时,(CNT1-CNT2) * N*T,若CNT1<CNT2 时,计算公式为N*T-CNT2 +CNT1。

图1:捕获采样原理

捕获采样面临的问题是,定时器的周期设置不能过小,否则采样精度会下降。此时中断会对系统任务有很大影响,尤其当多通道采集频率时,实时任务响应不及时的现象时有发生,CPU 占用率高。

1.2 计频方式

计频模式是利用STM32 自带的ETR 引脚计算脉冲数,捕获步骤如图2所示,设置为向上计数器,分频一般设置为0 即可,滤波器在这里设置为5 次滤波,设置为外部计数模式2。

图2:计频方式时钟原理图

可以利用实时系统时间钩子函数,每隔N 毫秒中断一次并读取计数,两次相减即为N 毫秒的计数值cnt,再算出次数cout = 1000/N,频率即为cnt * cout。

捕获模式的问题是,为了采集精度,计数值计算需要频繁中断累加计数值,频率采集和实时系统会互相影响,CPU 占用率高。

1.3 PWM输入捕获DMA方法

DMA 是直接通过外设到内存的处理模式,广泛应用于高速信号处理相关领域[3],在本方法中主要发生在捕获采样阶段,通过FIFO 不断刷新内存缓冲数组中的数据,避免了CPU 被占用过多的资源,PWM 输入捕获以定时器1 通道为例,如图3所示,通过滤波器,设置为5 次,边沿检测通过配置设置,一般设置为上升沿,本次利用从控制器的捕获控制。一般PWM 输入捕获有两个通道,分别为TI1FP1 和TI2FP2,利用其中一个计算频率,另一个计算占空比。通过定时器DMA 相应通道传输数据。捕获计数为cnt,根据PWM 输入捕获的模式方法,与捕获方法的最大不同为,每一个新周期cnt 重新清零。定时器时钟周期为F,则频率为F/cnt。

图3:PWM 输入捕获方法模块原理图

PWM 输入捕获获DMA 传输方法的问题是,数据DMA 中采集有一定波动,需要利用中值滤波进行滤波。

2 方案的具体实施

2.1 捕获采样的实现

利用通用定时器配置计数周期,根据引脚外围定义设置IC 通道,设置相关的IC 捕获属性。同时配置NVIC 中断管理器相关优先级,使能定时器的捕获中断配置信息。在中断中计算两次上升沿计数差值,在实时系统fi 任务中对频率量作中值滤波[4]。计算频率具体核心配置代码如下:

TIMx_ICInitStructure.TIM_Channex = TIM_Channel_x;

TIMx_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;

TIMx_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

TIMx_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

TIMx_ICInitStructure.TIM_ICFilter = 0x00;

TIM_ICInit(TIMx, &TIMx_ICInitStructure);

2.2 计频方式的实现

根据引脚定义,初始化相关引脚为外部捕获引脚,系统设置定时器参数,预分频设置为0,周期设置为0xffff,模式为外部时钟模式2.需根据采样精度需要设置定时器中断,本设计中利用系统自带时间钩子函数,在钩子函数中对外部捕获(时钟)信息计数,精度精确到1HZ。在实时系统fi 任务中对相邻的两次计数值相减,对此值累加1000 次,即为周期数。

2.3 PWM输入捕获DMA方法

PWM 输入捕获是一种特殊的捕获方式,也可以说是一种简化的捕获方案。定时器配置方案与捕获采样基本相同,只需要多配置一个模式选择,同时根据图3配置相应时钟从模式相应参数,如下代码所示。重点需要考虑DMA 的相关配置。

(1)DMA 配置基本信息;DMA 通道、DMA 外设基准地址、DMA 内存基准地址、DMA 传输方向、DMA 传输数组大小、数据格式等;

(2)DMA 模式设置为循环模式、FIFO 模式禁止。

(3)使能DMA。

(4)使能相应定时器DMA 请求。

TIM_PWMIConfig(TIMx, &TIMx_ICInitStructure); // 使能PWM 捕获模式

TIM_SelectInputTrigger(TIMx, TIM_TS_TI1FP1); //选择输入捕获的触发信号

TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);// PWM 输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT 被复位清零;

TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);

根据系统的采样精度要求,系统采样频率上限为5000HZ,那么若一个DMA 缓冲区数据长度设置为10,在实时系统fi 任务中周期设置为10ms,读取一次DMA 的传输结果的在一个任务周期中会有50 个周期,若一个fi 任务中周期设置为100ms,读取一次DMA的传输结果的在一个任务周期中会有500 个周期,并在任务中作中值滤波,基本满足性能要求。

3 实验验证

3.1 实时系统CPU占用率及所剩空间实验

在实时系统中分别建立不同的功能任务,且主要逻辑任务为motor_task,motor_another_task,实时任务在系统运行过程中处于不同的三种状态[5],在这些任务中调用了fi/fi_detect_task 中的频率频率采集值,系统中分别多次调用三种采集方式,为了保证实验的准确性,剩余部分代码未变化,计算系统信息参数配置相同。如图4所示,观察CPU 剩余堆栈及占用率及变化,可以得到以下结果:

图4

(1)主要实时主要逻辑任务motor_task 对应上述三种采集方式所剩堆栈数量,可以得到采用中断捕获中任务处于阻塞态,剩余堆栈数179;采用计频方法,任务处于运行态,剩余堆栈数179;采用PWM 输入捕获DMA 方式,任务处于运行态,剩余堆栈数187;另一个实时任务motor_another_task,对应上述三种方式,分别为阻塞态,运行态,运行态。所剩堆栈数分别为168,179,187。

(2)主要实时主要逻辑任务motor_task 对应上述三种采集方式运行计数值,可以得到采用中断捕获中任务处于阻塞态,任务运行计数为6228;采用计频方法,任务处于运行态,任务运行计数为3450;采用PWM 输入捕获DMA 方式,任务处于运行态,任务运行计数为357;另一个实时任务motor_another_task,对应上述三种方式,分别为阻塞态,运行态,运行态。任务运行计数分别为15276,72941,310。

从上述数据可以看出,使用捕获采样中断方式对CPU 的运行效率影响是最大的,第二是计频采集方式,对CPU 影响最小的是PWM 输入捕获DMA 方法。

3.2 频率精度实验

使用频率信号发生器对三种采样方式在实时系统中测量分析,数据对比表如表1所示。

表1:频率测量对比

从表1可以看出,基于PWM 输入捕获DMA 采样值在1kHz以内,相比其他两种方法有更高的精度,当大于1kHz 小于3kHz 时,小于等于1Hz 的误差,也基本满足一般条件工况的测量精度要求,当大约3kHz 时,误差逐步增大,精度下降。

4 结论

本文提出的PWM 输入捕获DMA 方法配合实时系统应用,能够很大程度的减轻实时系统中对CPU 的资源的占用,提高了系统的实时性响应性,提升了软件的执行效率;且在一般应用条件下满足对频率采集的精度要求。不额外增加频率采样器件,减少了额外的硬件成本。

猜你喜欢
中断计数精度
古人计数
递归计数的六种方式
古代的计数方法
基于DSPIC33F微处理器的采集精度的提高
这样“计数”不恼人
跟踪导练(二)(5)
千里移防,卫勤保障不中断
GPS/GLONASS/BDS组合PPP精度分析
改进的Goldschmidt双精度浮点除法器
巧用磨耗提高机械加工精度