此篇文章免費分享給大家,這篇文章結合筆者所學以及在往上參考大神的講解,通過自己的理解整理成文檔,在此免費分享給大家,由于筆者是一名在讀學生,文中難免有不當之處,如有錯誤,望大家指正!!!我會把源文檔和源程序放在附件中,有黑幣的直接下載,沒有的留下郵箱,看見回
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的值,觀察一下具體的情況。
程序此處都不貼出來,時間緊迫,我會放在附件中,有黑幣的直接下載,沒有的,留下郵箱
單片機源程序如下:
- #include<reg52.h>
- sbit SG_PWM=P0^0;
- unsigned char count=0;
- unsigned char PWM_count=3; //1--0度,2--45度,3--90度,4--135度,5--180度
- unsigned char a=0;
- void Timer_Init()
- {
- TMOD=0X01; //T0定時方式1
- TH0=0Xfe;
- TL0=0X33; //計數初值設置為0.5ms
- ET0=1; //打開定時器0的中斷
- TR0=1; //打開定時器0
- EA=1; //開總中斷
- }
- void Timer() interrupt 1 //特別注意此處,0--外部中斷0,1--定時器中斷0,2--外部中斷1,3--定時器中斷1,4--串行口中斷1
- {
- TR0=0;
- TH0=0Xfe;
- TL0=0X33; //重新賦計數初值為0.5ms
- if(count<=PWM_count)
- {
- SG_PWM=1;
- }
- else
- {
- SG_PWM=0;
- }
- count++;
- if(count>=40)
- {
- count=0;
- a++;
- }
- TR0=1;
- }
- void main()
- {
- Timer_Init();
- while(1)
- {
- if(a==16) //20是比較舒服的連貫動作,20以上動作些許不連貫 10的時候出現打架情況,15的時候打架幾乎沒有,16比較完美
- {
- PWM_count=1;
- }
- if(a==32)
- {
- PWM_count=3;
- a=0;
- }
- }
- }
復制代碼
全部資料51hei下載地址:
SG90舵機--自動控制.7z
(8.99 KB, 下載次數: 1154)
2019-4-16 11:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
SG90舵機--按鍵控制.7z
(9.62 KB, 下載次數: 928)
2019-4-16 11:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
淺談SG90舵機.docx
(139.68 KB, 下載次數: 464)
2019-4-16 11:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|