基于RS422总线的多路舵机网络控制器设计
2021-09-09钟志贤吴世立郭宇丰
钟志贤,丁 瑜,吴世立,郭宇丰
(1.昆明冶金高等专科学校 a.网络管理与信息中心;b.组织部;c.建筑工程学院,云南 昆明 650033;2.云南碧桂园房地产开发有限公司,云南 昆明 650225)
0 引 言
舵机作为一种位置、角度伺服的驱动器,常常被用于机器人、无人机等各种控制系统中[1-2]。因控制转动的执行机构往往需要多个舵机配合完成,故对舵机实现多路集中控制的需求较为广泛。要实现对舵机的多路控制可采用基于CPLD、FPGA、DSP、单片机等产生多路PWM信号进行控制[3-10]。CPLD、FPGA的特点是电路可定制,可实现大规模的舵机控制,但是开发门槛高、成本高。单片机的特点是通用性强,开发使用简单方便,但只适用于控制舵机数量较少的场合。
综合考虑成本和性能,本文给出了一种基于C8051F340单片机配合74HC595移位寄存器扩展的13路舵机控制器的硬件设计方案及软件实现方法。
1 方案设计
多路舵机控制器采用模块式的开发思想,设计有RS422总线接口以便控制器集成到其它控制系统中,作为一个单独的控制模块使用。设计原理如图1所示。
图1 多路舵机网络控制器系统设计原理Fig.1 Design principle diagram of multi-channel steering gear network controller system
多路舵机控制器硬件主要是以C8051F340单片机为核心,包括RS422串行总线接口及电平转换电路、电源电路、AT24C01存储电路、JTAG与复位电路、74HC595扩展电路、LED及蜂鸣器驱动电路、多路舵机接口电路等。控制器设计有两线式串行总线电可擦只读存储器AT24C01,用于保存上位机发来的舵机角度控制数据,以实现模块断电复位后,快速恢复最近一次舵机的控制角度。多路舵机控制器的系统结构示意图如图2所示。
图2 多路舵机控制器系统结构示意Fig.2 Structrual diagram of multi-channel steering gear controller system
2 硬件系统设计
2.1 单片机的选择及最小系统
根据多路舵机控制器的功能需求,主控芯片采用C8051F340单片机。其为兼容8051微控制器内核,可达 48 MIPS,具有 12 MHz 内部振荡器和4倍时钟乘法器。工作电压为2.70~5.25 V,64 kB 的片内flash存储器,4 352 B 的片内RAM,4个通用16位定时器,5个捕捉/比较模块及可编程计数器定时器阵列PCA。2个增强型UART,1个硬件实现的SMBus,1个USB控制器,10位ADC带模拟多路器及多达40个I/O端口,能很好满足控制器的功能扩展需求。多路舵机控制器硬件单片机最小系统电路图如图3所示。
图3 单片机最小系统电路Fig.3 Minimum system circuit of single chip microcomputer
2.2 RS422电平转换及电源电路
多路舵机控制器控制部分电源通过RS422总线接口(图4,J1所示)从上位机处获取,网络标号为VIN,GND,电压为 5 V,VIN经电压转换芯片HT7533将电压转为 3.3 V 供单片机及其他芯片使用,网络标号为 3.3 V。为同时满足多路舵机控制的功率需求,以及避免舵机抖动对控制部分电源的干扰,舵机的供电电源单独设计,图4中J3接口为舵机电源输入接口,网络标号为+5 V、0 V。图4中J2为2种电源地线短接接口。
图4 RS422电平转换与电源电路Fig.4 RS422 level conversion and power supply circuit
多路舵机控制器采用了抗干扰强且差模传输、全双工、传输距离远的点对多点的RS422串行总线[11],电平转换芯片采用MAX3491(图4,U3),工作电压为 3.3 V,长距离传输时需要使用终端电阻(图4,R6、R7)阻值约等于传输电缆的特性阻抗。POWER_LED为电源指示灯。
2.3 存储模块、LED及蜂鸣器驱动电路
多路舵机控制器还设置有1个蜂鸣器、1个工作指示灯,以方便程序调试,指示工作状态及进行相关报警。存储模块采用AT24C01(图5,U5),通过SMBus总线与单片机的P10、P11管脚相连,具有 1 kB 的存储空间,用来存储各舵机的动作数据。WORK_LED为控制器工作指示灯。
图5 存储模块、LED及蜂鸣器驱动电路Fig.5 Memory module,LED and buzzer driver circuit
2.4 74HC595驱动及舵机接口电路
舵机有3条接线,分别为电源线、地线、控制信号线。多路舵机控制器设计了13路舵机接口,由5个单片机自带的PWM(图6,PWM1—PWM5)、8个74HC595扩展的舵机接口(图6,DJ1—DJ8)组成。1片74HC595芯片可以将单片机的4个端口扩展为8个,若通过多片进行级联,更能有效节约单片机的I/O口资源。74HC595驱动及舵机接口电路如图6所示。
图6 74HC595驱动及舵机接口电路Fig.6 74HC595 drive and steering gear interface circuit
3 软件系统设计
3.1 舵机控制原理
舵机的控制信号为周期 20 ms,频率 50 Hz 的PWM信号[12-13],通过改变脉冲宽度控制舵机进行角度转动,0.5~2.5 ms 的脉冲宽度对应舵机转动角度为0~180°,且角度与脉冲的宽度成线性关系,可表示为a=90(t-0.5),a表示舵机转动角度,t为脉冲宽度,0.5≤t≤2.5。
3.2 舵机控制信号5路PWM的实现
单片机外部时钟为 11.059 2 MH,定时器0初始化为使用外部时钟8分频,8位自动重装,并使能。配置TL0=0x94;TH0=0x94;对应周期为 20 ms。配置交叉开关将单片机自带的5路PWM分别对应单片机的P12—P16管脚。PCA初始化函数可配置如下。
void PCA_Init()
{
PCA0CN=0x40;//使能PCA
PCA0MD&=~0x40;//禁止看门狗定时器
PCA0MD=0x04;//PCA时钟使用定时器0溢出,周期 20 ms。
PCA0CPM0=0x42;//选择8位脉宽调制模式,并使能。
PCA0CPM1=0x42;PCA0CPM2=0x42;
PCA0CPM3=0x42;PCA0CPM4=0x42;
PCA0CPH0=0xEC;//配置占空比使脉冲宽度位 1.5 ms,对应舵机默认角度为90°
PCA0CPH1=0xEC;PCA0CPH2=0xEC;
PCA0CPH3=0xEC;PCA0CPH4=0xEC;
}
PCA设置为8位脉宽调制时,占空比的计算公式为:dutycycle=[(256-PCA0CPHn)]/256
舵机0~180°(0.5~2.5ms)对应 20 ms 周期的占空比为2.5%~12.5%,对应的PCA0CPHn取值范围为249~224,可以计算出若采用上述PCA配置的舵机角度控制精度约为7°。程序可以通过改变设置PCA时钟或者使用16位脉宽调制来提高对舵机的控制精度。
舵机控制信号的周期为 20 ms,而高电平的时间最多使用到 2.5 ms,则可以通过分时复用的方式,在PWM中断服务函数中循环设定PWM的PCA0CPHn寄存器值,配合外部分离电路,即可将1路PWM分离出8路PWM信号[14],单片机自带的PWM模块越多,可扩展的PWM信号也越多,但是需要PWM信号分离硬件电路,对信号进行分离。
3.3 74HC595扩展8路模拟PWM的实现
74HC595是一种带锁存功能的8位串入、并出移位寄存器,常用于扩展单片机的I/O口,节约单片机端口资源[15]。74HC595在每个CLK的上升沿,串行数据从SI输入移位寄存器,高位在前,低位在后。依次完成8位数据输入后,若/G为低电平输出使能,同时给RCK一个上升沿,数据就会进入锁存器从QA-QH输出。
通过单片机的P22、P23、P24、P25端口(图5,U4),配合单片机定时器2的定时中断服务来实现74HC595扩展8路模拟PWM信号的输出。定时器2开始计时前,74HC595的SI、CLK、RCK、/G均初始化为0。单片机系统时钟配置为外部时钟4倍频,定时器2时钟配置为使用系统时钟,定时器2配置为16位自动重装模式,定时周期为 100 μs,即每0.1 ms进1次中断服务函数。定时器2的定时中断服务函数如下:
count[14]={15,15,15,15,15,15,15,15,0xEC,0xEC,0xEC,0xEC,0xEC,50};//默认90°
void TIMER2_ISR(void)interrupt 5
{
Staticxdata unsigned char i=0,j,out=0xff,outbuf=0;
TF2H=0;//清中断标志位
i++;
for(j=0;j<8;j++)
{
if(i==count[j])out&=~(1< } if(i==200)//20ms时间到 { i=0;out=0xff; } if(outbuf!=out) { outbuf=out; for(j=8;j>0;j--) { if(outbuf&0x80)SI=1; else SI=0;//P25管脚 CLK=1;//P22管脚 CLK=0;//P22管脚 outbuf<<=1; } outbuf=out; RCK=1;//P23管脚 RCK=0;//P23管脚 } } 其中count[]数组前8个数据保存的是74HC595扩展接口舵机的脉冲宽度值,取值范围为5~25,对应脉冲宽度为0.5~2.5 ms。后5个数据保存的是5路PCA寄存器的设定值,最后一个数据保存的是蜂鸣器的鸣响频率。程序通过修改count[]数组的值来改变舵机的角度。因定时器2定时周期为 100 μs,步进值为 0.1 ms,可计算得出对舵机的控制精度为9°,程序可以缩小定时器的定时周期来提高舵机的控制精度,定时器的定时周期需要综合考虑程序运行时间即其他功能模块的优先级等来确定。 若将74HC595的输出使能端口/G始终接低电平,复位端/CLEAR始终接高电平,则1片74HC595只需单片机的3个管脚来控制,若将多片74HC595的串行数据输入端SI并联,移位时钟CLK也并联,只有锁存时钟RCK单独控制,则单片机的每8个端口可以通过6片74HC595扩展出48路模拟PWM信号控制舵机[16]。但是此种方式适用于对舵机进行分组控制,每组舵机的转动角度一致;若要实现对单个舵机的控制,软件算法相对复杂,程序效率低。 多路舵机控制器使用C8051F340单片机的UART1通过RS422总线与上位机通信。上位机通过直接发送舵机的编号(控制命令)和需要舵机转动的角度(控制数据)给控制器即可实现对舵机的单独控制,具体的协议帧格式如表1所示。 表1 接收和发送的帧格式Tab.1 Format of frames received and transmitted 例如要控制DJ3号舵机转动140°,上位机可以通过RS422总线发送数据帧:0x55 0xAA 0x91 0x03 0x8C 0x8E即可。 多路舵机控制器程序流程为:1)单片机上电后首先进行设备初始化,包括系统时钟、PCA、定时器、I/O口、AT24C01/SMBus、串口、中断使能及优先级、74HC595控制的初始化及RS422总线发送禁止等;2)通过读写一个字节数据来测试AT24C01工作是否正常,若不正常蜂鸣器报警等待处理;3)将最后一次保存在AT24C01中的舵机控制数据读回,恢复count数组的值,同时对PCA0CPH0寄存器进行赋值,以实现所有舵机恢复到掉电前的状态;4)判断上位机是否有协议帧到来;5)若接收到完整的协议帧,则解析控制命令,通过对应的控制数据控制对应舵机转动,返回到第4步循环。具体的主程序流程图如图7所示。 图7 主程序流程Fig.7 Main program flow chart 选用C8051F340单片机作为舵机控制器的主控芯片,芯片本身自带5路捕捉/比较模块及可编程计数器定时器阵列PCA,可以分别编程输出5路PWM波形控制5路舵机。再通过选用1片74HC595串入并出移位寄存器,能将C8051F340单片机的4个普通I/O口扩展为8个I/O口,可以模拟出8路PWM信号控制8路舵机,有效节约单片机宝贵的I/O口资源。控制器设计有RS422串行总线接口,能快速组网,配合上位机可实现多路舵机的网络控制。 实际测试让13路舵机循环转动,每次转动20°,2种控制模式控制的舵机均能正常转动,说明对舵机控制精度与设计的控制精度相符。程序可以通过降低定时器2定时周期,提高PCA时钟或者采用16位脉宽调制模式来提高对舵机的控制精度。另外值得注意的是,当多路舵机同时工作时,电源功率必须满足舵机的功率需求,否则舵机会出现抖动现象。本控制器的硬件设计能有效节约单片机I/O口资源用于更多传感器的接入、扩展CAN总线接口,USB接口以适应不同的总线接口需求。3.4 串口通信协议的设计
3.5 系统程序流程
4 结 语