久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 124020|回復: 240
打印 上一主題 下一主題
收起左側

淺談用單片機控制SG90舵機(原理+編程)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:194729 發表于 2019-4-16 11:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
此篇文章免費分享給大家,這篇文章結合筆者所學以及在往上參考大神的講解,通過自己的理解整理成文檔,在此免費分享給大家,由于筆者是一名在讀學生,文中難免有不當之處,如有錯誤,望大家指正!!!我會把源文檔和源程序放在附件中,有黑幣的直接下載,沒有的留下郵箱,看見回

SG90舵機(模擬舵機)
一、日常吐槽~~~~~~,在開始今天的主題之前,占用大家一些時間。容我罵街一番,$##%%%$%#$#$$%^艸……………….,哎呀媽呀,罵的有點喘不過來了,額~呸,是(文明人,文明人)
可能就奇了怪了,你不好好碼字,罵什么街呢!說來慚愧,上邊被罵的人就是筆者自己。今天在調試程序的時候,對,就這個鬼舵機,怎么都不轉!!!檢查硬件---檢查程序---百度,如此反復N小時。始終找不到問題所在,程序呢,怎么看,怎么硬件呢,怎么看,怎么!說是急,那是快,電閃雷鳴,刀光劍影,啪,一個數字1摔在臉上,于是乎,快速打開課本,啪~啪~啪,數字0、1,大腦瓜子一拍,哎呀,一定是這錯誤了!快速拿起閃閃發光的鼠標,熟練的打開Keil4,一段操作猛如虎,只聽見那~~~吱,舵機工作了~~~~
粗心大意定時器0對應的中端口----void Timer() interrupt 1
馬虎大意的我寫成了這樣:void Timer() interrupt 0.
家都走錯了,人家咋可能給你錢,大家一定要引以為戒,細心細心再細心
中斷號
中斷源
0
外部中斷0
1
定時器中斷0
2
外部中斷1
3
定時器中斷1
4
串行口中斷1
注意C語言用關鍵字“interrupt+數字”來代替匯編中中斷入口地址
——————————————————————————————————
以上非本次筆記重點,只是筆者一點小小的吐槽,外加一點小小的知識
——————————————————————————————————
二、主咖登場基本概念:1.舵機:舵機是一種位置(角度)伺服的驅動器,適用那些需要角度不斷變化并可以保持的控制系統。舵機只是一種通俗的叫法,其實質是一個伺服馬達

2.模擬舵機:需要不斷的發送目的地PWM信號,才能旋轉到指定位置。例如:我現在讓它旋轉90度,我就需要不斷的發送90度的PWM信號直到到達指定位置才能停止。

3.數字舵機:只需給一個目的地PWM信號,即可旋轉到指定位置。例如:我現在讓它旋轉90度,我只需要發送一次90度的PWM信號,它就可以旋轉到90度。

4.PWM信號:PWM(脈沖寬度調制)是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。那么什么叫PWM信號呢,筆者就簡單的談一下自己的看法,我們都知道,我們所使用的單片機都是數字電路,它的I/O口只有兩種狀態,那就是高電平1,低電平0知道了這些之后,我們通過控制微處理器輸出1-0-1-0-1-0-1-0……如此循環往復,就成為下圖1所示的情況,這就是PWM信號。

1.PWM信號
5.占空比高電平(或者低電平)占整個周期的時間就叫作占空比。

6.PWM頻率PWM頻率是指每秒鐘信號從高電平到低電平再到高電平的次數。
工作原理  理解以上的概念,對我們接下來的學習是非常有必要的,希望大家能好好掌握上面的概念。
我所使用的SG90舵機,如下圖2所示

2
接線方法
          紅-------------------------VCC
          棕色----------------------GND
          橙色----------------------信號線

原理:舵機內部有一個基準電壓,微處理器產生的PWM信號通過信號線進入舵機產生直流偏置電壓,與舵機內部的基準電壓作比較,獲得電壓差輸出。電壓差的正負輸出到電機驅動芯片上,從而決定正反轉。當舵機開始旋轉的時候,舵機內部通過級聯減速齒輪帶動電位器旋轉,使得電壓差為零,電機停止轉動。

重點:作為一個單片機編寫者,具體的原理,我們不必要搞清楚,我們只需知道如何控制它即可,以下將講解如何控制舵機運轉。

第一步:我們需要使用單片機產生周期為20ms,高電平t等于0.5ms-2.5ms之間的這樣一個方波。定時器+中斷產生這樣的方波。
高電平在一個周期20ms的持續時間對應的舵機角度,如下圖所示。
高電平t占整個周期T(20ms)的時間
舵機旋轉的角度
0.5ms
0度
1ms
45度
1.5ms
90度
2ms
135度
2.5ms
180度
第二步:簡單講一下編程思想吧,我所使用的是方法是定時器+中斷,定時器每0.5ms中斷一次,需要中斷40次才能達到20ms。我們此時需要一個全局變量來記錄中斷的次數,當中斷達到40次時,全局變量重新清零。當中斷次數小于a時,信號線輸出高電平,否則輸出零。此時a的值對應關系如下(1--0度,2--45度,3--90度,4--135度,5--180度)。
第三步:著重講程序中一個語句的含義

為什么此處要此處a==16,a==32,首先,這個值是我一步步測試出來的,如果你看見源程序的話,上面有詳細的介紹,此處不再贅述。
我們知道SG90是一個模擬舵機,需要不斷的給出信號才能到達指定的位置。到達這個位置并不是一蹴而就的,它需要時間,實際上面的a==16,相當于延時,這段時間剛好能夠讓舵機達到指定的位置,然后在接收下一個回擺程序。a==32,是因為我需要讓它來回擺動的時間對稱,所以才用a==32的。有興趣的可以改變a的值,觀察一下具體的情況。
程序此處都不貼出來,時間緊迫,我會放在附件中,有黑幣的直接下載,沒有的,留下郵箱

單片機源程序如下:
  1. #include<reg52.h>
  2. sbit SG_PWM=P0^0;
  3. unsigned char count=0;
  4. unsigned char PWM_count=3;                  //1--0度,2--45度,3--90度,4--135度,5--180度
  5. unsigned char a=0;
  6. void Timer_Init()
  7. {
  8.   TMOD=0X01;      //T0定時方式1
  9.   TH0=0Xfe;
  10.   TL0=0X33;       //計數初值設置為0.5ms
  11.   ET0=1;          //打開定時器0的中斷
  12.   TR0=1;          //打開定時器0
  13.   EA=1;           //開總中斷
  14. }
  15. void Timer() interrupt 1      //特別注意此處,0--外部中斷0,1--定時器中斷0,2--外部中斷1,3--定時器中斷1,4--串行口中斷1
  16. {
  17.   TR0=0;
  18.   TH0=0Xfe;
  19.   TL0=0X33;       //重新賦計數初值為0.5ms
  20.   if(count<=PWM_count)
  21.   {
  22.     SG_PWM=1;
  23.   }
  24.   else
  25.   {
  26.     SG_PWM=0;
  27.   }
  28.   count++;
  29.   if(count>=40)
  30.   {
  31.     count=0;
  32.     a++;
  33.   }
  34.   TR0=1;
  35. }
  36. void main()
  37. {
  38.   Timer_Init();
  39.   while(1)
  40.   {
  41.       if(a==16)                             //20是比較舒服的連貫動作,20以上動作些許不連貫  10的時候出現打架情況,15的時候打架幾乎沒有,16比較完美
  42.       {
  43.         PWM_count=1;
  44.       }
  45.       if(a==32)
  46.       {
  47.               PWM_count=3;
  48.         a=0;
  49.       }
  50.   }
  51. }
復制代碼


全部資料51hei下載地址:
SG90舵機--自動控制.7z (8.99 KB, 下載次數: 1154)
SG90舵機--按鍵控制.7z (9.62 KB, 下載次數: 928)
淺談SG90舵機.docx (139.68 KB, 下載次數: 464)


評分

參與人數 2黑幣 +112 收起 理由
wxxl + 12 很給力!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏75 分享淘帖 頂17 踩
回復

使用道具 舉報

來自 2#
ID:544869 發表于 2019-5-24 18:36 來自觸屏版 | 只看該作者
我只是過于低調 發表于 2019-5-24 09:30
看看定時器是否配置正確,示波器也就做實驗用過,我也不太懂!你們條件真好

我的示波器是玩具型的,80元左右(附圖),看I/O簡單的信號方便,缺點是會卡。P0^0取反有信號,只是t是低電平,T—t是高電平,舵機不認識,所以不動,和舵機反向器不一樣(附舵機反向器圖,和一角硬幣差不多大)。現在最希望舵機擺動能受控,想做個遙控的劃艇或是龍舟玩,遙控接收機輸出的信號和舵機一樣的,是t=1~2ms, T=20ms

IMG_20190524_152615.jpg (1.14 MB, 下載次數: 1250)

IMG_20190524_152615.jpg

IMG_20190524_152729.jpg (1.57 MB, 下載次數: 1216)

IMG_20190524_152729.jpg
回復

使用道具 舉報

來自 3#
ID:544869 發表于 2019-5-25 20:33 來自觸屏版 | 只看該作者
我只是過于低調 發表于 2019-5-25 14:33
不得不承認,你比我玩的好,我還是小菜雞一個呢

您太過謙啦!如果有笨笨比賽的話,我保證能拿金牌,比如高考英文最高一次是11分,所以學編程很難,學了十多年,一月前才入門,現在對中斷和計時程序任然看不懂,比如: if(count<=PWM_count)
  {
    SG_PWM=1;
  }
  else
  {
    SG_PWM=0;
  }
  count++;
  if(count>=40)
  {
    count=0;
    a++;
  }
  TR0=1;
}
這段程序,我只猜到40是20ms,其他的都不知道是啥意思。
另外,倒數第三句a==32;我改成a==a+a;為啥就報錯呢?請樓主指點,謝謝!
回復

使用道具 舉報

來自 4#
ID:194729 發表于 2019-5-26 11:27 | 只看該作者
小笨鳥O 發表于 2019-5-25 20:33
您太過謙啦!如果有笨笨比賽的話,我保證能拿金牌,比如高考英文最高一次是11分,所以學編程很難,學了十 ...

其實給你些建議吧:
1.英語和編程是兩回事,如果真的說他倆有點關系的話,那可能就是芯片手冊了吧
2.這個程序比較簡單,如果中間好多理解不了的話,建議去看下定時器,好好理解下
3.編程學了10多年?一個月前才入門,這個優點尷尬啊
4.C語言一定要有扎實的基礎
回復

使用道具 舉報

來自 5#
ID:544869 發表于 2019-5-27 16:30 | 只看該作者
我只是過于低調 發表于 2019-5-26 11:27
其實給你些建議吧:
1.英語和編程是兩回事,如果真的說他倆有點關系的話,那可能就是芯片手冊了吧
2.這 ...

聽您的建議,我把定時器有關的視頻教程又看了好幾遍,還是許多不懂。
說實話,我的這樣智商,學習十幾年能入門,會搞LED了,開心了好久呢!哈哈~
請問一下:學好51編程需要看那些書?以前看C語言書 發現和51聯系不大。
另外,如果寫一個受控的舵機程序,難度大啊?估計是目前這個程序的幾倍?謝謝!
我目前是用純硬件做一套可以遙控的舵機控制系統,非常麻煩,所以想用單片機來弄,
回復

使用道具 舉報

6#
ID:505058 發表于 2019-4-16 22:04 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

7#
ID:194729 發表于 2019-4-17 21:10 | 只看該作者

已經發送到你的郵箱
回復

使用道具 舉報

8#
ID:194729 發表于 2019-4-18 09:46 | 只看該作者

不客氣不客氣,共同學習
回復

使用道具 舉報

9#
ID:514746 發表于 2019-4-20 01:38 來自觸屏版 | 只看該作者
請問自動控制使用什么控制的?
回復

使用道具 舉報

10#
ID:515901 發表于 2019-4-20 10:00 | 只看該作者
感謝樓主
回復

使用道具 舉報

11#
ID:514110 發表于 2019-4-20 10:10 來自觸屏版 | 只看該作者
謝謝
回復

使用道具 舉報

12#
ID:194729 發表于 2019-4-20 14:56 | 只看該作者
Rainson 發表于 2019-4-20 01:38
請問自動控制使用什么控制的?

這個自動控制很簡單,就是我上邊講的a==16,這只不過是個延時,為了讓舵機達到指定位置,然后在返回另一個指定位置,從而實現自動控制
回復

使用道具 舉報

13#
ID:194729 發表于 2019-4-20 14:59 | 只看該作者

已發送
回復

使用道具 舉報

14#
ID:194729 發表于 2019-4-20 14:59 | 只看該作者

已發送
回復

使用道具 舉報

15#
ID:194729 發表于 2019-4-21 17:21 | 只看該作者
回復

使用道具 舉報

16#
ID:194729 發表于 2019-4-21 17:22 | 只看該作者
回復

使用道具 舉報

17#
ID:510674 發表于 2019-4-22 09:08 | 只看該作者
有電路圖?
回復

使用道具 舉報

18#
ID:194729 發表于 2019-4-22 09:42 | 只看該作者

這個很簡單的,就是隨手演示一下,沒有特意的去畫電路圖
回復

使用道具 舉報

19#
ID:260973 發表于 2019-4-22 13:05 | 只看該作者
772497644@qq.com  謝謝樓主
回復

使用道具 舉報

20#
ID:194729 發表于 2019-4-22 15:41 | 只看該作者

已發送,注意查收
回復

使用道具 舉報

21#
ID:194729 發表于 2019-4-26 00:00 | 只看該作者

已發送,注意查收
回復

使用道具 舉報

22#
ID:375715 發表于 2019-4-28 10:25 來自觸屏版 | 只看該作者
謝謝分享
回復

使用道具 舉報

23#
ID:194729 發表于 2019-4-28 12:43 | 只看該作者

已發送,注意查收
回復

使用道具 舉報

24#
ID:194729 發表于 2019-4-28 12:43 | 只看該作者

共同進步
回復

使用道具 舉報

25#
ID:507994 發表于 2019-4-29 09:08 | 只看該作者
請問轉180°應該怎么設置??
回復

使用道具 舉報

26#
ID:194729 發表于 2019-4-29 09:23 | 只看該作者
kkk11 發表于 2019-4-29 09:08
請問轉180°應該怎么設置??

高電平t占有周期的時間改為2.5ms,理論上可以轉到180°,但是不知道什么原因,我得舵機不能完全轉到180°
回復

使用道具 舉報

27#
ID:194729 發表于 2019-5-1 09:07 | 只看該作者

已發送
回復

使用道具 舉報

28#
ID:194729 發表于 2019-5-1 23:27 | 只看該作者
bazhahei 發表于 2019-5-1 09:38
2622869349@qq.com    謝謝樓主

已發送
回復

使用道具 舉報

29#
ID:194729 發表于 2019-5-1 23:28 | 只看該作者

已發送
回復

使用道具 舉報

30#
ID:525404 發表于 2019-5-2 23:20 | 只看該作者
樓主,要控制多個舵機應該怎么辦?我這樣改的程序但是這幾個舵機轉的角度都不一樣,有的轉角特別小
if(count<=PWM_count)
  {
    SG_PWM=1;
         SG_PWM2=1;
         SG_PWM3=1;
         SG_PWM4=1;
  }
  else
  {
    SG_PWM1=0;
         SG_PWM2=0;
         SG_PWM3=0;
         SG_PWM4=0;
  }
回復

使用道具 舉報

31#
ID:194729 發表于 2019-5-2 23:37 | 只看該作者

額  兄弟  別逗了,那么多黑豆,如果覺得能學到東西就下了吧。沒有的我可以幫忙下載
回復

使用道具 舉報

32#
ID:518022 發表于 2019-5-3 10:48 | 只看該作者
519902379@qq.com謝謝樓主
回復

使用道具 舉報

33#
ID:194729 發表于 2019-5-3 14:12 | 只看該作者
機械1111 發表于 2019-5-2 23:20
樓主,要控制多個舵機應該怎么辦?我這樣改的程序但是這幾個舵機轉的角度都不一樣,有的轉角特別小
if(co ...

你是想要所有的舵機轉一樣的角度嘛?
回復

使用道具 舉報

34#
ID:525404 發表于 2019-5-4 07:16 來自觸屏版 | 只看該作者
我只是過于低調 發表于 2019-5-3 14:12
你是想要所有的舵機轉一樣的角度嘛?

是的,我想讓它們同步地轉一樣的角度
回復

使用道具 舉報

35#
ID:525404 發表于 2019-5-4 09:28 來自觸屏版 | 只看該作者
機械1111 發表于 2019-5-4 07:16
是的,我想讓它們同步地轉一樣的角度

實際上我想做一個四足機器人,讓它們都同步轉一樣的角度只是先測試一下,最終想實現的是前兩個舵機同步前擺同時后兩個舵機同步向后擺。
回復

使用道具 舉報

36#
ID:526821 發表于 2019-5-4 10:31 | 只看該作者
回復

使用道具 舉報

37#
ID:194729 發表于 2019-5-4 16:00 | 只看該作者
機械1111 發表于 2019-5-4 09:28
實際上我想做一個四足機器人,讓它們都同步轉一樣的角度只是先測試一下,最終想實現的是前兩個舵機同步前 ...

具體情況我也不太清楚,你可以單個舵機調試,讓每個舵機都轉90°,之后在四個舵機一起調試。我懷疑是不是舵機初始位置不一樣,你可以試試
回復

使用道具 舉報

38#
ID:507994 發表于 2019-5-5 09:19 | 只看該作者
我只是過于低調 發表于 2019-4-29 09:23
高電平t占有周期的時間改為2.5ms,理論上可以轉到180°,但是不知道什么原因,我得舵機不能完全轉到180° ...

第一次做,不是很明白,請問要怎樣改?謝謝
回復

使用道具 舉報

39#
ID:531128 發表于 2019-5-8 22:54 | 只看該作者
544988232@qq.com    謝謝樓主
回復

使用道具 舉報

40#
ID:194729 發表于 2019-5-9 15:43 | 只看該作者
回復

使用道具 舉報

41#
ID:194729 發表于 2019-5-9 15:44 | 只看該作者

已發送
回復

使用道具 舉報

42#
ID:530474 發表于 2019-5-10 16:20 來自觸屏版 | 只看該作者
1135749091@qq.com謝謝樓主了啊 有急用
回復

使用道具 舉報

43#
ID:194729 發表于 2019-5-10 20:25 | 只看該作者
ZimmerHo 發表于 2019-5-10 16:20
1135749091@qq.com謝謝樓主了啊 有急用

已發送
回復

使用道具 舉報

44#
ID:530474 發表于 2019-5-10 21:52 來自觸屏版 | 只看該作者
1135749091@qq.com求發
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久久亚洲精品 | 隔壁老王国产在线精品 | 欧美精品三区 | 国产精品18久久久 | 亚洲视频免费在线播放 | 91免费在线| 日韩av免费在线观看 | 在线色 | 狠狠操狠狠干 | 91动漫在线观看 | 午夜影院 | 黄色成人免费看 | 欧美日韩免费 | 久久久久久亚洲 | 国产精品久久久久久中文字 | 免费性视频 | 国产免费av在线 | 国产一区二区三区四区五区加勒比 | 久热伊人| 亚洲毛片在线观看 | 日韩成人精品一区二区三区 | 亚洲在线一区二区 | 久久久久久久久国产 | 成人精品视频在线观看 | 欧美一区二区三区精品免费 | 欧美亚洲第一区 | 亚洲人在线 | 国产男女视频网站 | 国产一区二区精品在线 | 精品欧美黑人一区二区三区 | 精品在线一区 | 久久久久久久一区 | 午夜精品久久久久久久星辰影院 | 中文字幕精 | 欧美日韩中文国产一区发布 | 黄色亚洲 | 在线欧美一区二区 | 超碰在线网站 | 久久另类 | 久久伊人影院 | 日韩成人av在线 |