来源:网络转载更新时间:2020-09-27 09:26:30点击次数:4413次
0前言
在工业自动化领域,很多应用场合都需要用到称重仪表,例如包装输送带、分选机、充绒机等。这些应用一般都以PLC为主要控制设备,要求同时采集多只称重传感器的重量数据,进行相关控制。传统的方案是将每只称重传感器输出的mV级信号经过模拟放大器变送到0~5V或者4~20mA的工业标准过程信号,再输入到PLC的模拟量模块,进行AD转换处理。这种处理方式容易存在信号处理精度不高,温度特性不佳,以及成本造价较高等缺点,而且由于PLC处理速度的限制,在进行数字滤波等软件处理方面往往受到限制。采用市面上单通道的数字仪表又存在着占用空间大、安装接线复杂、循环读取效率低等问题。本文采用了多通道数字仪表的设计思路,可以用ModbusRTU命令一次读取全部所有通道的称重数据,很好地解决了上述问题。
1功能概述
本设计的多通道数字称重仪表釆用多颗独立高精度ASADC,内置PGA,直接对称重传感器输出的mV信号进行AD转换,并经ARM内核的32位处理器进行数字滤波、标度变换,配有RS485总线接口,支持标准ModbusRTU协议,将多通道称重数据上传到PLC做控制处理。为了在实际应用时方便调试,本设计采用了轻触式按键和点阵式液晶屏做菜单式人机交互界面。为了适应工业现场环境,设计时考虑了各种软硬件抗干扰措施,以满足EMC/EMI要求。为了安装方便,釆用工业标准导轨式安装方式。本仪表以4通道为基本设计,可接4个通道扩展模块,每个扩展模块可扩充2通道,最多支持12通道。支持通过SD卡进行固件升级。
2硬件电路设计
本仪表硬件电路部分由MCU及存储器、SD卡接口、LCD显示及按键、ADC、电源、通信等部分组成。
2.1MCU及存储、LCD显示及按键部分
如图1所示,MCU选用意法半导体公司32位ARMCorte-M3内核处理器STM32F103RCT6。存储部分外挂了I2C接口的EEPROM,用于存储仪表工作参数。LCD釆用的是串行接口的12864液晶模块,背光釆用PWM控制。按键部分是普通的并行10输入。
2.2ADC部分
ADC部分如图2所示。称重传感器通常采用应变式原理,为全桥式惠斯通电桥形式,输出信号一般都是mV级。以常见的2.0mV/V灵敏度传感器为例,在桥路激励电压为10V时,其满量程输出为:
2mV/Vxl0V=20mV
数字称重仪表传感器桥压和ADC参考电压通常采用比例式接法以降低桥压波动对转换结果的影响。为了简化电源设计,传感器桥路激励电压选择5V,这样传感器满度输出会降低到:
2mV/Vx5V=10mV
在这个数量级的输入电压条件下,为了实现十万分之一以上的测量分辨率,要求ADC有良好
图1MCU、存储及显示按键部分
的无噪声分辨率等指标。本设计选用CS5532ASZO在参考电压为5V的情况下,其满量程差分输入范围为:
VFS=5000mV/(64x2)=39mV
按无噪声分辨率19位算,当输入39mV满量程电压时,能得到约26万无噪声码。满量程输入10mV算,无噪声AD码为6.5万。通过后续做进一步的软件滤波能实现10万以上的有效输出AD码。采用4片CS5532独立并行采集,保证了通道之间的同步和独立有效的输出速率。
图2ADC部分
2.3电源部分
电源部分如图3所示。本仪表采用直流24V供电,经电源隔离模块后,输出电压为6V,输出功率为6W。仪表工作电源分为数字和模拟两部分。数字部分电源有5V和3.3V,分别由6V电压经两路LDO降压得到,供CPU等外围电路使用;模拟电源部分是由6V电压经过每个通道各自的专用LDO降为5V,提供给各通道的ADC芯片及传感器挤压。
2.4通讯部分
通信接口为RS485,支持ModbusRTU协议。通信和MCU相互电气隔离,有效提高了抗干扰能力,如图4所示。
3软件设计
软件开发环境采用IARforSTM32O通过STM32配置工具STM32CubeMX设置好10口,中断,定时器等资源后,直接可以生成IARI程文件基本配置代码,直接打开即可进一步进行编程。
我们釆用传统的模块式编程方式。主要功能模块有外设初始化模块、参数初始化模块、显示及按键处理模块、滤波及标度变换模块、主循环调度模块、ADC完成中断处理子程序、定时器中断服务子程序、通信中断服务子程序和参数及SD卡存储服务函数等。其中主循环模块包括ADC标度变换,数字量10,通信协议解析等。下面重点介绍主要的几个模块功能。
3.1参数初始化模块
仪表参数存储在MCU内部的Flash及外挂的EEPR0M芯片中,互为备份。开机时,对参数存储进行CRC校验。发现错误,则用正确的拷贝覆盖,提高了参数存储的可靠性。
参数定义如下:
所有参数统一采用32位整型定义,简化了读写及存储函数。预定义参数编号:
〃显示量程上限
〃波特率
〃从站站号
enum|//参数索引定义
paramDisplayRangeHigh,paramBaudRate,paramDeviceld,
constTParamDefParamDef[]={//参数定义举例{10000,esNumber,-99999,99999,2},
{3,esList,0,4,0],
11,esNumber,1,254,0}
h
constunsignedchar*sBaudRate]]=|
“1200bps”,
“2400bps”,
“4800bps”,
“9600bps”,
“19200bps”
上面的例子定义了3个参数:
(1)参数paramDisplayRangeHigh:索引值0,出厂默认值100.00,编辑方式为数值方式,最小值-999.99,最大值999.99,小数点位置2。
(2)参数paramBaudRate:索引值1,出厂默认值3,即9600bps,编辑方式为下拉列表方式,最小值0即1200bps,最大值4即19200bps,无小数点。
(3)参数paramDeviceld:索引值2,出厂默认值1,编辑方式为数值方式,最小值1,最大值254,无小数点。
3.2显示模块
显示模块负责测量状态下显示各个通道的测量值,参数编辑状态下显示及编辑参数等。针对12864点阵液晶模块,我们提取了几个不同点阵的字模,含有26个英文字母、0~9数字及常用的符号,主要函数有:
voidDisplay8x8Pattern(unsignedcharx,unsignedchary,unsignedchar*pattern);//在指定位置显示一个8x8点阵图像
voidDisplay16x12Pattern(unsignedcharx,unsignedchary,unsignedchar*pattern);//在指定位置显示一个16x12点阵图像voidDisplay24xl6Pattem(unsignedcharx,unsignedchary,unsignedchar*pattern);//在指定位置显示一个24x16点阵图像voidDisplayChar(ICharStylestyle,unsignedcharx,unsignedchary,unsignedcharch);//在指定位置显示一个特定点阵的字符voidDisplayStrNull(TPattemStylestyle,unsignedcharx,unsignedchary,unsignedcharch);//在指定位置显示一个特定点阵的以NULL结尾的字符串
voidDisplaylnt32(TPattemStylestyle,unsignedcharx,unsignedchary,int32val);〃在指定位置显示-•个特定点阵的32位整数c点阵类型由以下定义:
typedefenum|ps8x8,psl6xl2,ps24xl6\TPattemStyle;
3.3按键处理模块
按键处理模式包括SET键处理、移位键处理、功能键处理等。按键值索引定义:
enum|kbSET,kbSHIFT,kbINC,kbDEC,kbFl,kbF2,kbLONG_SET,kbLONG_SHIFT|:
在10ms定时器中断服务子程序里做按键扫描,每次中断记录一次某个或者某两个按键的按压时间及抬起时间,作为按键消抖处理,并识别单键或者组合键键值。键值为-1的时候,表示无任何按键按下。主循环根据键值进入到对应的按键功能处理函数。
3.4滤波及标度变换模块
这是称重仪表的主要功能模块。称重仪表的数据处理流程为:AD原码读出-初始软件滤波一系统校准(内码值规格化)T用户标定(多段标定、零点跟踪、去皮)T显示值。软件滤波要根据实际应用选择合适的滤波算法,常见的有加权滑动平均值滤波、一阶滞后滤波、消抖滤波等。成熟的产品会有几种滤波方法的组合应用,并且可由用户在现场自由调整滤波参数6良好的软件滤波会有效增加系统的无噪声分辨率。系统校准是为了消除仪表模拟链路的离散误差,将内码值统一规格化到一个特定值。本仪表在输入标准满量程的2mV/V时,通过系统校准为1000000(一百万)内码。'用户标定是指标定到用户所实际使用的传感器量程。用户标定釆用多段线性变换的方法,即根据输入的内码值,查表得到对应的线性方程,进而计算出工程量纲值PV。
零点跟踪是为了消除传感器在零点附近的输出漂移。我们采用的方法是,当PV值处于零点跟踪区域内,维持稳定一段时间,则将此时的零点重设为0。去皮即是人为的显示值迁移。
3.5主循环调度模块
主循环依次判断各个中断服务子程序设置的各种信号量标志,并进入到相应的服务函数中。例如按键标志、定时器标志、ADC读取完成标志、串行口接收到一帧数据标志等。本设计没有运行RTOS,UCOS等嵌入式实时操作系统,要防止一些占用时间较长的函数过程影响主循环的调度效率。例如全屏幕的显示刷新会影响仪表对ModbusRTU通讯命令的及时响应。将此类函数里面耗时的循环过程拆分成在主循环里面多次调度逐步执行的函数片是一个可行的办法。
3.6ADC完成中断处理子程序
CS5532配置成连续采集模式。完成一次AD转换后,芯片会拉低SDO引脚指示AD数据已经准备好读出。将SDO引脚连到MCU的某外部中断引脚,即可以用中断方式及时读取ADC结果。中断方式要配置成下降沿触发,并在读取结束,中断返回时,清除中断标志,置位ADC完成标志位,供主循环查询处理。
3.7定时器中断服务子程序
定时器中断主要用于按键扫描、显示刷新、
ModbusRTU帧中断处理、通用异步延时等。
3.8通讯中断服务子程序
STM32片上USART提供接收和发送中断。我们设置两个接收缓冲区和一个发送缓冲区。当收到一个串行字符时,会触发接收中断。在中断服务函数里面,首先进行本机地址判断,是本机地址则初始化接收缓冲区指针,并将接收到的字节数(下转第75页)
据存入,指向下一个缓冲区位置并启动帧判断定时器;否则即将缓冲区指针设为-1。当帧判断定时器溢出时,在中断服务子程序里面将缓冲区数据拷贝到工作区,并置位帧接收标志,供主循环处理。
发送数据时,将要发送的数据拷贝到发送缓冲区,并设定要发送的数据长度,然后将缓冲区首字节送给USART发送寄存器。当一个字节发送完成后,会触发发送完成中断,在该中断里面将发送指针加一,要发送的数据个数减一即可,直到发送完所有数据。ModbusRTU对帧定时有着严格的要求,要根据波特率调整帧定时时间。采用光耦做收发控制线隔离时,要格外注意其转换速率的影响。
BootLoader我们要在BootLoader里面操作SD卡以支持通过SD卡升级固件,其流程如下:开机首先检测SD卡内是否有符合要求的固件升级文件,有的话读出版本信息和当前固件版本做比较,是新版本则询问是否升级,否则直接跳到App。
ModbusRTU协议我们把仪表的通道测量值和运行参数一一对应到Modbus保持寄存器区,支持多寄存器的连续读写操作,可与PLC等ModbusR-TU主站设备方便快捷交换数据。保持寄存器和内
部参数对应举例如表1所示。
PLC通过发送一次ModbusRTU读保持寄存器命令,即可读出全部4组通道的测量值。
PLC发送:010300000008(此处省略CRC校验码)
仪表回传:010310CHICHICHICHICH2CH2CH2CH2CH3CH3CH3CH3CH4CH4CH4CH4(此处省略CRC校验码)
其中CHI~CH4测量值各占4个字节,即32位。
文章来源于网络转载,侵删
×