0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

51單片機(jī)教程 使用PWM對(duì)舵機(jī)進(jìn)行控制

冬至子 ? 來(lái)源:ZYuanBlogs ? 作者:激沄RagingWaves ? 2023-11-01 10:52 ? 次閱讀

舵機(jī)的控制方式

舵機(jī)的種類有很多,下面我所展示的是非常常見(jiàn)的SG90舵機(jī)(下面簡(jiǎn)稱“舵機(jī)”),也是我們這次實(shí)驗(yàn)室考核所使用的舵機(jī)。

篇幅有限,這里只簡(jiǎn)單介紹了SG90舵機(jī),想深入研究的同學(xué)可以自己去查閱資料

我們先來(lái)了解一下SG90舵機(jī)

1.jpg

SG90舵機(jī)有三根線:GND、VCC和信號(hào)線:

圖片

GND(負(fù)極)和VCC(正極)都是電源線,可以接在開(kāi)發(fā)板相同標(biāo)識(shí)的排針或與開(kāi)發(fā)板相同的電源上,注意GND要與單片機(jī)共地(接在同一個(gè)負(fù)極上)。

信號(hào)線接在單片機(jī)的IO口上,我們使用IO口輸出PWM來(lái)控制舵機(jī)。

在對(duì)舵機(jī)進(jìn)行控制時(shí),像控制LED燈直接對(duì)信號(hào)線輸出1和0是不能夠正常控制的,要使用PWM進(jìn)行控制:

圖片

↑不正確的控制方法,可能是醬紫的

圖片

↑使用PWM控制,能隨意改變角度

那么下面我們進(jìn)入正題:使用PWM對(duì)舵機(jī)進(jìn)行控制。

舵機(jī)能在其旋轉(zhuǎn)范圍內(nèi)(0°~180°)旋轉(zhuǎn)至任意角度,但注意,這不是指能夠連續(xù)轉(zhuǎn)圈圈,而是像一把量角器,假設(shè)設(shè)置了30°,那么舵機(jī)就會(huì)旋轉(zhuǎn)至30°的位置并停下,而不是在原來(lái)的位置疊加上30°。

舵機(jī)的旋轉(zhuǎn)角度是通過(guò)PWM的占空比來(lái)調(diào)節(jié)的,PWM的周期一般為20ms,它們的關(guān)系如下表所示:

1.jpg

可以發(fā)現(xiàn),要舵機(jī)停在0°的位置并不能將IO口直接置0,180°也不能直接置1。

示例程序

舵機(jī)的控制程序其實(shí)和LED亮度調(diào)節(jié)、呼吸燈的程序基本一致,都是使用PWM控制,只不過(guò)占空比有范圍而已。

下面的程序是在我之前發(fā)的PWM的程序上稍作修改得到的,PWM部分就不再解釋了,只解釋舵機(jī)的控制部分。

#include < reg52.h >


#define PWM_T 200                     //產(chǎn)生中斷的時(shí)間,因?yàn)槭?4MHz,200即100微妙(0.1毫秒)


int PWM_count0 = 0;                    //進(jìn)入中斷的次數(shù)
int PWM_count1 = 0;                    //與上面的類似,用于計(jì)數(shù)
int PWM_F = 0;                        //一個(gè)用于計(jì)時(shí)的標(biāo)志,作用類似定時(shí)器TF0、TF1


sbit servo = P2^0;                    //舵機(jī)信號(hào)線所連接的IO口


void PWM_Start()                      //PWM初始化函數(shù),打開(kāi)了定時(shí)器0
{
  EA = 1;
  ET0 = 1;
  TMOD |= 0x01;
  TR0 = 1;


  TH0 = (65536-PWM_T)/256;
  TL0 = (65536-PWM_T)%256;
}


int PWM(int PWM_value)                //控制PWM輸出的子函數(shù)
{
  if(PWM_count0 <= PWM_value)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}


void main()
{
  PWM_Start();                        //PWM開(kāi)始運(yùn)行


  while(1)
  {
    while(1)
    {
      servo = PWM(5);                  //旋轉(zhuǎn)至0°
      if(PWM_F == 1)                  //判斷標(biāo)志是否為1,是則代表著過(guò)了1秒
      {
        PWM_F = 0;                    //將標(biāo)志歸零
        break;                        //過(guò)了1秒,退出循環(huán)
      }
    }


    while(1)
    {
      servo = PWM(10);                //旋轉(zhuǎn)至45°
      if(PWM_F == 1)
      {
        PWM_F = 0;
        break;
      }
    }


    while(1)
    {
      servo = PWM(15);                //旋轉(zhuǎn)至90°
      if(PWM_F == 1)
      {
        PWM_F = 0;
        break;
      }
    }


    while(1)
    {
      servo = PWM(20);                //旋轉(zhuǎn)至135°
      if(PWM_F == 1)
      {
        PWM_F = 0;
        break;
      }
    }


    while(1)
    {
      servo = PWM(25);                //旋轉(zhuǎn)至180°
      if(PWM_F == 1)
      {
        PWM_F = 0;
        break;
      }
    }
  }
}


void Timer0() interrupt 1
{
  TH0 = (65536-PWM_T)/256;
  TL0 = (65536-PWM_T)%256;


  PWM_count0++;


  if(PWM_count0 == 200)                //過(guò)了20ms,完成了一個(gè)PWM周期
  {
    PWM_count0 = 0;                    //清零,重新開(kāi)始計(jì)數(shù)
    PWM_count1++;
    if(PWM_count1 == 50)              //PWM_count0清零了50次,也就是說(shuō)過(guò)了20ms*50=1000ms=1s
    {
      PWM_count1 = 0;                  //清零,重新開(kāi)始計(jì)數(shù)
      PWM_F = 1;                      //標(biāo)志置1,說(shuō)明已經(jīng)過(guò)了2s
    }
  }
}

我在程序中并沒(méi)有使用軟件延時(shí)(delay()函數(shù)),這在PWM那篇文章中也說(shuō)過(guò)了,軟件延時(shí)期間無(wú)法改變IO口的高低電平輸出,PWM也就失效了。

我的做法是設(shè)置一個(gè)標(biāo)志PWM_F(也可以直接判斷PWM_count1的值),當(dāng)達(dá)到設(shè)定的時(shí)間就退出循環(huán),否則就回到循環(huán)進(jìn)行PWM輸出。

如果你覺(jué)得這樣做比較麻煩,也可以調(diào)用另一個(gè)定時(shí)器來(lái)計(jì)時(shí),不過(guò)定時(shí)器的數(shù)量是有限的(51只有兩個(gè),52、STC15F2K60S2有三個(gè))。

在寫(xiě)PWM的程序時(shí),可以參考我上面的做法,每0.1ms進(jìn)入一次中斷,進(jìn)入200次(20ms)就完成一次PWM中斷,對(duì)應(yīng)著舵機(jī)所要求的PWM周期長(zhǎng)度,控制起來(lái)也會(huì)方便很多。

另外,頭文件建議使用與單片機(jī)型號(hào)所匹配的,上面例程中包含reg52.h是為了有較高的兼容性,但這樣就有一些資源無(wú)法調(diào)用。例如STC15F2K60S2,P4引腳(如P47)只有在包含STC15F2K60S2.h時(shí)才能被調(diào)用。

假如你的舵機(jī)不能正常運(yùn)行,可能是下面的原因:

1.單片機(jī)晶振或定時(shí)器沒(méi)有設(shè)置正確,例如上面例程對(duì)應(yīng)的是24MHz的頻率,下載時(shí)選擇了默認(rèn)的11.0592MHz;
2.電源供電不足,可以使用充電寶供電試試。

總結(jié)

學(xué)會(huì)PWM后,舵機(jī)的控制其實(shí)非常容易,稍作一下改動(dòng)就行。對(duì)舵機(jī)感興趣的同學(xué)可以去了解一下其他類型的舵機(jī),使用PWM控制的只是其中一種。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 51單片機(jī)
    +關(guān)注

    關(guān)注

    274

    文章

    5704

    瀏覽量

    123745
  • PWM控制
    +關(guān)注

    關(guān)注

    7

    文章

    194

    瀏覽量

    26316
  • 舵機(jī)
    +關(guān)注

    關(guān)注

    17

    文章

    270

    瀏覽量

    41076
  • GND
    GND
    +關(guān)注

    關(guān)注

    2

    文章

    539

    瀏覽量

    38766
  • SG90
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    11517
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文解析51單片機(jī)PWM舵機(jī)控制(附程序)

    本文主要介紹的是51單片機(jī)PWM舵機(jī)控制,具體的跟隨小編來(lái)了解一下。
    發(fā)表于 04-18 14:18 ?2.6w次閱讀

    51單片機(jī)控制舵機(jī)程序

    51單片機(jī)控制舵機(jī)程序,希望對(duì)你有幫助,謝謝頂一下
    發(fā)表于 11-02 17:35 ?102次下載

    51單片機(jī)控制舵機(jī)

    利用簡(jiǎn)單的51單片機(jī)PWM的脈沖控制信號(hào)來(lái)很方便的控制機(jī)
    發(fā)表于 11-10 15:25 ?103次下載

    單片機(jī)產(chǎn)生7路舵機(jī)控制PWM波的方法

    單片機(jī)產(chǎn)生7路舵機(jī)控制PWM波的方法。
    發(fā)表于 03-21 15:33 ?25次下載

    單片機(jī)實(shí)現(xiàn)舵機(jī)轉(zhuǎn)角控制

    單片機(jī)實(shí)現(xiàn)舵機(jī)轉(zhuǎn)角控制單片機(jī)實(shí)現(xiàn)舵機(jī)轉(zhuǎn)角控制單片機(jī)實(shí)現(xiàn)舵機(jī)轉(zhuǎn)角
    發(fā)表于 04-28 14:57 ?24次下載

    51單片機(jī)控制舵機(jī)程序

    僅提供參考 51單片機(jī)控制機(jī)器人數(shù)字舵機(jī)的示例程序。程序比較簡(jiǎn)單,但演示了控制的方法。作為入門(mén)級(jí)的學(xué)習(xí),還是可以參考的。
    發(fā)表于 06-23 18:14 ?171次下載

    使用51單片機(jī)進(jìn)行舵機(jī)控制實(shí)驗(yàn)的手冊(cè)資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用51單片機(jī)進(jìn)行舵機(jī)控制實(shí)驗(yàn)的手冊(cè)資料免費(fèi)下載。
    發(fā)表于 04-02 08:00 ?27次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>進(jìn)行</b><b class='flag-5'>舵機(jī)</b><b class='flag-5'>控制</b>實(shí)驗(yàn)的手冊(cè)資料免費(fèi)下載

    使用51單片機(jī)控制舵機(jī)的電路圖和程序免費(fèi)下載

    這里用到PCF8591 ADDA芯片 和51單片機(jī)機(jī),和一個(gè)電位器。通過(guò) 控制 電位器,產(chǎn)生PWM波,
    發(fā)表于 09-25 17:17 ?28次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>控制</b><b class='flag-5'>舵機(jī)</b>的電路圖和程序免費(fèi)下載

    使用51單片機(jī)PWM舵機(jī)控制的詳細(xì)資料和程序概述

    為什么要寫(xiě)這篇博客、因?yàn)槲以谡{(diào)我的51單片機(jī)wifi小車的雙舵機(jī)攝像頭的時(shí)候。從一開(kāi)始對(duì)PWM很陌生到完全理解 PWM調(diào)節(jié)并調(diào)好了兩個(gè)
    發(fā)表于 08-27 17:29 ?14次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>PWM</b>雙<b class='flag-5'>舵機(jī)</b><b class='flag-5'>控制</b>的詳細(xì)資料和程序概述

    使用51單片機(jī)進(jìn)行藍(lán)牙舵機(jī)控制超聲波測(cè)距模塊的開(kāi)發(fā)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用51單片機(jī)進(jìn)行藍(lán)牙舵機(jī)控制超聲波測(cè)距模塊的開(kāi)發(fā)資料說(shuō)明。
    發(fā)表于 07-02 17:42 ?13次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>進(jìn)行</b>藍(lán)牙<b class='flag-5'>舵機(jī)</b><b class='flag-5'>控制</b>超聲波測(cè)距模塊的開(kāi)發(fā)資料說(shuō)明

    如何使用51單片機(jī)按鍵控制舵機(jī)旋轉(zhuǎn)

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用51單片機(jī)按鍵控制舵機(jī)旋轉(zhuǎn)主要內(nèi)容包括了:1.舵機(jī)的與單片機(jī)
    發(fā)表于 06-18 17:44 ?23次下載
    如何使用<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>按鍵<b class='flag-5'>控制</b><b class='flag-5'>舵機(jī)</b>旋轉(zhuǎn)

    基于51單片機(jī)舵機(jī)控制器設(shè)計(jì)

    進(jìn)行了大幅度的升級(jí),用52單片機(jī)定時(shí)器0輸出兩路PWM波來(lái)控制兩個(gè)自由度的舵機(jī),用定時(shí)器1組成波特率發(fā)生器
    的頭像 發(fā)表于 11-19 09:35 ?7214次閱讀

    51單片機(jī)舵機(jī)控制

    51單片機(jī)舵機(jī)控制系統(tǒng)概述硬件設(shè)計(jì)程序設(shè)計(jì)概述在這篇博客中,將介紹一個(gè)基于51單片機(jī)
    發(fā)表于 11-05 11:06 ?21次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>舵機(jī)</b><b class='flag-5'>控制</b>

    最簡(jiǎn)單DIY基于51單片機(jī)舵機(jī)控制

    基于51單片機(jī)舵機(jī)控制器文章目錄51單片機(jī)物聯(lián)網(wǎng)智能小車系列文章目錄前言一、最簡(jiǎn)單DIY基于
    發(fā)表于 11-20 18:36 ?22次下載
    最簡(jiǎn)單DIY基于<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>舵機(jī)</b><b class='flag-5'>控制</b>器

    51單片機(jī)-步進(jìn)電機(jī)-舵機(jī)

    51單片機(jī)-步進(jìn)電機(jī)-舵機(jī)
    發(fā)表于 11-23 17:06 ?23次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>-步進(jìn)電機(jī)-<b class='flag-5'>舵機(jī)</b>