日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

舵机工作原理及程序[通俗易懂]

發布時間:2023/12/19 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 舵机工作原理及程序[通俗易懂] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

舵機可以實時控制角度,廣泛應用于航模、云臺等等需要控制角度的場合

舵機的工作原理:

由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();               //按鍵掃描

 

}

}

總結

以上是生活随笔為你收集整理的舵机工作原理及程序[通俗易懂]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。