脈衝計數可以利用51單片機的內部計數器來實現,但是從軟體系統的穩定性和程序結構的合理性看,宜使用外部的計數器,還可以提高CPU的工作效率。實驗後從精度上考慮,對於FUTABA系列的接收機,當採用1MHz的外部晶振時,其控制電壓幅值的變化為0.6mV,而且不會出現誤差積累,可以滿足控制舵機的要求。最後考慮數字系統的離散誤差,經估算誤差的範圍在±0.3%內,所以採用單片機和8253、8254這樣的計數器晶片的PWM信號產生電路是可靠的。圖3是硬體連接圖。
圖3 PWA信號的計數和輸出電路
基於8253產生PWM信號的程序主要包括三方面內容:一是定義8253寄存器的地址,二是控制字的寫入,三是數據的寫入。軟體流程如圖4所示,具體代碼如下。
//關鍵程序及注釋:
//定時器T0中斷,向8253發送控制字和數據
void T0Int() interrupt 1
{
TH0 = 0xB1;
TL0 = 0xE0; //20ms的時鐘基準
//先寫入控制字,再寫入計數值
SERVO0 = 0x30; //選擇計數器0,寫入控制字
PWM0 = BUF0L; //先寫低,後寫高
PWM0 = BUF0H;
SERVO1 = 0x70; //選擇計數器1,寫入控制字
PWM1 = BUF1L;
PWM1 = BUF1H;
SERVO2 = 0xB0; //選擇計數器2,寫入控制字
PWM2 = BUF2L;
PWM2 = BUF2H;
}
圖4 基於8253產生PWA信號的軟體流程
當系統的主要工作任務就是控制多舵機的工作,並且使用的舵機工作周期均為20ms時,要求硬體產生的多路PWM波的周期也相同。使用51單片機的內部定時器產生脈衝計數,一般工作正脈衝寬度小於周期的1/8,這樣可以在1個周期內分時啟動各路PWM波的上升沿,再利用定時器中斷T0確定各路PWM波的輸出寬度,定時器中斷T1控制20ms的基準時間。
第1次定時器中斷T0按20ms的 1/8設置初值,並設置輸出I/O口,第1次T0定時中斷響應後,將當前輸出I/O口對應的引腳輸出置高電平,設置該路輸出正脈衝寬度,並啟動第2次定時器中斷,輸出I/O口指向下一個輸出口。第2次定時器定時時間結束後,將當前輸出引腳置低電平,設置此中斷周期為20ms的1/8減去正脈衝的時間,此路PWM信號在該周期中輸出完畢,往復輸出。在每次循環的第16次(2×8=16)中斷實行關定時中斷T0的操作,最後就可以實現8路舵機控制信號的輸出。
也可以採用外部計數器進行多路舵機的控制,但是因為常見的8253、8254晶片都只有3個計數器,所以當系統需要產生多路PWM信號時,使用上述方法可以減少電路,降低成本,也可以達到較高的精度。調試時注意到由於程序中脈衝寬度的調整是靠調整定時器的初值,中斷程序也被分成了8個狀態周期,並且需要嚴格的周期循環,而且運行其他中斷程序代碼的時間需要嚴格把握。
在實際應用中,採用51單片機簡單方便地實現了舵機控制需要的PWM信號。對機器人舵機控制的測試表明,舵機控制系統工作穩定,PWM佔空比 (0.5~2.5ms 的正脈衝寬度)和舵機的轉角(-90°~90°)線性度較好。
參考文獻
1 胡漢才.單片機原理及接口技術。清華大學出版社.1996
2 王時勝,姜建平。採用單片機實現PWM式D/A轉換技術。電子質量.2004
3 劉歌群。盧京潮。閆建國。薛堯舜。用單片機產生7路舵機控制PWM波的方法。機械與電子.2004