员玉良, 冯 强, 杨丽丽, 王方艳
(青岛农业大学机电工程学院,山东青岛266109)
目前,多路数据信号参数的采集分析大多采用技术较为成熟的数据采集卡来实现。桑志国等[1]利用虚拟仪器以及数字信号处理等技术设计了多通道数据采集系统,该系统基于LabVIEW上位机软件,可以测量方波信号的脉宽与频率等参数,能够很好地还原信号波形。但是,由于测量频率范围的限制,该方法在进行高频率段的连续周期脉宽测量时,所得测试数据的准确度降低,误差增大,而且该方法需要上位机的联机支持,灵活性较差,便携程度低,不适应于现实环境中的操作与实施。当然,很多具体项目中的数据采集装置已经开始使用单片机[2-3]作为主控CPU进行数据采集。然而,受限于传统单片机技术的自身缺陷,数据的采集、处理以及传输需要并行处理,CPU执行效率较低,尤其对于较高频率的连续周期脉宽数据采集时经常出现漏采、漏读现象,无法保证有效信息的完整性。为此,潘宇等[4]提出用FPGA[5-8]对高频信号进行分频,降低输入信号频率,利用脉宽测量法测得频率,但极易造成有效信号丢失,无法测得脉宽数据。而且该方法需要分别对FPGA和单片机[9-10]进行编程,者配合使用才能实现采集要求,程序较为复杂,成本较高。
本文设计了基于直接存储器访问(Direct Memory Access,DMA)[11-14]的连续脉宽数据采集装置,利用STM32F7系列单片机集成的DMA,由外设直接访问存储器,加快数据传输速率,减少控制器处理数据的时间,提高CPU执行效率,实现较宽频率范围内的多通道[15]连续脉宽参数的等精度获取。
为保证能够进行较宽频率范围内的连续信号采集,减少控制器处理数据的时间,增加数据的采集深度,避免漏采、误采等现象,采用直接存储器访问技术实现外设与存储器之间的数据快速搬运工作,在无需CPU参与的情况下,后台快速移动数据。在DMA搬运数据的同时,CPU可执行其他程序,节省出大量时间,极大地提高CPU的执行效率。
DMA基于AHB总线结构,结构原理如图1所示。集成于片上的定时器、A/D模块、D/A模块以及串口等,可借助于DMA直接访问存储器。进行连续脉宽测量时,定时器捕获脉宽长度,并向DMA控制器提出外设请求,DMA控制器收到请求后,向CPU发出总线接管控制请求,CPU会在执行完当前周期的总线任务后,挂起自身总线任务,将总线控制权转交DMA控制器,返回请求响应,最终建立数据搬运通道,定时器输入捕获寄存器暂存的脉宽值就可快速搬运至事先开辟的内存区域存储,且无需CPU参与。
图1 结构原理图
基于DMA的连续脉宽数据采集装置采用STM32系列单片机定时器的PWM输入模式进行脉宽测量,其测量时序图如图2所示。
在PWM输入模式下,通过软件设置输入映射,即同一路输入信号,在定时器内部映射到两个捕获/比较寄存器上,分别对其边沿(上升沿与下降沿)进行测量。在输入引脚的信号发生由0->1的电平正跳变时,内部边沿检测器检测到跃变信号的同时,由触发捕获/比较寄存器(TIMx_CCRx)锁存计数器的当前值。同时,计数器复位,重新开始计数,等待输入信号发生与前一个信号沿相反极性的跳变。相应地边沿检测器触发第2个捕获/比较寄存器(TIMx_CCRx),并锁存下降沿跃变时计数器的值,至此完成两次沿捕获。一次输入捕获,由定时器生成DMA请求,触发DMA进行数据搬运,将所测的脉宽时长快速转移至事先开辟的内存区域进行存储。
图2 等精度脉宽测量时序图
单片机定时器输入捕获预分频系数PSC,定时器时钟频率Tclk,则定时器外部时钟输入脉冲间隔(或称计数间隔)为
当发生一次完整的输入捕获时,在整个高电平时间内计数个数为N,其脉宽测量时间为
理想状态下,只要将定时器与分频系数设置足够小,即可达到无限精确,定时器的预分频系数需要在0~65 535之间取整设定。在此,设定预分频系数PSC为26,那么由式(1)可得知计数间隔为0.125 μs。
根据公式
显然,在较低频率下,信号的周期会变长,相应正脉宽的时间也会延长。为满足低频条件下较长时间的测量,需要设定重装值ARR最大。因此,由
即可得出,在定时器未发生溢出前提下所能测得的最大时间Tmax为8 191.875 μs,取整为8.0 ms。进而,由式(3)可算出对应的最低可测频率为125 Hz。
通常情况误差仅存在于定时器计数间隔的间隙误差中,因此定时器的预分频系数越高,单位时间内的计数频率越高;高电平时间内的采样速率越快,采样数据越准确。此采集装置所选用主控制器STM32F767系列单片的主晶振时钟为216 MHz,定时器计数频率最高可达216 MHz。
为实现对较宽频率范围内的连续脉宽进行等精度的高速动态测量,数据采集装置的主控制器采用了基于ARM Cortex-M7内核的STM32F767ZI单片机,由其完成每个脉冲周期内正脉宽的数据采集、存储以及显示输出等任务。系统软件采用C语言编写,可实现多路信号数据同时采集。
数据采集装置主要由单片机控制实现测量、存储以及数据的输出显示。装置在上电初始化后,开启定时器的PWM输入捕获功能,即开启脉宽测量,第1次捕获到上升沿时,记录此时的捕获时间,直至捕获下降沿,完成一次输入捕获。启动DMA传输的同时在屏幕上显示脉宽数据,传输完成后清空寄存器数据,准备再次捕获脉宽信号。软件流程图如图3所示。
图3 软件流程图
在Cube MX软件与Keil中编写并下载单片机程序,输入信号由函数信号发生器提供。函数信号发生器选择RIGOL-DG1022U双通道函数信号发生器,采样速率最高可达100 MSa/s,能够同时输出两路5 MHz频率的方波信号。在此,由信号发生器提供0.125、0.500、1、5、10、50、100、250、500 kHz、1 MHz 等跨度为3个数量级的10个示例方波信号,分别由示波器和采集装置对其每个连续周期的高电平脉宽信号进行采集。
波形显示由示波器完成。选用RIGOL-DS1074四通道示波器,示波器最大分辨率1 GSa/s,最高可测量70 MHz输入信号。
(1)精度测试。通过与函数信号发生器的标准输出量、示波器的示数以及数据采集装置测得的数据三者进行对比,验证数据采集装置的精确度,采集测试现场如图4所示。
(2)丢数测试。在程序软件上拓宽内存区的数据存储深度,加以定时器辅助控制单位时间长短,通过单位时间内(设置为1 s)的数据存储量验证数据采集装置是否发生数据丢失现象。
图4 装置测试图
图5表明,该数据采集装置实现了对频率125 Hz~1 MHz的等精度连续高电平脉宽的测量,测量相对误差均小于0.05%。高频率段(5 kHz~1 MHz)时,实现零误差测量,显示了良好的准确度与实时性。
图5 测试数据误差分析
由图6可以看出,整个数据测试周期内无丢数现象,解决了传统的单片机高频数据采集时易漏采、丢数的技术难题。
图6 丢数验证
在STM32F767单片机平台上使用C语言对单片机进行程序编写,基于单片机定时器实现对方波连续脉宽数据的等精度测量。利用DMA传输技术,减少系统耗时,增强系统即时性,保证数据采集的准确性。该数据采集装置不仅突破了传统高频连续脉宽信号采集存在的诸多技术瓶颈,实现了对多路较宽频率范围内连续脉宽信号的高精度测量,而且拓宽了DMA技术的应用场景,具有一定的现实意义。