1. 什么是舵机
如下图:为最便宜的sg90舵机, 常用三根或者四根接线,黄色为PWM信号控制,
特点: 旋转扭矩大,不能调速,控制角度
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
转动角度:180°、扭矩:2.0kg/cm(4.8V),2.2kg/cm(6V)
2. 如何控制舵机
舵机内部检测PWM信号高电平的时长,比如90°就是一个周期内高电平1.5ms
那么如何控制舵机?
向黄色信号线“灌入”PWM信号。
PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右
数据:
0.5ms-------------0度; 2.5% 对应函数中占空比
1.0ms------------45度; 5.0% 对应函数中占空比
1.5ms------------90度; 7.5% 对应函数中占空比
2.0ms-----------135度; 10.0% 对应函数中占空比
2.5ms-----------180度; 12.5% 对应函数中占空比
定时器需要定时20ms, 关心的单位0.5ms, 40个的0.5ms,初值0.5m Num++
1s = 10ms * 100
20ms = 0.5ms * 40
3. 代码实现
/***********************舵机信号线接在P1.1口***********************************/
/**********************每隔2s舵机从0°到90°切换********************************/
0.5ms的定时函数块
void Timer0_Init() //0.5毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA =1;
}
完整代码:
#include <REGX52.H>
int Num=0;
int jiaodu;
sbit sg90_con =P1^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 Timer0_Init() //0.5毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
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(); //延时开机稳定硬件
Timer0_Init(); //启动定时,进入中断
jiaodu=1; //1个0.5ms
Num=0;
sg90_con=1; //开始时从高电平开始
while(1)
{
jiaodu=3; //3*0.5ms=1.5ms对应90°
Num =0;
Delay2000ms(); //延时2s
jiaodu=1; //0°
Num=0;
Delay2000ms();
}
}
void Timer0_Rountine() interrupt 1
{
Num++; //定时器溢出加1
TL0 = 0x33; //设置定时初始值
TH0 = 0xFE; //设置定时初始值
if(Num<jiaodu)
{
sg90_con=1; //控制P1.1口产生PWM波
}
else
{
sg90_con=0; //控制P1.1口产生PWM波
}
if(Num==40) //一个周期到,重新计数
{
Num=0;
sg90_con=1;
}
}
VID