atmega16應用之舵機控制
阿新 • • 發佈:2019-01-06
atmega16應用之舵機控制
舵機工作的原理
(不會看版)控制電路板接受來自訊號線的控制訊號,控制電機轉動,電機帶動一系列齒輪組,減速後傳動至輸出舵盤。舵機的輸出軸和位置反饋電位計是相連的,舵盤轉動的同時,帶動位置反饋電位計,電位計將輸出一個電壓訊號到控制電路板,進行反饋,然後控制電路板根據所在位置決定電機轉動的方向和速度,從而達到目標停止 。
(正經版)舵機的控制訊號週期為20MS的脈寬調製(PWM)訊號,其中脈衝寬度從0.5-2.5MS,相對應的舵盤位置為0-180度,呈線性變化。也就是說,給他提供一定的脈寬,它的輸出軸就會保持一定對應角度上,無論外界轉矩怎麼改變,直到給它提供一個另外寬度的脈衝訊號,它才會改變輸出角度到新的對應位置上如圖7所求。舵機內部有一個基準電路,產生週期為20MS,寬度1.5MS的基準訊號,有一個比出較器,將外加訊號與基準訊號相比較,判斷出方向和大小,從而生產電機的轉動訊號。
(懶人版) 舵機控制是不在乎PWM的週期的,只要你在一個時鐘週期裡輸出0.5ms~2.5ms的高電平,就能讓舵機旋轉-90到90度旋轉角度,就這麼簡單
在這裡插入圖片描述
程式碼
舵機控制程式碼非常簡單,就是定時器0的CTC模式,其實你也可以用快速P波模式和相位修正模式,只要滿足要求就行
void Serv(void) //控制舵機
{
DDRB |= (1 << 3); //引腳PB3
PORTB |= (1<< 3);
TCCR0 |= (1 << WGM01); TCCR0 |= (1 << WGM00);//快P
TCCR0 |= (1 << COM01); TCCR0 &= ~(1 << COM00);//比較匹配時清零,輸出P波
TCCR0 &= ~(1 << CS02); TCCR0 |= (1 << CS01); TCCR0 |= (1 << CS00);//內部時鐘1MHZ,64分頻
//OCR0 = 40; //16是最小值; //24是舵機中值;
OCR0=20; //輸出約1.5ms,旋轉90度
delay_ms(1000);
OCR0 = 36; //輸出約2.5ms,旋轉180度
delay_ms(500);
TCCR0 &= ~(1 << COM01); TCCR0 &= ~(1 << COM00);//將PB3設定為通用引腳,關舵機
//Counter_Time0();
}
這就是舵機控制的過程,有沒有覺得很簡單