|
此篇文章免費(fèi)分享給大家,這篇文章結(jié)合筆者所學(xué)以及在往上參考大神的講解,通過(guò)自己的理解整理成文檔,在此免費(fèi)分享給大家,由于筆者是一名在讀學(xué)生,文中難免有不當(dāng)之處,如有錯(cuò)誤,望大家指正!!!我會(huì)把源文檔和源程序放在附件中,有黑幣的直接下載,沒(méi)有的留下郵箱,看見(jiàn)回
SG90舵機(jī)(模擬舵機(jī)) 一、日常吐槽額~~~~~~,在開(kāi)始今天的主題之前,占用大家一些時(shí)間。容我罵街一番,$##%%%$%#$#$$%^艸……………….,哎呀媽呀,罵的有點(diǎn)喘不過(guò)來(lái)了,額~呸,是言(文明人,文明人)。
可能就奇了怪了,你不好好碼字,罵什么街呢!說(shuō)來(lái)慚愧,上邊被罵的人就是筆者自己。今天在調(diào)試程序的時(shí)候,對(duì),就這個(gè)鬼舵機(jī),怎么都不轉(zhuǎn)!!!檢查硬件---檢查程序---百度,如此反復(fù)N小時(shí)。始終找不到問(wèn)題所在,程序呢,怎么看,怎么美!硬件呢,怎么看,怎么帥!說(shuō)是急,那是快,電閃雷鳴,刀光劍影,啪,一個(gè)數(shù)字1摔在臉上,于是乎,快速打開(kāi)課本,啪~啪~啪,數(shù)字0、1,大腦瓜子一拍,哎呀,一定是這錯(cuò)誤了!快速拿起閃閃發(fā)光的鼠標(biāo),熟練的打開(kāi)Keil4,一段操作猛如虎,只聽(tīng)見(jiàn)那吱~吱~吱~吱,舵機(jī)工作了~~~~
粗心大意:定時(shí)器0對(duì)應(yīng)的中端口----void Timer() interrupt 1
馬虎大意的我寫(xiě)成了這樣:void Timer() interrupt 0.
家都走錯(cuò)了,人家咋可能給你錢(qián),大家一定要引以為戒,細(xì)心細(xì)心再細(xì)心
中斷號(hào)
| 中斷源
| 0
| 外部中斷0
| 1
| 定時(shí)器中斷0
| 2
| 外部中斷1
| 3
| 定時(shí)器中斷1
| 4
| 串行口中斷1
| 注意:C語(yǔ)言用關(guān)鍵字“interrupt+數(shù)字”來(lái)代替匯編中中斷入口地址
——————————————————————————————————
以上非本次筆記重點(diǎn),只是筆者一點(diǎn)小小的吐槽,外加一點(diǎn)小小的知識(shí)
——————————————————————————————————
二、主咖登場(chǎng)基本概念:1.舵機(jī):舵機(jī)是一種位置(角度)伺服的驅(qū)動(dòng)器,適用那些需要角度不斷變化并可以保持的控制系統(tǒng)。舵機(jī)只是一種通俗的叫法,其實(shí)質(zhì)是一個(gè)伺服馬達(dá)。
2.模擬舵機(jī):需要不斷的發(fā)送目的地PWM信號(hào),才能旋轉(zhuǎn)到指定位置。例如:我現(xiàn)在讓它旋轉(zhuǎn)90度,我就需要不斷的發(fā)送90度的PWM信號(hào)直到到達(dá)指定位置才能停止。
3.數(shù)字舵機(jī):只需給一個(gè)目的地PWM信號(hào),即可旋轉(zhuǎn)到指定位置。例如:我現(xiàn)在讓它旋轉(zhuǎn)90度,我只需要發(fā)送一次90度的PWM信號(hào),它就可以旋轉(zhuǎn)到90度。
4.PWM信號(hào):PWM(脈沖寬度調(diào)制)是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。那么什么叫PWM信號(hào)呢,筆者就簡(jiǎn)單的談一下自己的看法,我們都知道,我們所使用的單片機(jī)都是數(shù)字電路,它的I/O口只有兩種狀態(tài),那就是高電平(1),低電平(0)。知道了這些之后,我們通過(guò)控制微處理器輸出1-0-1-0-1-0-1-0……如此循環(huán)往復(fù),就成為下圖1所示的情況,這就是PWM信號(hào)。

圖1.PWM信號(hào)
5.占空比:高電平(或者低電平)占整個(gè)周期的時(shí)間就叫作占空比。
6.PWM頻率:PWM頻率是指每秒鐘信號(hào)從高電平到低電平再到高電平的次數(shù)。
工作原理 理解以上的概念,對(duì)我們接下來(lái)的學(xué)習(xí)是非常有必要的,希望大家能好好掌握上面的概念。
我所使用的SG90舵機(jī),如下圖2所示

圖2
接線方法:
紅-------------------------VCC
棕色----------------------GND
橙色----------------------信號(hào)線
原理:舵機(jī)內(nèi)部有一個(gè)基準(zhǔn)電壓,微處理器產(chǎn)生的PWM信號(hào)通過(guò)信號(hào)線進(jìn)入舵機(jī)產(chǎn)生直流偏置電壓,與舵機(jī)內(nèi)部的基準(zhǔn)電壓作比較,獲得電壓差輸出。電壓差的正負(fù)輸出到電機(jī)驅(qū)動(dòng)芯片上,從而決定正反轉(zhuǎn)。當(dāng)舵機(jī)開(kāi)始旋轉(zhuǎn)的時(shí)候,舵機(jī)內(nèi)部通過(guò)級(jí)聯(lián)減速齒輪帶動(dòng)電位器旋轉(zhuǎn),使得電壓差為零,電機(jī)停止轉(zhuǎn)動(dòng)。
重點(diǎn):作為一個(gè)單片機(jī)編寫(xiě)者,具體的原理,我們不必要搞清楚,我們只需知道如何控制它即可,以下將講解如何控制舵機(jī)運(yùn)轉(zhuǎn)。

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

為什么此處要此處a==16,a==32,首先,這個(gè)值是我一步步測(cè)試出來(lái)的,如果你看見(jiàn)源程序的話,上面有詳細(xì)的介紹,此處不再贅述。
我們知道SG90是一個(gè)模擬舵機(jī),需要不斷的給出信號(hào)才能到達(dá)指定的位置。到達(dá)這個(gè)位置并不是一蹴而就的,它需要時(shí)間,實(shí)際上面的a==16,相當(dāng)于延時(shí),這段時(shí)間剛好能夠讓舵機(jī)達(dá)到指定的位置,然后在接收下一個(gè)回?cái)[程序。a==32,是因?yàn)槲倚枰屗鼇?lái)回?cái)[動(dòng)的時(shí)間對(duì)稱(chēng),所以才用a==32的。有興趣的可以改變a的值,觀察一下具體的情況。
程序此處都不貼出來(lái),時(shí)間緊迫,我會(huì)放在附件中,有黑幣的直接下載,沒(méi)有的,留下郵箱
單片機(jī)源程序如下:
- #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定時(shí)方式1
- TH0=0Xfe;
- TL0=0X33; //計(jì)數(shù)初值設(shè)置為0.5ms
- ET0=1; //打開(kāi)定時(shí)器0的中斷
- TR0=1; //打開(kāi)定時(shí)器0
- EA=1; //開(kāi)總中斷
- }
- void Timer() interrupt 1 //特別注意此處,0--外部中斷0,1--定時(shí)器中斷0,2--外部中斷1,3--定時(shí)器中斷1,4--串行口中斷1
- {
- TR0=0;
- TH0=0Xfe;
- TL0=0X33; //重新賦計(jì)數(shù)初值為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是比較舒服的連貫動(dòng)作,20以上動(dòng)作些許不連貫 10的時(shí)候出現(xiàn)打架情況,15的時(shí)候打架幾乎沒(méi)有,16比較完美
- {
- PWM_count=1;
- }
- if(a==32)
- {
- PWM_count=3;
- a=0;
- }
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
SG90舵機(jī)--自動(dòng)控制.7z
(8.99 KB, 下載次數(shù): 1154)
2019-4-16 11:50 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
SG90舵機(jī)--按鍵控制.7z
(9.62 KB, 下載次數(shù): 928)
2019-4-16 11:50 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
淺談SG90舵機(jī).docx
(139.68 KB, 下載次數(shù): 464)
2019-4-16 11:48 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|