在上一期的项目:最简单DIY的51蓝牙遥控小车设计方案 访问地址是:https://www.cirmall.com/circuit/20328 源码里面有舵机控制部分的程序,但是被我注释掉了,由于舵机控制还是比较复杂,这里还是开一个专题来讲解51单片机如何控制180度舵机。接线请看详细的程序注解吧,学过51肯定啃得动的。
#include "reg52.h"
unsigned char count; //0.5ms 次数标识
sbit pwm =P2^7 ; //PWM信号输出,接舵机的数据线
sbit jia =P3^7; //角度增加按钮
sbit jan =P3^6; //角度减少按钮,低电平触发
unsigned char jd; //角度标识 1.0ms->45 1.5->90 2.0->135 2.5->180
void delay(unsigned char i)//普通延时函数
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void Time0_Init() //定时器0初始化
{
TMOD = 0x01; //定时器0工作在方式1,16位增计数定时器,16位全是1,最大计数值是65535,就溢出了
IE = 0x82;//EA=1全局中断允许,ET0=1,定时器中断允许
TH0 = 0xfe;//(65536-N)/256=0xef=254推出N=512,N就是需要计数的个数,机器周期是1.09us,所以
//512*1.09us=0.5ms,这时候舵机为0度,1ms是45度,2.5ms是180度,其他的类推
TL0 = 0x33; //11.0592MHz晶振的单片机,导致0.5ms计数器溢出一次,产生定时器中断
TR0=1; //开启定时器
}
void Time0_Int() interrupt 1 //定时器0中断服务程序
{
TH0 = 0xfe; //重新装载初值
TL0 = 0x33;
if(count< jd) //判断计数次数是否小于标识
pwm=1; //输出高电平PWM
else
pwm=0; //低电平PWM
count=(count+1); //计数次数继续增加
count=count%40; //计数次数必须小于40,因为0.5ms*40=20ms,这是舵机PWM的固定周期
}
void keyscan() //按键扫描
{
if(jia==0) //按下增加按钮
{
delay(10); //消除抖动
if(jia==0) //按下增加按钮
{
jd++; //标识增加,一共有5档,jd=1对应0度,jd=2对应0,45度,jd=3对应90,4对应135,5对应180度
count=0; //计数清0,当count加到2的时候,溢出两次,时间是0.5*2=1ms,对应舵机转到45度
if(jd==6)
jd=5; //标识清0
while(jia==0); //等待按键释放
}
}
if(jan==0) //按下减少按钮
{
delay(10);
if(jan==0)
{
jd--; //同理
count=0;
if(jd==0)
jd=1; //复位
while(jan==0);
}
}
}
void main()
{
jd=1;
count=0;
Time0_Init();
while(1)
{
keyscan(); //死循环,按键检测
}
}
程序分析结束了。
总结:
根据工作原理,舵机的具体控制方法就是需要一个20ms左右的时基脉冲,
该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。
脉冲宽度从0.5ms~2.5ms,相对应舵盘的位置为0~180度,呈线性变化。
***************一般舵机脉冲宽度20ms,高电平宽度与角度对应关系***********
0.5ms————0度;
1.0ms————45度;
1.5ms————90度;
2.0ms————135度;
2.5ms————180度;
根据上面的原理,我们知道单片机只要产生20ms的脉冲信号,通过改变高电平时间从0.5ms到2.5ms变化,就能使舵机转动到对应的角度
最后程序的功能就是按下增加按键,舵机从0度到180 ,按5次;舵机从180到0也需要按5次减少按钮。
下个项目将会推出用手机app和串口蓝牙模块控制舵机翻转。