吴根平 王 浩 刘 巍 程泽宇 张洪峰
(武汉第二船舶设计研究所 武汉 430064)
目前,船用监控系统多采用模拟量进行远程数据传输,现场监控点与监控台之间敷设大量信号电缆,存在检修困难、抗干扰能力差、可扩展性差、传输距离受限等问题。为提供系统可靠性与可维护性,利用高性能、高可靠性的控制器局域网络(Con⁃troller Area Network,CAN)总线技术,设计了一种基于STM32芯片的CAN总线智能测控模块,可实现对监控点的信号检测、输出控制与远程传输。
智能测控模块主要功能如下。
1)具备2路模拟量、2路开关量的信号检测功能;
2)具备2路模拟量、2路开关量的输出控制功能;
3)具备CAN总线通信功能,能与其他CAN总线模块进行信息交互;
4)具备远程设置模块的CANID、波特率等参数的功能。
智能测控模块总体结构框图如图1所示。测控模块以STM32F07芯片为控制核心,主要由最小系统电路、CAN总线接口电路、模拟量输入接口电路、模拟量输出接口电路、开关量输入接口电路以及开关量输出接口电路等组成。
系统工作流程如下:模块中断接收CAN总线数据帧,根据CAN数据帧的类型进行相应的操作。当模块接收到参数设置帧时,模块设置系统参数并把参数值存入EEPROM中;当模块接收到传输数据帧时,模块采集2路模拟量与2路开关量,并将所采集数据传输到CAN网络上;当模块接收到数据帧时,模块输出2路模拟量与2路开关量。
图1 测控模块总体框图
综合考虑系统综合性能要求和成本要求,主控制器MCU采用ARM芯片STM32F407ZET6。该芯片是ST公司推出的32位ARM架构微处理器,采用Cortex-M4内核,工作频率高达168MHz,包含2个CAN控制器外设、3个I2C接口、1MB的FLASH以及196KB的SRAM,可应用于高度集成与低功耗的嵌入式应用场合。
最小系统电路主要包括供电电路、复位电路、时钟电路以及调试接口电路。供电电路采用SPX1117M3-3.3芯片将5V电源转换为3.3V电源为STM32F407芯片供电;采用RC电路对该芯片上电复位;时钟电路采用外接25MHz的晶体震荡器。
因STM32F407内嵌了CAN控制器,采用抗干扰能力强的隔离型ISO1050作为CAN总线收发器,采用B0505LS电源隔离芯片为ISO1050收发器提供隔离电源。为避免CAN总线网络遭受ESD以及其它瞬变电压干扰,在CAN总线信号线与地之间各跨接了TVS二极管。CAN总线接口电路如图2所示。
图2 CAN总线接口电路
测控模块的2路模拟量输入信号源为4-20mA标准电流信号。采用100Ω的精密电阻将4-20mA电流信号变换为0.4-2V电压信号,之后经电压跟随器连接到模数转换芯片AD7988。AD7988芯片由LM285D-2.5提高精密2.5V基准电压源。2片AD7988芯片与STM32芯片构成SPI四线式CS模式。
图3 2路I/V变换电路
图4 2路模拟电压信号采样电路
测控模块输出2路4-20mA标准电流信号。使用2片DAC8501数模转换芯片与STM32芯片构成SPI四线式CS模式,基准电压是LM285D-2.5精密2.5V基准电压源。采用负载共电源V/I变换形式,采用100Ω的精密电阻将0.4-2V电压信号变换为4-20mA电流信号。
图5 2路模拟电压信号输出电路
图6 2路V/I变换电路
开关量输入接口电路可实现2路开关量隔离检测功能。为提高系统抗干扰能力,输入通道采用PA1a电磁继电器、PC817光电耦合器实现两级电气隔离。
图7 开关量输入接口电路
开关量输出接口电路可实现2路开关量输出功能。为提高输出驱动能力,选用SDI1102D固态继电器。为提高系统可靠性与可维护性,设计了输出确认机制,将输出开关量经过光耦电平转换重新输入到STM32芯片中进行输出确认。
图8 开关量输出接口电路
软件部分主要包括CAN总线通信模块、数据采集与输出模块两部分。CAN总线通信模块主要由CAN控制器初始化函数、CAN帧发送函数和CAN帧接收函数三部分组成;数据采集与输出模块主要负责2路模拟量、2路开关量的采集与输出。
协议是网络通信的关键。CAN总线协议主要包括参数设置帧、读取数据帧、数据帧、确认帧等协议帧。本文选用11位标识符的标准帧。11位标识符中,高4位标识帧类型,低7位标识节模块ID,具体协议格式如图9所示,协议说明如表1所示。
图9 CAN总线通信协议格式
表1 CAN总线通信协议说明
CAN控制器初始化函数主要实现CAN工作时的参数设置,具体包括硬件使能CAN控制器、设置CAN总线波特率、设置中断工作方式、设置CAN验收过滤器、CAN控制器的工作方式等。
CAN帧发送函数将已打包完毕的CAN帧发送到CAN总线上,以实现数据的发送。进入该函数后,首先判断发送缓冲区是否为空,若为空则将待发送的数据写入发送缓冲区,然后启动发送,最后返回。
CAN帧接收函数以中断方式调用以提高系统效率。该函数主要负责读取CAN接收缓冲区的数据至RAM中。进入该函数后,首先判断接收缓冲区是否为空,若非空则读取接收缓冲区的数据,然后返回,程序流程如图所示。为防止接收缓冲区数据溢出,可开辟一个环形数组保存接收数据缓冲区的数据。
开关量数据的采集与输出程序比较简单,将连接开关量输入输出的引脚分配配置为GPIO输入输出引脚,然后分别读取相应引脚的值或者输出相应的高低电平即可。在此给出了采用外部ADC的模拟量采集模块程序与采用外部DAC的模拟量输出模块程序设计的说明。
4.2.1 模拟量采集模块程序设计
根据AD7988芯片的四线式CS模式串行接口时序,设计了模拟量采集模块程序。首先将CNV置为低电平,再分别将两片AD7988芯片的SDI0、SDI1置为高电平,而后将CNV置为高电平,此时ADC芯片开启转换,等待10us后,将SDI0置为低电平,逐位循环读取SDO数据。读取完16位数据后,将SDI1置为低电平,逐位循环读取SDO数据,之后返回。模拟量采集模块程序流程图如图10所示。
图10 模拟量采集模块程序
4.2.2 模拟量输出模块程序设计
根据DAC8501芯片的串行接口时序,设计了模拟量输出模块程序。首先判断DAC输出通道,将相应片选信号置低,之后从高至低逐位输出相应位至SPI数据线,最后将片选信号置高,返回。模拟量输出模块程序流程图如图11所示。
本文设计了一种基于ARM芯片STM32F407的CAN总线智能测控模块。该智能测控模块能够完成2路模拟量、2路开关量的信号检测与控制,能够与其他CAN模块通过CAN总线进行信号交互与控制。智能测控模块的成功应用,可有效提高船用监控系统的可靠性,实现全面的、自动化的远程监控与管理,具有较强的工程应用价值。
图11 模拟量输出模块程序