如下图所示,最便宜的舵机 sg90 ,常用三根或者四根接线,黄色为 PWM 信号控制
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有 0-90° 、 0-180° 、 0-360
怎么控制舵机
向黄色信号线 “ 灌入 ”PWM 信号。
PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右
数据:
0.5ms-------------0度; 2.5% 对应函数中占空比为 250
1.0ms------------45度; 5.0% 对应函数中占空比为 500
1.5ms------------90度; 7.5% 对应函数中占空比为 750
2.0ms-----------135度; 10.0% 对应函数中占空比为 1000
2.5ms-----------180度; 12.5% 对应函数中占空比为 1250
定时器需要定时20ms, 关心的单位0.5ms, 40个的0.5ms,初值0.5m cnt++
1s = 10ms * 100
20ms = 0.5ms * 40
jd就是cnt,分别对应着
0.5ms-------------0度; 1
1.0ms------------45度; 2
1.5ms------------90度; 3
2.0ms-----------135度; 4
2.5ms-----------180度; 5
并且软件PWM是不稳定的,所以前面要用软件延时稳定一下
#include "reg52.h"
sbit sg90_con = P1^1;
int jd;
int cnt = 0;
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Time0Init()
{
//1. 配置定时器0工作模式位16位计时
TMOD = 0x01;
//2. 给初值,定一个0.5ms出来
TL0=0x33;
TH0=0xFE;
//3. 开始计时
TR0 = 1;
TF0 = 0;
//4. 打开定时器0中断
ET0 = 1;
//5. 打开总中断EA
EA = 1;
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
Delay300ms();//让硬件稳定一下
Time0Init(); //初始化定时器
jd = 1; //初始角度是0度,0.5ms,溢出1就是0.5,高电平
cnt = 0;
sg90_con = 1;//一开始从高电平开始
//每隔两秒切换一次角度
while(1){
jd = 3; //90度 1.5ms高电平
cnt = 0;
Delay2000ms();
jd = 1; //0度
cnt = 0;
Delay2000ms();
}
}
void Time0Handler() interrupt 1
{
cnt++; //统计爆表的次数. cnt=1的时候,报表了1
//重新给初值
TL0=0x33;
TH0=0xFE;
//控制PWM波
if(cnt < jd){
sg90_con = 1;
}else{
sg90_con = 0;
}
if(cnt == 40){//爆表40次,经过了20ms
cnt = 0; //当40次表示20ms,重新让cnt从0开始,计算下一次的20ms
sg90_con = 1;
}
}