舵机工作原理及程序[通俗易懂]
生活随笔
收集整理的這篇文章主要介紹了
舵机工作原理及程序[通俗易懂]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
舵機可以實時控制角度,廣泛應用于航模、云臺等等需要控制角度的場合
舵機的工作原理:
由pwm波進入內部電路產生一個偏置電壓,觸發電機通過減速齒輪帶動電位器移動,使電壓差為零時,電機停轉,從而達到伺服的效果。
舵機PWM的協議都是相同的,但最新出現的舵機可能不一樣
協議一般為:
高電平寬度在0.5ms~2.5ms控制舵機轉過不同的角度
例如某一型號如下:
對于不同的型號可以查找相關的舵機文檔
分析:
在此以工作頻率為50HZ,即周期為20MS的futaba s3003舵機,和51單片機為主控芯片進行詳細程序編寫分析:
有上圖可知:不同寬度的脈沖可以產生不同的角度輸出,可以利用定時器和IO口模擬產生PWM波,通過定時控制占空比從而達到角度的控制,理論上計算51可以產生us級別的脈沖,180/2000us=0.09,可以達到0.1左右的精度(實際我也沒有試過)
代碼:
下面是我寫的以9°步進的程序,實際測試時只有16次為有效,估計是程序運行耗時造成的,因為我的定時器是以0.1ms溢出的。
#include <reg52.h>
unsigned char count; //0.5ms次數標識
sbit pwm =P1^0; //PWM信號輸出
sbit jia =P2^2; //角度增加按鍵檢測IO口
sbit jan =P2^1; //角度減少按鍵檢測IO口
unsigned char jd; //角度標識
void delay(unsigned char i)//延時
{
unsignedchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void Time0_Init() //定時器初始化
{
TMOD = 0x01; //定時器0工作在方式1
IE = 0x82;
TH0 = (65536-92)/256;
TL0 = (65536-92)%256; //11.0592MZ晶振,0.1ms
TR0=1; //定時器開始
}
void Time0_Int() interrupt 1 //中斷程序
{
TH0 = (65536-92)/256; //重新賦值
TL0 = (65536-92)%256;
if(count< jd) //判斷0.1ms次數是否小于角度標識
pwm=1; //確實小于,PWM輸出高電平
else
pwm=0; //大于則輸出低電平
count=(count+1); //0.1ms次數加1
count=count%200; //次數始終保持為200 即保持周期為20ms
}
void keyscan() //按鍵掃描
{
//P2=0;
if(jia==0) //角度增加按鍵是否按下
{
delay(10); //按下延時,消抖
if(jia==0) //確實按下
{
jd++; //角度標識加1
count=0; //按鍵按下 則20ms周期從新開始
if(jd==26)
jd=25; //已經是180度,則保持
while(jia==0); //等待按鍵放開
}
}
//P2=0;
if(jan==0) //角度減小按鍵是否按下
{
delay(10);
if(jan==0)
{
jd--; //角度標識減1
count=0;
if(jd==4)
jd=5; //已經是0度,則保持
while(jan==0);
}
}
//P0=0;
//jia=0;
//jan=0;
}
void main()
{
//jia=0;
//jan=0;
jd=13;
count=0;
Time0_Init();
while(1)
{
keyscan(); //按鍵掃描
}
}
總結
以上是生活随笔為你收集整理的舵机工作原理及程序[通俗易懂]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈谈新手如何学习PHP^_^【转】
- 下一篇: 实验:PIO外部中断