? ? ?現(xiàn)在常用的舵機控制信號主要有 PWM 信號和串口總線信號兩種:其中 PWM 信號控制比較簡單,但是 功能只有一個即控制舵機轉(zhuǎn)動; 串口總線信號控制則比較復(fù)雜,需要控制器有串口輸出功能,但是能實現(xiàn) 較多的功能,除了可以控制舵機轉(zhuǎn)動外還可以獲取舵機的各種信息以及對舵機進行各種設(shè)置,具體需要配 合相應(yīng)的協(xié)議文件使用。
以下描述怎么使用 PWM 信號控制舵機:
PWM 信號: 一種周期固定脈寬(高電平寬度)可變的連續(xù)電平信號。
PWM 信號產(chǎn)生方式有兩種:
第一種: 由 MCU 的普通 GPIO ?口輸出,分辨率較低, 程序比較復(fù)雜, 需要使用到定時器;
第二種:由 MCU 的硬件 PWM 輸出,分辨率較高,可以達到 1us或更小,程序比較簡單,須要 MCU 具備硬件 PWM 功能;
在舵機控制中的 PWM 信號的參數(shù)一般為:周期=20ms,脈寬(高電平寬度)范圍=0.5ms~2.5ms。
舵機的轉(zhuǎn)動角度由脈寬決定,?例如某個舵機的總轉(zhuǎn)角為?180°,??PWM?脈寬范圍為?0.5ms~2.5ms?,那么?當舵機接收到不同的脈寬信號時轉(zhuǎn)到對應(yīng)的位置:
注:?信號脈寬和舵機角度是成線性關(guān)系的。
信號脈寬 | 舵機角度 |
0.5ms | 0° |
1.0ms | 45° |
1.5ms | 90° |
2.0ms | 135° |
2.5ms | 180° |
控制舵機轉(zhuǎn)動效果:
1?、 舵機鎖舵:
當信號保持不變時,?舵機會保持在當前位置, 并且輸出的扭力會隨著負載大小不同而不同。
2?、 舵機快速轉(zhuǎn)動:
當信號改變時,?如信號從?1ms?變?yōu)?2ms,舵機會從?45°以最快速度轉(zhuǎn)到?135°位置,這個速度會根據(jù)?舵機的本身性能以及負載大小有關(guān),?一般會在規(guī)格書上標注有空載時的最大轉(zhuǎn)速。
3?、 舵機慢速轉(zhuǎn)動:
當需要讓舵機慢慢轉(zhuǎn)動時,如舵機從 45°轉(zhuǎn)到 135°位置需要耗時三秒,只需要計算出信號脈寬的變?化增量,在三秒的時間內(nèi)從?1ms?勻速增到?2ms?即可,增量越小則轉(zhuǎn)動的效果越細膩。
程序例子:
一、由?MCU?的普通?GPIO ?口輸出?PWM:
#include ?《reg51.h》
#define?uchar?unsigned char
#define?uint?unsigned?int
sbit?p10=P1^0;
uintaa;
void?delay??(uintz)
{
unsigned?intx?,a;
for(x=z;x>0;x--)
for(a=250;a>0;a--?);
}
void timer0()?interrupt?1 //定時器?1?為?0.1ms?一個周期, ?輸出?1.5ms?脈寬信號
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
aa++;
if(aa>=200)aa=0;
if(aa<=15) //產(chǎn)生周期為?20ms,高電平為?1.5ms,
p10=1;
else
p10=0;
}
void?init()
{
aa=0;
a=0;
p10=0;
TMOD=0x11;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
}
void main()
{
init() ;
TR0=1;
p10=1;
while(1)
{
}
}
二、由?MCU?的硬件?PWM 輸出?PWM?信號:
Step1、初始化 PWM 功能,配置 PWM 時鐘為 1us,周期為 20000,占空比為0,信號電平為高電平有效。
Step2、當需要改變信號時,只需要在占空比寄存器中寫入對應(yīng)的參數(shù)即可,如?0.5ms?則寫入?500,2.5ms?則寫入?2500.A