咨询电话

ENGLISH0755-88840386
学习专题

咨询电话

0755-88840386
您的位置:首页 > 学习专题 > 专业技术专题 > 工业自动化称重仪表>详情页

基于 RTX 称重控制仪表的设计方案

发布时间:2019-11-18 08:57:47 |来源:网络转载

1 引言

随着嵌入式系统 EOS 应用的日益广泛,控制系统的规模和难度也随之加大,对嵌入式系统的软件开发效率的要求也越来越高,像 μcos,Lin-ux,RTX 等,尤其 RTX 和 μcos 更加突出其实时性,在称重控制行业,越来越多的称重控制仪表都采用嵌入式操作系统,在没有操作系统支持的情况下,多任务调度成为单片机应用系统构造上的重要难题 [1] 。比起传统在单片机上运行程序,它的运行效率更高,稳定性更好,实时性更好,同时也便于对产品软件进行维护,相比传统单片机裸奔,运用 RTX 开发称重控制仪表具有如下几个优点:

●可抢占的任务调度—— — 根据需要进行调用,从而确保了更好的程序流和称重事件响应;

●多任务——— 任务调度会产生同时执行多个任务的效应;

●确定性的行为——— 在定义的时间内处理事件和中断;

●较短的 ISR——— 实现更加确定的中断行为;

●任务间通信——— 管理多个任务之间的数据、内存和硬件资源共享;

●自定义的堆栈使用——— 每个任务分配一个定义的堆栈空间,从而实现可预测的内存使用;

●系统管理——— 可以专注于应用程序开发而不是资源管理 ( 内务处理 )。

2  RTX 内核简介及称重仪表的原理

2.1 RTX内核构架

Keil RTX定性为实时操作系统 RTOS,适用于ARM核和 Cortex- M3 内核的设备。

●任务调度 Scheduler,完成任务间的切换和中断的嵌套;

●互斥事件 Mutex,当共享内部资源时,设置互斥标志,可以防止共享冲突;

●内存分频 MemoryPool,任务通过调用内存管理,分配和释放内存,节约空间;

●邮箱管理 Mailbox,可通过邮箱管理,在任务与任务间进行数据交互;

●延时间隔 Delay&Interval,通过延时间隔调用,提高运行的实时性;

●事件信号 Event&Semaphore,实现任务间的等待执行。

2.2 称重仪表原理

称重仪部件主要完成称重数据采集、称重数据显示、参数存储、按键输入、还包含串口通讯、IO 控制、打印输出等一系列任务,这些任务的执行都有一套参考标准,即必须严格按照 GB/T 7724- 2008 《电子称重仪表》[2] 和GB/T 23111- 2008 《 非自动衡器》[3] 来处理数据。

2.2.1 ARM CortexM3 的处理器

它有 1 个 128KB Flash,1 个 20KB SRAM,4个 16 位定时器,100 个可编程的 I/O 引脚,具有I2C、SPI、USB、15SART和 CAN接口,2 路 10 通道 12 位A/D 转换器,RTC 功能模块,WDT 功能和高级电源管理功能,最高支持 72MHz 主频;提高 CPU的运行速率。

2.2.2  AD称重数据采集

称重数据采集的是 0mV~10mV 称重传感器电桥信号,我们在设计仪表时一般选择带内部增益放大器的 AD,或者在传感器和 AD 设备之间增加一道信号放大环节,这样可以帮助我们采集到更多的有用信号。本方案我们选择 24bit 高精度Σ- Δ 型自带内部增益放大的 AD转换器。

2.2.3 显示器

一般常用七段数码管,也有采用点阵液晶,点阵液晶可以显示中文,方便 HMI 交互。

2.2.4 存储器件

市场上的存储器很多,目前较流行的是电擦除的 AT24CXX 系列,我们采用铁电 FM24CXX 的存储器,铁电的速率比 AT24CXX 电擦除的要快,而且无擦写次数限制,使用寿命更长。

2.2.5 实时时钟

实时时钟可以提供准确的运行时间总和,可以用于实时打印和实时监控记录,方便根据日期调出数据等。

2.2.6  IO扩展

由于 MCU 的 IO 管脚驱动能力的限制,而带动设备通常不仅需要增加驱动能,还要防止设备对 CPU 的干扰,一般我们采用光隔离或磁隔离去驱动 MOS 管或继电器,这样设备的运行干扰就相对小很多,而且能增加驱动设备的能力。

2.2.7 串口通讯

串口设计为了提高 EMC 特性和对外部的抗干扰,这里常选择 ADI 磁隔离器件,串口通讯一般有标准 RS232/RS485 信号,工业比较流行的总线还有 Profibus- DP 和 CAN 总线,主要用于与 PLC、DCS等外设数据交互,控制和打印信息的输出。

3 实时称重系统软件设计

任务分配完后必须根据需要分配优先级,比如想要得到较高的按键响应,可以把任务 1 的优先级设为最高,但是本文主要是分析称重数据的实时监控,所以我们需要将任务 3 的优先级设为最高,这样可以以最快的响应速度处理称重数据。

注解1 :配置 ARM7 内核的时钟和外设等信息,以保证外设的正确运行。

注解2 :RTX 内核的初始化,包含内核时钟,堆栈,任务数量等的分配,并创建第一个任务。

注解3 :“__task void Task0_init()”任务作用是根据需要创建用户任务,流程图上的 os_tsk_create (Task1_Key,13), 就 是 创 建 了以Task1_Key 为函数名的任务 1,并且分配了其优先级为 13,而且把创建任务时的任务序号存放在以TID_ 为前缀的变量里面,这是因为以后对任务的操作都需要用到此任务序号,这个序号是 RTX 内核自动分配的,具有唯一性。

注解4 :多任务的调度和切换详见 3.2 章节举例说明。

注解5 :RTX 系统自带的任务当 TCB( 任务管理器 ) 列表内无就绪可执行任务,内核暂时会切换执行空闲任务。

注解6 :中断入口函数。

注解7 :用户函数可以根据用户需要任意增加和减少,RTX内核任务最大可运行 255 个。

3.2 任务切换举例

任务的切换是要通过内核 TCB 来管理的,假如当前正在运行任务 2“Void Task2_Disp()” ,此时AD 转换完成,给 CPU 发送一个中断信号进入中断,中断的任务就是告诉 RTX 内核,任务 3“Void Task2_Disp()”已经就绪,内核则会判断任务 3 的优先级是否比任务 2 优先级高,如果是,则重新分配任务,把显示任务的运行状态压入显示任务的堆栈,再把数据采集任务的信息从数据采集任务的堆栈中恢复到 MCU 工作寄存器中,启动数据采集任务,而显示任务则被挂起暂停,直到任务 3 完成,把 CPU 控制权释放。

4 需要注意的问题

在应用 RTX时应注意以下几点:

4.1 尽可能不使用循环任务切换。如果由os_dly_wait()函数来进行任务触发,则不需要保存任务内容。由于正处于等待运行的任务并不需要等待全部循环切换时间结束,因此 os_dly_wait()函数可以改进 RTX 内核系统响应时间,更加突出实时效果。

4.2 如果使用时间片,不要将时钟节拍中断速率设置得太高或太低,设定为一个较低的数值在增加每秒的时钟节拍个数的同时会增加 RTX 内核调度所产生的开销,因为每次时钟节拍中断大约需要 100 个 ~200 个 CPU周期;也不可将时钟节拍率太高,否则会增加中断响应时间,导致中断响应不及时,所以个人建议不使用时间片任务切换。我们做软件的时候,可以在有较大数据量处理的任务中间穿插 os_dly_wait()函数,以便其它任务得到响应,又不影响本次任务的运行。

4.3 _alloc_box()函数比较方便的根据需要随时分配内存给任务,但是当我们使用完本次内存后一定要利用 _free_box()释放内存,否则不停的被创建内存而不去释放,那么运行时间一长,内存占用达到饱和,内存溢出了直接会导致系统瘫痪,这个错误是致命性的,而且有时候不容易被发现,是一个隐患。

4.4 每一个任务必须都是一个死循环,例如:

__task void Task1_key (void)

{

 /* 添加任务变量,给设备初始化 */

os_itv_set(2); /* 设置本任务每 20ms 发生一次 */

while(1)

{

KeyManage(); /* 按键扫描和处理 */

os_itv_wait(); /* 等待下一个 20ms 的到来 */

}

}

如果没有 while(1)把 PC 指针控制在 Task1_key(void),那么当运行完一次任务后,PC 指针就会跑飞,程序就会乱掉,直接导致系统崩溃。

4.5 称重过程是一个强实时过程,需要 CPU及时采集秤台过程的数据并快速分析有效数据,从而计算其重量。如果 CPU 速度过慢或者程序逻辑结构设计不合理,必然会导致仪表在稳定性和实时称重控制方面的不足 [4] ,所以必要时我们可以把称重数据采集任务的优先级设为最高。

5 结论

本文介绍了多任务的创建、切换和并发多任务运行,并分析了 RTX高效率数据采集的实时性,RTX 内核一旦接收到事件响应,可以在最短的时间内去处理,这样,提高采集效率的同时又可以提高控制的实时性。而不像传统程序只能顺序执行完一圈后才能被响应。任务切换是 RTX 的一个基本服务,在实际应用中还要对任务切换时的堆栈管理有一定了解,这样才能更好地掌握任务切换的机制。且每个任务都可以随时被创建和删除,不仅可以把暂时不用的任务先从 TCB 中抽出挂起,也可以当再次需要的时候再把它拉入运行 TCB 列表。本文只提到了几个运用 RTX 设计称重仪表的关键点,希望对同类系统设计有一定的借鉴意义。

 

本文源于网络转载,如有侵权,请联系删除

分享到