本人是初学单片机,若有不到之处,希望大家积极指出,共同学习! 下面说一下驱动舵机SG90过程中的一些经验:
1.了解舵机基本运动机理
舵机内部结构及运动原理详细解析
(重要的是看舵机运动原理)
2.注意我们使用的是模拟舵机(模拟舵机和数字舵机驱动方法不同)
模拟舵机:需要不断的发送PWM信号,才可旋转到指定位置。
数字舵机:只需给一个PWM信号,即可旋转到指定位置。
3. 使用PWM信号控制—详细代码如下
- /***************************************************
- /*舵机控制
- /*开关K1控制顺时针旋转 开关K2控制逆时针旋转
- /*每次旋转角度由定时器1控制 定时器周期越短 精度越高
- ****************************************************/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit pwm=P1^0;
- sbit k1=P3^0; //k1顺时针旋转
- sbit k2=P3^1; //k2逆时针旋转
- 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++;//判断是否旋转到180°
- else n=26;
- }
- }
- if(k2==0)
- {
- delay5ms();
- if(k2==0)
- {
- while(k2==0); //判断当键盘松开时
- if(n>=6) 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;
- }
- }
复制代码
|