51控制sg90(180°)
51单片机控制sg90(180)舵机
1. 软硬件条件
- 单片机型号:STC89C52RC
- 开发环境:KEIL4
- 烧录软件:stc-isp
- sg90舵机
2. 舵机控制原理
舵机控制主要是通过PWM 方式控制,即调节高电平所持续的时间。
2.1 PWM
PWM (Pulse Width Modulation),即脉冲宽度调制。通过对脉冲宽度进行调制,等效出需要的波形,对模拟信号电平进行数字编码,通过调节高电平的占空比来调节信号、能量等变化。
2.2 占空比
占空比:即一个周期内高电平所占据的时间占整个周期的百分比。
占空比
=
t
高电平持续时间
T
周期
占空比=\frac{t_{高电平持续时间}}{T_{周期}}
占空比=T周期t高电平持续时间
如上图所示,一个周期4ms 但是高电平持续时间为1ms,故可得占空比为25%。
2.3 实现 PWM 控制方式
实现 PWM 方式可以有硬件电路支持 PWM 控制,但是该单片机没有。所以。使用 io 口模拟 PWM。但是使用 io 口模拟误差会比较大。
2.4 舵机
由PWM 信号控制,一般用于智能小车全比例转向,摄像机云台,机械臂等。常见sg90 常见有90°、180°和360°。控制sg90舵机的PWM信号不能太频繁,一般为50Hz,也就是一个周期为20ms。
T
脉冲周期
=
1
f
信号频率
=
1
50
s
=
0.02
s
=
20
m
s
T_{脉冲周期}=\frac{1}{f_{信号频率}}=\frac{1}{50}s=0.02s=20ms
T脉冲周期=f信号频率1=501s=0.02s=20ms
具体控制如下表:
高电平持续时间(ms) | 角度(°) | 占空比(%) |
---|---|---|
0.5 | 0 | 2.5 |
1 | 45 | 5 |
1.5 | 90 | 7.5 |
2.0 | 135 | 10 |
2.5 | 180 | 12.5 |
可以设定定时器中断,每0.5ms进行一次中断,修改当前io口电平。
所以需要设定定时器TLx,THx 为:
t
溢出初值
∗
1.085
u
s
=
500
u
s
t
溢出初值
=
65075
=
0
x
F
E
33
t_{溢出初值} * 1.085us = 500us \\ t_{溢出初值} = 65075 = 0xFE33\\
t溢出初值∗1.085us=500ust溢出初值=65075=0xFE33
// 定时器设置 0.5ms
TL0 = 0x33;
TH0 = 0xFE;
3. 单片机控制舵机实现
模块 | 对应引脚 |
---|---|
橙色线 | P1.1 |
红色线 | VCC |
棕色线 | GND |
3.1 代码实现
#include "reg52.h"
sbit sg90_con = P1^1;
int cnt = 0;
// 枚举类型
typedef enum Angel{angel_0=1,angel_45=2,angel_90=3,angel_135=4,angel_180=5}Angel;
enum Angel angel = angel_0;
void Timer0Init(){
TMOD &= 0xF0;
TMOD |= 0x01;
TH0= 0xFE;
TL0= 0x33;
ET0 = 1;
EA = 1;
TF0 = 0;
TR0 = 1;
}
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0Handler() interrupt 1{
TH0 = 0xFE;
TL0 = 0x33;
cnt++;
if(cnt == angel){
sg90_con = 0;
}
if(cnt == 40){
cnt = 0;
sg90_con = 1;
}
}
void init(){
Delay2000ms();
Timer0Init();
sg90_con = 1;
}
void main(){
init();
while(1){
Delay2000ms();
angel = angel_0;
cnt = 0;
sg90_con = 1;
Delay2000ms();
angel = angel_90;
cnt = 0;
sg90_con = 1;
Delay2000ms();
angel = angel_180;
cnt = 0;
sg90_con = 1;
Delay2000ms();
angel = angel_90;
cnt = 0;
sg90_con = 1;
}
}