单片机多任务操作的多功能采集卡设计
2014-06-01阿占文冯清香
阿占文 冯清香
(华中科技大学机械科学与工程学院1,湖北 武汉 430074;华中科技大学机械科学与工程学院2,湖北 武汉 430074)
0 引言
在工业控制领域,数据采集卡是必不可少的硬件。位移、转速、压力、电流、电压转矩等信号一般通过传感器转化为电压或电流输出,由采集卡负责进行A/D转换并交由计算机处理。采集卡的核心芯片一般为单片机或数字信号处理器(digital signal processing,DSP),配上外围元件实现数据采集[1-3]。本设计运用单片机的多任务操作方式,利用STC12C5A60S2单片机的定时器计数模式,实现了频率采集。同时,采用可编程计数阵列模块的PWM模式,实现了D/A输出。最后采用自带的A/D模块和一个125 Ω的精密电阻,实现了电压、电流采集,并由I/O口输出开关量。
1 多功能采集卡的总体设计
本文所设计的采集卡运用在HJD-DJ1型电机试验台上,需要完成以下任务。
①采集电流传感器JLKT-7和电压传感器JLBV-16的信号,输出分别为0~20 mA电流和0~5 V电压。
②采集转矩传感器和转速传感器ORT-803的信号,输出为(10±5)kHz(正反双向测量值)。
③ D/A输出0~5 V,控制磁粉加力器。
④开关量输出控制变频器通断。
⑤串口通信,传回采集数据,与上位机通信。
1.1 多任务模式软件总体设计
多任务模式如图1所示。
图1 多任务模式示意图Fig.1 Schematic diagram of the multi-tasking mode
单片机因主频低、外设少等原因,在实际运用中必须进行代码优化,同时要充分利用其外设进行多任务模式操作[4-5]。首先对每个任务规定一个时间段,由定时器中断刷新各个任务状态标志变量;然后在主函数中分别查询每个任务的状态标志,若某一任务预设时间到,则执行该任务,否则查询下一任务。这样在实际的运行中便呈现出多任务并发执行[6]。
在单片机程序中,将CPU合理地分配给每个任务是多任务操作模式的关键。系统的最小执行时间段取决于各个任务执行所需最小时间,以保证每个任务在时间段内执行完毕。对采集卡来说,如果设定时间段太小,则有些功能无法执行完;如果太长,则降低了效率。因为最耗时的串口通信和A/D转换已经细分,综合考虑各个任务的耗时,最小执行时间段确定为5 ms,即定时器每5 ms中断刷新计时变量,各个任务预设时间必须是5 ms的整数倍,且互相不可整除。另外,还要确定各个任务的外设资源分配情况。预设时间和外设分配如表1所示。
表1 各个任务预设时间表Tab.1 Preset time table of each task
1.2 多功能采集卡的硬件设计
本文设计的多功能采集卡由单片机最小系统、RC滤波网络、D/A输出的功率放大电路、用于测量电流的125 Ω精密电阻和各个引脚1 kΩ的限流电阻组成[2]。其中,功率放大电路由光耦实现。采集卡连线如图2所示。
图2 采集卡连线图Fig.2 Wirings of the acquisition module
2 多任务操作模式的实现
2.1 定义任务结构体
为避免在主函数中反复调用任务处理函数,定义一个任务结构体,这也是任务管理函数的核心。具体代码如下。
2.2 任务管理和处理函数
根据表1中各个任务的预设时间,按照任务结构体的运用程序流程图编写任务管理函数task_manager(),并在主定时器中直接调用。编写的任务处理函数task_process()用来检测每个任务的允许运行变量,并在允许的情况下执行任务。任务处理函数流程图如图3所示。
图3 任务处理函数流程图Fig.3 Flowchart of task processing function
2.3 任务的细分
对于多任务操作,每个任务必须在规定的时间片完成,所以单个任务时间不可太长,否则会影响其他任务,使整个程序效率降低。但在数据采集中有一些功能耗时比较长,如串口通信和A/D模块。针对这种问题就要进行任务细分,一般将一个长任务划分为初始化、执行、返回等部分,这样就使得一个耗时比较长的任务变成多个短任务,保证了多任务模式的运行。
上位计算机要求采集卡将所采集数据传回时必须做出响应。因为多功能采集卡所采集的数据较多,若通过串口将数据传回,则受限于串口通信的波特率,难以在短时间内完成任务。为此,通过利用一个巧妙的缓冲发送结构进行细分,从而解决该问题。具体代码与下文A/D采集部分类似。
A/D采集部分也以同样的方式进行细分,具体代码如下。
3 采集卡功能的软件实现
在多功能采集实现过程中,采用软件方式代替外围硬件来实现大部分功能,具体方案如下。
利用STC12C5A60S2单片机的定时器1作为串口模块的波特率发生器,实现串口通信。定时器0则工作在计数模式,完成频率采集功能。因为该型号单片机定时器只有两个,还需要一个主定时器来实时刷新任务标志变量,所以利用可编程计数阵列模块组成16位软定时器实现该功能。普通采集卡进行D/A转换时一般通过专用芯片完成,这样就增加了外围的元件,本设计再次利用单片机提供的可编程计数阵列,以PWM模式输出PWM波形,通过改变占空比并配合一个简单的RC低通滤波器实现D/A功能。采用自带的A/D模块和一个125 Ω的精密电阻,实现了电压、电流采集。开关量可以用来控制变频器的开关或LED灯的亮灭等,由I/O口输出高低电平即可。下面具体讨论D/A转换和频率采集功能的实现。
3.1 D/A转换功能的PWM实现
D/A输出在工业现场应用十分广泛,比如电压控制的变频调速、磁粉加力器的力矩控制等。D/A转换的实现方法有两种:一种是外接专用芯片,另一种是采用软件实现。本文采用第二种方法,即首先利用STC12C5A60S2单片机的可编程计数阵列模块的PWM模式,输出不同占空比的方波,然后通过低通RC滤波器和功率放大即可实现D/A转换功能[8]。可编程计数阵列模块的结构如图4所示。
图4 可编程计数阵列模块结构图Fig.4 Structural diagram of the programmable counting array module
PCA模块输出的占空与使用的捕获寄存器[EPCnL,CCAPnL]有关,当 CL的值小于[EPCnL,CCAPnL]时,输出为低;反之,则输出为高。当CL溢出时,[EPCnH,CCAPnH]的内容装载到[EPCnL,CCAPnL],从而实现无干扰地更新PWM。
根据图4所示结构,可编写实现PWM的代码如下。
输出不同占空比的PWM波形后,还不能得到模拟电压,此时可以由RC网络组成低通滤波器,滤波器将消除PWM波形的大部分高频成分。从时域角度看,RC电路被充电到一个与PWM波形高电平占整个周期百分比(占空比)成正比的电压电平。为了能得到相对平滑的直流电压电平,RC滤波器必须有相对低的截止频率。但是如果RC常数太大,则RC电压上升到平滑电平的时间就会过长,在两者之间进行折中,选择合适的电阻电容值[7-8]。
3.2 频率采集的实现
频率采集功能和D/A功能一样,可以由专用芯片完成,本文使用定时器0的计数模式实现。由P3.4引脚输入脉冲信号,定时器开始计数;然后在主函数中用一个规定的时间间隔来查询计数值,根据计数值和规定的时间间隔,可以换算得到当前频率。频率采集函数部分代码如下:
4 结束语
HJD-DJ1型电机试验台实际应用表明,整个采集卡代码数量减少了2/3,且流程清晰,维护性、可读性明显好于普通采集程序,并且降低了硬件成本。当工作在极限的情况下,所有任务一起运行时,因为采集数据较多,串口通信稍有延迟,可见所设计的采集卡适用于大部分一般要求的场合。文献[4]还用到了一种新的多任务模式,其任务切换效率更高,但对开发者要求较高。该采集卡现已应用于HJD-DJ1型电机试验台。使用结果表明,该采集卡的使用使程序的可读性和可维护性都有所提高。
[1]郭天祥.新概念51单片机C语言教程:入门、提高、开发、拓展全攻略[M].北京:电子工业出版社,2009.
[2]丁向荣.单片微机原理与接口技术:基于STC15系列单片机[M].北京:电子工业出版社,2012.
[3]陈宏伟,黄永明,章国宝,等.单片机多任务的时间片方式实现[J].单片机与嵌入式系统应用,2012,12(8):73-74.
[4]王辉堂,颜自勇,陈文芗,等.智能安防系统中单片机程序实现多任务机制方法的应用[J].低压电器,2007(4):48-50.
[5]吴允平,蔡声镇,乐仁昌,等.单片机程序的限时服务策略及设计[J].系统工程与电子技术,2004,26(11):1672 -1674.
[6]徐华.51单片机多任务编程设计及应用[J].软件,2011,32(3):21-27.
[7]粟兵.基于DSP的数据采集卡的研究与设计[D].武汉:武汉理工大学,2005:20-36.
[8]林锦棠.基于单片机构成高精度PWM式12位D/A转换器[J].大众科技,2008(2):63-65.