鐘志賢,丁 瑜,吳世立,郭宇豐
(1.昆明冶金高等專科學(xué)校 a.網(wǎng)絡(luò)管理與信息中心;b.組織部;c.建筑工程學(xué)院,云南 昆明 650033;2.云南碧桂園房地產(chǎn)開(kāi)發(fā)有限公司,云南 昆明 650225)
舵機(jī)作為一種位置、角度伺服的驅(qū)動(dòng)器,常常被用于機(jī)器人、無(wú)人機(jī)等各種控制系統(tǒng)中[1-2]。因控制轉(zhuǎn)動(dòng)的執(zhí)行機(jī)構(gòu)往往需要多個(gè)舵機(jī)配合完成,故對(duì)舵機(jī)實(shí)現(xiàn)多路集中控制的需求較為廣泛。要實(shí)現(xiàn)對(duì)舵機(jī)的多路控制可采用基于CPLD、FPGA、DSP、單片機(jī)等產(chǎn)生多路PWM信號(hào)進(jìn)行控制[3-10]。CPLD、FPGA的特點(diǎn)是電路可定制,可實(shí)現(xiàn)大規(guī)模的舵機(jī)控制,但是開(kāi)發(fā)門檻高、成本高。單片機(jī)的特點(diǎn)是通用性強(qiáng),開(kāi)發(fā)使用簡(jiǎn)單方便,但只適用于控制舵機(jī)數(shù)量較少的場(chǎng)合。
綜合考慮成本和性能,本文給出了一種基于C8051F340單片機(jī)配合74HC595移位寄存器擴(kuò)展的13路舵機(jī)控制器的硬件設(shè)計(jì)方案及軟件實(shí)現(xiàn)方法。
多路舵機(jī)控制器采用模塊式的開(kāi)發(fā)思想,設(shè)計(jì)有RS422總線接口以便控制器集成到其它控制系統(tǒng)中,作為一個(gè)單獨(dú)的控制模塊使用。設(shè)計(jì)原理如圖1所示。
圖1 多路舵機(jī)網(wǎng)絡(luò)控制器系統(tǒng)設(shè)計(jì)原理Fig.1 Design principle diagram of multi-channel steering gear network controller system
多路舵機(jī)控制器硬件主要是以C8051F340單片機(jī)為核心,包括RS422串行總線接口及電平轉(zhuǎn)換電路、電源電路、AT24C01存儲(chǔ)電路、JTAG與復(fù)位電路、74HC595擴(kuò)展電路、LED及蜂鳴器驅(qū)動(dòng)電路、多路舵機(jī)接口電路等??刂破髟O(shè)計(jì)有兩線式串行總線電可擦只讀存儲(chǔ)器AT24C01,用于保存上位機(jī)發(fā)來(lái)的舵機(jī)角度控制數(shù)據(jù),以實(shí)現(xiàn)模塊斷電復(fù)位后,快速恢復(fù)最近一次舵機(jī)的控制角度。多路舵機(jī)控制器的系統(tǒng)結(jié)構(gòu)示意圖如圖2所示。
圖2 多路舵機(jī)控制器系統(tǒng)結(jié)構(gòu)示意Fig.2 Structrual diagram of multi-channel steering gear controller system
根據(jù)多路舵機(jī)控制器的功能需求,主控芯片采用C8051F340單片機(jī)。其為兼容8051微控制器內(nèi)核,可達(dá) 48 MIPS,具有 12 MHz 內(nèi)部振蕩器和4倍時(shí)鐘乘法器。工作電壓為2.70~5.25 V,64 kB 的片內(nèi)flash存儲(chǔ)器,4 352 B 的片內(nèi)RAM,4個(gè)通用16位定時(shí)器,5個(gè)捕捉/比較模塊及可編程計(jì)數(shù)器定時(shí)器陣列PCA。2個(gè)增強(qiáng)型UART,1個(gè)硬件實(shí)現(xiàn)的SMBus,1個(gè)USB控制器,10位ADC帶模擬多路器及多達(dá)40個(gè)I/O端口,能很好滿足控制器的功能擴(kuò)展需求。多路舵機(jī)控制器硬件單片機(jī)最小系統(tǒng)電路圖如圖3所示。
圖3 單片機(jī)最小系統(tǒng)電路Fig.3 Minimum system circuit of single chip microcomputer
多路舵機(jī)控制器控制部分電源通過(guò)RS422總線接口(圖4,J1所示)從上位機(jī)處獲取,網(wǎng)絡(luò)標(biāo)號(hào)為VIN,GND,電壓為 5 V,VIN經(jīng)電壓轉(zhuǎn)換芯片HT7533將電壓轉(zhuǎn)為 3.3 V 供單片機(jī)及其他芯片使用,網(wǎng)絡(luò)標(biāo)號(hào)為 3.3 V。為同時(shí)滿足多路舵機(jī)控制的功率需求,以及避免舵機(jī)抖動(dòng)對(duì)控制部分電源的干擾,舵機(jī)的供電電源單獨(dú)設(shè)計(jì),圖4中J3接口為舵機(jī)電源輸入接口,網(wǎng)絡(luò)標(biāo)號(hào)為+5 V、0 V。圖4中J2為2種電源地線短接接口。
圖4 RS422電平轉(zhuǎn)換與電源電路Fig.4 RS422 level conversion and power supply circuit
多路舵機(jī)控制器采用了抗干擾強(qiáng)且差模傳輸、全雙工、傳輸距離遠(yuǎn)的點(diǎn)對(duì)多點(diǎn)的RS422串行總線[11],電平轉(zhuǎn)換芯片采用MAX3491(圖4,U3),工作電壓為 3.3 V,長(zhǎng)距離傳輸時(shí)需要使用終端電阻(圖4,R6、R7)阻值約等于傳輸電纜的特性阻抗。POWER_LED為電源指示燈。
多路舵機(jī)控制器還設(shè)置有1個(gè)蜂鳴器、1個(gè)工作指示燈,以方便程序調(diào)試,指示工作狀態(tài)及進(jìn)行相關(guān)報(bào)警。存儲(chǔ)模塊采用AT24C01(圖5,U5),通過(guò)SMBus總線與單片機(jī)的P10、P11管腳相連,具有 1 kB 的存儲(chǔ)空間,用來(lái)存儲(chǔ)各舵機(jī)的動(dòng)作數(shù)據(jù)。WORK_LED為控制器工作指示燈。
圖5 存儲(chǔ)模塊、LED及蜂鳴器驅(qū)動(dòng)電路Fig.5 Memory module,LED and buzzer driver circuit
舵機(jī)有3條接線,分別為電源線、地線、控制信號(hào)線。多路舵機(jī)控制器設(shè)計(jì)了13路舵機(jī)接口,由5個(gè)單片機(jī)自帶的PWM(圖6,PWM1—PWM5)、8個(gè)74HC595擴(kuò)展的舵機(jī)接口(圖6,DJ1—DJ8)組成。1片74HC595芯片可以將單片機(jī)的4個(gè)端口擴(kuò)展為8個(gè),若通過(guò)多片進(jìn)行級(jí)聯(lián),更能有效節(jié)約單片機(jī)的I/O口資源。74HC595驅(qū)動(dòng)及舵機(jī)接口電路如圖6所示。
圖6 74HC595驅(qū)動(dòng)及舵機(jī)接口電路Fig.6 74HC595 drive and steering gear interface circuit
舵機(jī)的控制信號(hào)為周期 20 ms,頻率 50 Hz 的PWM信號(hào)[12-13],通過(guò)改變脈沖寬度控制舵機(jī)進(jìn)行角度轉(zhuǎn)動(dòng),0.5~2.5 ms 的脈沖寬度對(duì)應(yīng)舵機(jī)轉(zhuǎn)動(dòng)角度為0~180°,且角度與脈沖的寬度成線性關(guān)系,可表示為a=90(t-0.5),a表示舵機(jī)轉(zhuǎn)動(dòng)角度,t為脈沖寬度,0.5≤t≤2.5。
單片機(jī)外部時(shí)鐘為 11.059 2 MH,定時(shí)器0初始化為使用外部時(shí)鐘8分頻,8位自動(dòng)重裝,并使能。配置TL0=0x94;TH0=0x94;對(duì)應(yīng)周期為 20 ms。配置交叉開(kāi)關(guān)將單片機(jī)自帶的5路PWM分別對(duì)應(yīng)單片機(jī)的P12—P16管腳。PCA初始化函數(shù)可配置如下。
void PCA_Init()
{
PCA0CN=0x40;//使能PCA
PCA0MD&=~0x40;//禁止看門狗定時(shí)器
PCA0MD=0x04;//PCA時(shí)鐘使用定時(shí)器0溢出,周期 20 ms。
PCA0CPM0=0x42;//選擇8位脈寬調(diào)制模式,并使能。
PCA0CPM1=0x42;PCA0CPM2=0x42;
PCA0CPM3=0x42;PCA0CPM4=0x42;
PCA0CPH0=0xEC;//配置占空比使脈沖寬度位 1.5 ms,對(duì)應(yīng)舵機(jī)默認(rèn)角度為90°
PCA0CPH1=0xEC;PCA0CPH2=0xEC;
PCA0CPH3=0xEC;PCA0CPH4=0xEC;
}
PCA設(shè)置為8位脈寬調(diào)制時(shí),占空比的計(jì)算公式為:dutycycle=[(256-PCA0CPHn)]/256
舵機(jī)0~180°(0.5~2.5ms)對(duì)應(yīng) 20 ms 周期的占空比為2.5%~12.5%,對(duì)應(yīng)的PCA0CPHn取值范圍為249~224,可以計(jì)算出若采用上述PCA配置的舵機(jī)角度控制精度約為7°。程序可以通過(guò)改變?cè)O(shè)置PCA時(shí)鐘或者使用16位脈寬調(diào)制來(lái)提高對(duì)舵機(jī)的控制精度。
舵機(jī)控制信號(hào)的周期為 20 ms,而高電平的時(shí)間最多使用到 2.5 ms,則可以通過(guò)分時(shí)復(fù)用的方式,在PWM中斷服務(wù)函數(shù)中循環(huán)設(shè)定PWM的PCA0CPHn寄存器值,配合外部分離電路,即可將1路PWM分離出8路PWM信號(hào)[14],單片機(jī)自帶的PWM模塊越多,可擴(kuò)展的PWM信號(hào)也越多,但是需要PWM信號(hào)分離硬件電路,對(duì)信號(hào)進(jìn)行分離。
74HC595是一種帶鎖存功能的8位串入、并出移位寄存器,常用于擴(kuò)展單片機(jī)的I/O口,節(jié)約單片機(jī)端口資源[15]。74HC595在每個(gè)CLK的上升沿,串行數(shù)據(jù)從SI輸入移位寄存器,高位在前,低位在后。依次完成8位數(shù)據(jù)輸入后,若/G為低電平輸出使能,同時(shí)給RCK一個(gè)上升沿,數(shù)據(jù)就會(huì)進(jìn)入鎖存器從QA-QH輸出。
通過(guò)單片機(jī)的P22、P23、P24、P25端口(圖5,U4),配合單片機(jī)定時(shí)器2的定時(shí)中斷服務(wù)來(lái)實(shí)現(xiàn)74HC595擴(kuò)展8路模擬PWM信號(hào)的輸出。定時(shí)器2開(kāi)始計(jì)時(shí)前,74HC595的SI、CLK、RCK、/G均初始化為0。單片機(jī)系統(tǒng)時(shí)鐘配置為外部時(shí)鐘4倍頻,定時(shí)器2時(shí)鐘配置為使用系統(tǒng)時(shí)鐘,定時(shí)器2配置為16位自動(dòng)重裝模式,定時(shí)周期為 100 μs,即每0.1 ms進(jìn)1次中斷服務(wù)函數(shù)。定時(shí)器2的定時(shí)中斷服務(wù)函數(shù)如下:
count[14]={15,15,15,15,15,15,15,15,0xEC,0xEC,0xEC,0xEC,0xEC,50};//默認(rèn)90°
void TIMER2_ISR(void)interrupt 5
{
Staticxdata unsigned char i=0,j,out=0xff,outbuf=0;
TF2H=0;//清中斷標(biāo)志位
i++;
for(j=0;j<8;j++)
{
if(i==count[j])out&=~(1< } if(i==200)//20ms時(shí)間到 { 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[]數(shù)組前8個(gè)數(shù)據(jù)保存的是74HC595擴(kuò)展接口舵機(jī)的脈沖寬度值,取值范圍為5~25,對(duì)應(yīng)脈沖寬度為0.5~2.5 ms。后5個(gè)數(shù)據(jù)保存的是5路PCA寄存器的設(shè)定值,最后一個(gè)數(shù)據(jù)保存的是蜂鳴器的鳴響頻率。程序通過(guò)修改count[]數(shù)組的值來(lái)改變舵機(jī)的角度。因定時(shí)器2定時(shí)周期為 100 μs,步進(jìn)值為 0.1 ms,可計(jì)算得出對(duì)舵機(jī)的控制精度為9°,程序可以縮小定時(shí)器的定時(shí)周期來(lái)提高舵機(jī)的控制精度,定時(shí)器的定時(shí)周期需要綜合考慮程序運(yùn)行時(shí)間即其他功能模塊的優(yōu)先級(jí)等來(lái)確定。 若將74HC595的輸出使能端口/G始終接低電平,復(fù)位端/CLEAR始終接高電平,則1片74HC595只需單片機(jī)的3個(gè)管腳來(lái)控制,若將多片74HC595的串行數(shù)據(jù)輸入端SI并聯(lián),移位時(shí)鐘CLK也并聯(lián),只有鎖存時(shí)鐘RCK單獨(dú)控制,則單片機(jī)的每8個(gè)端口可以通過(guò)6片74HC595擴(kuò)展出48路模擬PWM信號(hào)控制舵機(jī)[16]。但是此種方式適用于對(duì)舵機(jī)進(jìn)行分組控制,每組舵機(jī)的轉(zhuǎn)動(dòng)角度一致;若要實(shí)現(xiàn)對(duì)單個(gè)舵機(jī)的控制,軟件算法相對(duì)復(fù)雜,程序效率低。 多路舵機(jī)控制器使用C8051F340單片機(jī)的UART1通過(guò)RS422總線與上位機(jī)通信。上位機(jī)通過(guò)直接發(fā)送舵機(jī)的編號(hào)(控制命令)和需要舵機(jī)轉(zhuǎn)動(dòng)的角度(控制數(shù)據(jù))給控制器即可實(shí)現(xiàn)對(duì)舵機(jī)的單獨(dú)控制,具體的協(xié)議幀格式如表1所示。 表1 接收和發(fā)送的幀格式Tab.1 Format of frames received and transmitted 例如要控制DJ3號(hào)舵機(jī)轉(zhuǎn)動(dòng)140°,上位機(jī)可以通過(guò)RS422總線發(fā)送數(shù)據(jù)幀:0x55 0xAA 0x91 0x03 0x8C 0x8E即可。 多路舵機(jī)控制器程序流程為:1)單片機(jī)上電后首先進(jìn)行設(shè)備初始化,包括系統(tǒng)時(shí)鐘、PCA、定時(shí)器、I/O口、AT24C01/SMBus、串口、中斷使能及優(yōu)先級(jí)、74HC595控制的初始化及RS422總線發(fā)送禁止等;2)通過(guò)讀寫一個(gè)字節(jié)數(shù)據(jù)來(lái)測(cè)試AT24C01工作是否正常,若不正常蜂鳴器報(bào)警等待處理;3)將最后一次保存在AT24C01中的舵機(jī)控制數(shù)據(jù)讀回,恢復(fù)count數(shù)組的值,同時(shí)對(duì)PCA0CPH0寄存器進(jìn)行賦值,以實(shí)現(xiàn)所有舵機(jī)恢復(fù)到掉電前的狀態(tài);4)判斷上位機(jī)是否有協(xié)議幀到來(lái);5)若接收到完整的協(xié)議幀,則解析控制命令,通過(guò)對(duì)應(yīng)的控制數(shù)據(jù)控制對(duì)應(yīng)舵機(jī)轉(zhuǎn)動(dòng),返回到第4步循環(huán)。具體的主程序流程圖如圖7所示。 圖7 主程序流程Fig.7 Main program flow chart 選用C8051F340單片機(jī)作為舵機(jī)控制器的主控芯片,芯片本身自帶5路捕捉/比較模塊及可編程計(jì)數(shù)器定時(shí)器陣列PCA,可以分別編程輸出5路PWM波形控制5路舵機(jī)。再通過(guò)選用1片74HC595串入并出移位寄存器,能將C8051F340單片機(jī)的4個(gè)普通I/O口擴(kuò)展為8個(gè)I/O口,可以模擬出8路PWM信號(hào)控制8路舵機(jī),有效節(jié)約單片機(jī)寶貴的I/O口資源??刂破髟O(shè)計(jì)有RS422串行總線接口,能快速組網(wǎng),配合上位機(jī)可實(shí)現(xiàn)多路舵機(jī)的網(wǎng)絡(luò)控制。 實(shí)際測(cè)試讓13路舵機(jī)循環(huán)轉(zhuǎn)動(dòng),每次轉(zhuǎn)動(dòng)20°,2種控制模式控制的舵機(jī)均能正常轉(zhuǎn)動(dòng),說(shuō)明對(duì)舵機(jī)控制精度與設(shè)計(jì)的控制精度相符。程序可以通過(guò)降低定時(shí)器2定時(shí)周期,提高PCA時(shí)鐘或者采用16位脈寬調(diào)制模式來(lái)提高對(duì)舵機(jī)的控制精度。另外值得注意的是,當(dāng)多路舵機(jī)同時(shí)工作時(shí),電源功率必須滿足舵機(jī)的功率需求,否則舵機(jī)會(huì)出現(xiàn)抖動(dòng)現(xiàn)象。本控制器的硬件設(shè)計(jì)能有效節(jié)約單片機(jī)I/O口資源用于更多傳感器的接入、擴(kuò)展CAN總線接口,USB接口以適應(yīng)不同的總線接口需求。3.4 串口通信協(xié)議的設(shè)計(jì)
3.5 系統(tǒng)程序流程
4 結(jié) 語(yǔ)