- C51單片機應用與C語言程序設計
- 秦志強編著
- 1219字
- 2019-01-01 05:55:32
任務2 機器人伺服電機控制信號
圖2-4所示是高電平持續(xù)1.5ms,低電平持續(xù)20ms,然后不斷重復地控制脈沖序列。該脈沖序列發(fā)給經過零點標定后的伺服電機,伺服電機不會旋轉。如果此時電機旋轉,表明電機需要標定。從圖2-4、圖2-5和圖2-6可知,控制電機運轉速度的是高電平持續(xù)的時間,當高電平持續(xù)時間為1.3ms時,電機順時針全速旋轉,當高電平持續(xù)時間1.7ms時,電機逆時針全速旋轉。下面你將看到如何給單片機微控制器編程使P1端口的第一腳(P1_0)發(fā)出伺服電機的控制信號。

圖2-4 電機轉速為零的控制信號時序圖

圖2-5 1.3ms的控制脈沖序列使電機順時針全速旋轉

圖2-6 1.7ms的連續(xù)脈沖序列使電機逆時針全速旋轉
在進行下面的實驗之前,必須首先確認一下機器人兩個伺服電機的控制線是否已經正確地連接到C51單片機教學板的兩個專用電機控制接口上。按照圖2-7所示的電機連接原理圖和實際接線圖進行檢查。如果沒有正確連接,請參照該圖重新連接。從圖2-7可知,P1_0引腳的控制輸出用來控制右邊的伺服電機,而P1_1則用來控制左邊的伺服電機。

圖2-7 伺服電機與教學底板的連線原理圖(左)和實際接線示意圖(右)
微控制器編程發(fā)給伺服電機的高、低電平信號必須具備更精確的時間。因為單片機只有整數(shù),沒有小數(shù),所以要生成伺服電機的控制信號,要求具有比delay_nms( )時間更精確的函數(shù),這就需要用到另一個延時函數(shù)delay_nus(unsigned int n)。前面已經介紹過,這個函數(shù)可以實現(xiàn)更少的延時,它的延時單位是μs,即千分之一毫秒,參數(shù)n為延時微秒數(shù)。
看看下面的代碼片段:
while(1) { P1_0=1; //P1_0輸出高電平 delay_nus(1500); //延時1.5ms P1_0=0; //P1_0輸出低電平 delay_nus(20000); //延時20ms }
如果用這個代碼段代替例程HighLowLed.c中相應的程序片段,它是不是就會輸出如圖2-4所示的脈沖信號?肯定是!如果你手邊有示波器,可以用示波器觀察P1_0腳輸出的波形是不是如圖2-4所示。此時,連接到該腳的機器人輪子是不是靜止不動的?如果它在慢慢轉動,就說明你的機器人伺服電機可能沒有經過調整。
同樣,用下面的程序片段代替例程HighLowLed.c中相應的程序片段,編譯、連接下載執(zhí)行代碼,觀察連接到P1_0腳的機器人輪子是不是順時針全速旋轉。
while(1) { P1_0=1; //P1_0輸出高電平 delay_nus(1300); //延時1.3ms P1_0=0; //P1_0輸出低電平 delay_nus(20000); //延時20ms }
用下面的程序片段代替例程HighLowLed.c中相應的程序片段,編譯、連接下載執(zhí)行代碼,觀察連接到P1_0腳的機器人輪子是不是逆時針全速旋轉。
while(1) { P1_0=1; //P1_0輸出高電平 delay_nus(1700); //延時1.7ms P1_0=0; //P1_0輸出低電平 delay_nus(20000); //延時20ms }
該你了——讓機器人的兩個輪子全速旋轉
剛才是讓連接到P1_0腳的伺服電機輪子全速旋轉,下面你自己可以修改程序讓連接到P1_1腳的機器人輪子全速旋轉。
當然,最后需要修改程序,讓機器人的兩個輪子都能夠旋轉。讓機器人兩個輪子都順時針全速旋轉參考下面的程序。
例程:BothServoClockwise.c
● 接通板上的電源;
● 輸入、保存、下載并運行程序BothServoClockwsie.c(整個過程請參考第1講);
● 觀察機器人的運動行為。
#include<BoeBot.h> #include<uart.h> int main(void) { uart_Init(); //初始化串口 printf("The LEDs connected to P1_0 and P1_1 are blinking!\n"); while(1) { P1_0=1; //P1_0輸出高電平 P1_1=1; //P1_1輸出高電平 delay_nus(1300); //延時500ms P1_0=0; //P1_0輸出低電平 P1_1=0; //P1_1輸出低電平 delay_nms(20); //延時20ms } }
注意:上述程序用到了兩個不同的延時函數(shù),效果與前面例子一樣。運行上述程序時,你是不是對機器人的運動行為感到驚訝?