
本人是初學單片機,若有不到之處,希望大家積極指出,共同學習! 下面說一下驅(qū)動舵機SG90過程中的一些經(jīng)驗:
1.了解舵機基本運動機理
舵機內(nèi)部結(jié)構(gòu)及運動原理詳細解析
(重要的是看舵機運動原理)
2.注意我們使用的是模擬舵機(模擬舵機和數(shù)字舵機驅(qū)動方法不同)
模擬舵機:需要不斷的發(fā)送PWM信號,才可旋轉(zhuǎn)到指定位置。
數(shù)字舵機:只需給一個PWM信號,即可旋轉(zhuǎn)到指定位置。
3. 使用PWM信號控制—詳細代碼如下
- /***************************************************
- /*舵機控制
- /*開關(guān)K1控制順時針旋轉(zhuǎn) 開關(guān)K2控制逆時針旋轉(zhuǎn)
- /*每次旋轉(zhuǎn)角度由定時器1控制 定時器周期越短 精度越高
- ****************************************************/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit pwm=P1^0;
- sbit k1=P3^0; //k1順時針旋轉(zhuǎn)
- sbit k2=P3^1; //k2逆時針旋轉(zhuǎn)
- uchar count=0;
- uchar n=14; //初始位置-在90°附近
- void delay5ms()
- {
- unsigned char a,b;
- for(b=19;b>0;b--)
- for(a=130;a>0;a--);
- }
- void key()
- {
- if(k1==0)
- {
- delay5ms();
- if(k1==0)
- {
- while(k1==0); //判斷當鍵盤松開時
- if(n<=25) n++;//判斷是否旋轉(zhuǎn)到180°
- else n=26;
- }
- }
- if(k2==0)
- {
- delay5ms();
- if(k2==0)
- {
- while(k2==0); //判斷當鍵盤松開時
- if(n>=6) n--; //判斷是否旋轉(zhuǎn)到0°
- else n=5;
- }
- }
- }
- void InitTimer()//0.1ms 12Mhz
- {
- TMOD = 0x01;
- TH0 = 0xFF;
- TL0 = 0x9C;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void main()
- {
- InitTimer();
- while(1)
- {
- key();
- }
- }
- void Timer() interrupt 1
- {
- TH0 = 0xFF;
- TL0 = 0x9C;
- count++;
- if(count<=200)
- {
- if(count<=n)
- {
- pwm=1;
- }
- else
- {
- pwm=0;
- }
- }
- else
- {
- count=0;
- pwm=0;
- }
- }
復制代碼
|