基于CANopen的分布式两轴倾角测量器设计※*

2016-02-26 01:56姚国栋丑武胜
单片机与嵌入式系统应用 2016年1期

姚国栋,丑武胜

(北京航空航天大学 机械工程学院,北京 100191)



基于CANopen的分布式两轴倾角测量器设计※*

姚国栋,丑武胜

(北京航空航天大学 机械工程学院,北京 100191)

摘要:设计了一个两轴倾角测量器,倾角测量器通过CANopen协议进行组网,并且符合CiA410子协议,可以方便地接入现有的CANopen分布式网络。硬件设计多选用高集成度小封装芯片,整个倾角测量器尺寸为30 mm×45 mm×10 mm,非常适合空间受限的应用。采用面向对象的方法设计CANopen协议栈,结构清晰、易于使用。

关键词:倾角测量器;分布式测量;CANopen;CiA301;CiA410

引言

倾角测量器在现实中有着广泛的应用,如机器人、高级外科手术工具、导航系统以及姿态控制系统等[1],对于一些分布式应用,系统中可能同时存在多个被测对象或者需要同其他节点一起工作,此时一个能够组网工作的倾角测量器会给系统搭建带来极大方便。

1整体说明

所设计的倾角测量器采用CANopen协议接入分布式控制网络,CANopen是建立在CAN总线之上的应用层协议,最初为机器控制网络设计,现在在医疗设备、轨道车辆、楼宇自动化等领域都有广泛应用[2],许多分布式控制网络也采用CANopen进行组网,采用此协议使得本倾角测量器可以方便地接入已有的CANopen分布式控制网络。本文主要涉及硬件和软件设计两大部分,硬件选型时对芯片的封装尺寸和成本进行了考虑,在符合需求的情况下尽量选用小封装器件,设计好的测量器的整体尺寸为30 mm×45 mm×10 mm,能够方便地应用于空间受限的场合。软件框架采用前后台结构,简洁而高效;协议栈实现了采用面向对象的设计方法,结构清晰且易于扩展。

2硬件设计

倾角测量器的硬件主要由电源系统、微控制器及外围电路和传感器及接口3部分组成,硬件整体结构如图1所示。

2.1电源系统

在分布式控制系统中往往存在许多不同类型的设备,这些设备常常需要不同的工作电压,由于本倾角测量器针对分布式控制系统设计,为方便倾角测量器集成到现有的控制系统中,设计了一个具有宽电压输入范围的电源系统,输入电压为6~26 V,覆盖了常用的12 V和24 V电源系统。如图2所示,电源系统分为5 V和3.3 V输出两部分。5 V输出部分采用DC-DC转换器,可以保证在输入电压较高时(如24 V),电源系统也能维持较高的转换效率和较少的发热,5 V输出向CAN接口芯片和3.3 V电源供电;3.3 V输出部分采用线性稳压电源,此部分向微控制器和传感器供电。

这里DC-DC控制器选用ACT4088,采用SOT23-6封装,转换频率为1.4 MHz,高的转换频率允许使用很小的LC滤波器,如这里选用的滤波电感尺寸仅为3.5 mm×3.3 mm的CD32系列电感,输出电容则采用0805封装瓷片电容。线性稳压源选用RT9139-33,采用SOT23-5封装,这是一款低噪声、高响应速度并具有过流和过热保护功能的线性稳压芯片。电源系统原理图如图2所示。

2.2微控制器

本设计采用了ST公司的STM32F405RG,具有1 MB片内Flash和192 KB SRAM,能够满足本倾角测量器的程序运行要求,另外此微控制器具有丰富的接口,如本文用到的CAN总线接口、SPI接口和UART接口。这里微控制器采用其典型的外围电路,具体可以参考其数据手册。

2.3传感器及CAN总线接口

传感器是实现倾角测量的核心,这里选用的传感器型号为MPU9250,这款9轴传感器内集成了3轴MEMS加速度计、3轴MEMS陀螺仪以及3轴霍尔磁强计。传感器通过SPI接口与微控制器连接,可以通过此接口设置传感器的工作参数和读取传感器的测量值。

本设计中CAN接口收发器选用TJA1042,采用HVSON8(3 mm×3 mm)封装,其较SO-8封装具有更小的尺寸。传感器及CAN接口原理图如图3所示。

图3 传感器及CAN接口原理图

3程序设计

3.1程序整体框架

本设计中采用典型的“前后台”程序结构,后台程序完成系统初始化以及资源监控等工作,前台程序完成剩余的所有工作。图4为后台程序框图,系统复位后,后台程序开始执行,完成一系列初始化后进入一个无限循环,并在此无限循环中监控系统资源。

图4 后台程序框图

图5为前台程序框图,前台程序有3个中断触发,第1个为1 kHz的“滴答”中断,此前台程序为系统提供周期性服务功能,如传感器数据的周期采样服务;第2个为SPI接口的DMA中断(这里SPI通信采用DMA管理),每当数据采样完成后触发,此前台程序完成传感器数据的预处理及倾角计算;第3个为CAN FIFO中断,当从CAN总线接收到合法数据帧后触发,此前台程序将收到的数据帧传入CANopen协议栈进行处理,进而完成相应通信功能。

图5 前台程序框图

3.2面向对象的CANopen协议栈实现

参考文献[3] 对CANopen协议作出了具体定义,由分析可知,CANopen通信协议的功能主要由7种“通信对象”和“对象字典”来实现,其中“通信对象”提供了多种传输服务,“对象字典”作为桥梁连接了“通信对象”和“用户应用”。CANopen协议栈主要包括“通信对象”和“对象字典”的实现,这里采用面向对象的程序设计方法来实现协议栈,这样协议栈的结构就更加清楚,使用也更加方便。

3.2.1通信对象的实现

通信对象的类视图略——编者注,主要由4个接口和8个类组成,它们的继承关系在类视图中表示。接口类抽象了通信对象间以及通信对象与外部程序间的数据交互,需要处理CAN数据帧的类以实现ICANDataConsumer接口、向CAN总线发送数据帧的类以实现ISendCANData接口或者把ISendCANData作为内嵌对象,实现同步传输功能的类(PDO)以实现ISyncMessageConsumer接口、实现高分辨率时钟信号的类(TimeStamp)以实现IHighPrecisionTick接口。

CANopenStack类本身实现了Network Management(NMT)通信对象的功能,维护NMT状态机,并把其他通信对象作为内嵌对象,实现对所有通信对象的统一管理,外部程序只需通过此类的实例便可以完成CANopen相关操作。ClientSDO和ServerSDO类实现了Service Data Object(SDO)通信对象的功能,通过SDO可以访问对象字典中任意可访问的数据,SDO通信总是由ClientSDO发起并由对应的ServerSDO进行响应。TransmitPDO和ReceivePDO类实现了Process Data Object(PDO)通信对象的功能,通过PDO以及合适的配置可以高效地访问应用中的过程数据。SyncObject类实现了Synchronization Object(SYNC)通信对象的功能,它为总线上的通信提供了同步参考,PDO同步功能的实现就是以SYNC为参考的。TimeStamp类实现了Time Stamp Object(TIME)通信对象的功能,它为总线提供了一个简单的时钟。EmcyObject类实现了Emergency Object(EMCY)通信对象的功能,当设备出现一些内部错误时,便可以通过此类向总线汇报错误。

3.2.2对象字典的实现

对象字典是CANopen协议栈中的另一个重要内容,一个设备的具体行为就是通过对象字典中的各个数据对象进行定义的。这里设计了ObjDictionary类来抽象对象字典的行为,此类维护一个数据对象列表,对外提供AddDataObj、GetDataObj和Sort三个方法。AddDataObj方法可以向字典中添加新的数据项;GetDataObj方法可以获取指定索引的数据对象;Sort方法对列表中对象按照索引(Index)进行排序,以方便执行高效的二分查找。字典中的数据对象均派生自同一个抽象类DataObjBase,此类定义了两个纯虚函数GetEntity和SetEntity,派生类依据各自特性对这两个函数进行实现,这样利用C++的多态特性便可以通过无差异的函数调用实现对不同类型数据对象的操作,保证了程序的可扩展性。当需要新类型的数据对象时,仅需从DataObjBase派生一个新类并直接使用,而不必修改其他类的实现。这里主要派生了3个数据对象类,其中CommonDataObj为模板类,可以接收任意的简单数据类型及一维数组,CANopen中预定义的“基本数据类型”和“扩展数据类型”均可以用此类来表示。对象字典相关类的类视图略——编者注。

3.3CiA410兼容配置

此部分讲述如何设计和配置倾角测量器的对象字典,从而使其符合CiA410标准[4]。CiA410是专门为倾角测量器设计的设备子协议,对实现一个倾角测量器所需的通信层和应用层数据对象进行了定义。下面对与倾角测量器相关的关键数据对象进行说明。

3.3.1设备类型(0x1000)

此数据对象定义设备的类型为一个无符号32位变量,低16位为410(十进制),表示符合CiA410标准,高16位为0x0002(十六进制),表示一个分辨率为16位的两轴倾角测量器。

3.3.2TPDO1(0x1800、0x1A00)

数据对象0x1800和0x1A00分别定义了TPDO1的通信参数和映射参数,TPDO1用于实时获取16位分辨率的纵向倾角值和横向倾角值。表1对TPDO1的定义进行了说明。

除TPDO1外,CiA410标准还强制要求定义TPDO2,默认配置为获取32位分辨率的倾角值,由于这里仅仅实现了16位分辨率,为了保证符合标准,这里对TPDO2的参数(0x1801、0x1A01)也做了定义,不过所有参数均为只读,且0x1801的SubIndex1定义为0x8000 0280+nodeID,即TPDO2处于无效状态,且主机无法通过SDO使能TPDO2。

表1 TPDO1参数的定义

3.3.3应用相关对象

应用相关对象对倾角测量器的具体功能进行了定义,具体定义及说明见表2。

4倾角测量的实现

本设计采用集成的三轴加速度计实现姿态的测量,基本原理是通过测量重力加速度在传感器正交的3个测量

轴上的分量来计算出倾角测量器相对水平面的两个倾角。测量平面由传感器的X轴(纵轴)和Y轴(横轴)定义,纵向倾角定义为纵轴与水平面的夹角,横向倾角定义为横轴与水平面的夹角。当用gx、gy和gz分别表示传感器沿3个敏感轴的测量值,纵向倾角αlong和横向倾角αlateral分别由下式计算[5]:

表2 倾角测量器相关的数据对象定义

5实验验证

这里采用CANalyst-II CAN分析仪+CANPro分析软件对所设计的倾角测量器进行测试,采用这样的测试组合可以直接对CANopen数据帧进行识别和分析。测试时有两个倾角测量器连接到分析仪,这两个倾角测量器的Node-ID分别为10和11,参数依据3.3节进行配置,可以通过默认的TPDO1获取倾角值,且TPDO1支持同步传输,测试过程的截屏略——编者注,通过CANPro分析工具以1 s的周期发送同步(SYNC)消息,紧随SYNC消息后面是两个倾角测量器在SYNC触发下发送的TPDO数据(即测得的纵向倾角值和横向倾角值),图中数据以十六进制表示。

结语

本文设计了一款两轴倾角测量器,可以通过CAN总线方便地接入到CANopen分布式网络,符合CiA410子协议,可以方便地替换其他符合CiA410的设备。通过实验测试,本倾角测量器可以在CANopen网络中工作。

[1] Luczak S,Oleksiuk W,Bodnicki M.Sensing tilt with MEMS accelerometers[J] .Sensors Journal,2006,6(6):1669-1675.

[2] CiA.CANopen[EB/OL].[2015-08].http://www.can-cia.org/index.php?id=systemdesign-canopen.

[3] CiA301.CANopen application layer and communication profile[S] .CAN in Automation,2011.

[4] CiA410.Device profile for inclinometer[S] .CAN in Automation,2010.

Distributed Two-axis Inclinometer Design Based on CANopen※

Yao Guodong,Chou Wusheng

(Institute of Mechanical Engineering and Automation,Beihang University,Beijing 100191,China)

Abstract:A two-axis inclinometer is designed which can be networked by CANopen protocol.This inclinometer complies with CiA410 sub-protocol,so it can be integrated into the existing CANopen network easily.The dimension of the inclinometer is only 30 mm×45 mm×10 mm because of the using of the high integration chips,so it is very suitable for the space limited applications.CANopen protocol stack is designed using the object-oriented method,which has a clear structure and is easy to use.

Key words:inclinometer;distributed measurement;CANopen;CiA301;CiA410

收稿日期:(责任编辑:薛士然2015-08-19)

中图分类号:TP212.12

文献标识码:A

基金项目:*国家磁约束核聚变能研究专项资助项目(2012GB102006)。