---------------------------------------------------------------------------------------------------------------------------------
1.舵机的与单片机的连接
2.PWM波的简单了解
3.程序示例
4.开发程序难点
---------------------------------------------------------------------------------------------------------------------------------
1.舵机的与单片机的连接
如图所示,舵机正极接单片机vcc,负极接gnd,signal的连接可自定义。
---------------------------------------------------------------------------------------------------------------------------------
2.PWM波的简单了解
51单片机通过按键来控制舵机正反转,需要通过PWM波来实现,本文仅对如何使用PWM波控制舵机旋转做出解释。
对于一般的舵机来说,所对应的PWM波的周期为200ms,即单片机信号口输出200ms为一个周期。设信号口输出‘1’的时间为 x ms,剩余时间均输出‘0’,x/200的比值即为占空比的值。单片机通过控制占空比的值来控制舵机的旋转。
对于常见的舵机来说,占空比的值与对应的角度有以下关系:
0.5ms/200ms = 0 度
1.0ms/200ms = 45 度
1.5ms/200ms = 90 度
2.0ms/200ms = 135 度
2.5ms/200ms = 180 度
在51单片机中,通过定时器来计时,通过信号输出口输出‘1’或‘0’来控制舵机的旋转。
---------------------------------------------------------------------------------------------------------------------------------
3.程序示例
#include<reg52.h>
sbit key1 = P3^2;
sbit key2 = P3^3;
sbit pwm1 = P2^0;
unsigned int target =12,percent = 0;
void Timer0Initial();
void initial_Timer();
void delay(unsigned int x);
void keyscan();
void keyscan()
{
delay(30);
if(key1 == 0)
{
delay(10);
if(key1 == 0)
{
if(target >= 5)
target -= 1;
}
}
if(key2 == 0)
{
delay(10);
if(key2 == 0)
{
if(target <= 25)
target += 1;
}
}
}
void initial()
{
key1 = 1;
key2 = 1;
initial_Timer();
}
void Timer0Initial()
{
TH0 = (65536-65)/256;
TL0 = (65536-65)%256;
}
void initial_Timer()
{
EA = 1;
ET0 = 1;
TMOD = 0x01;
Timer0Initial();
TR0 = 1;
}
void delay(unsigned int x)
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
initial();
while(1)
{
keyscan();
}
}
void Timer0() interrupt 1 using 0
{
percent+=1;
if(percent<=target)
pwm1=1;
else
pwm1=0;
if(percent==200)
percent=0;
Timer0Initial();
}
注释:
P3^3和P3^2为独立按键,P2^0为输出信号口。
---------------------------------------------------------------------------------------------------------------------------------
4.开发程序难点
在实际进行操作时,常常会遇到两种情况而导致程序无法正常运行:
1>程序运行速度与舵机转速的不匹配
在实际操作时,由于舵机的转动与程序中target的增加并不是同步进行的,这就会导致松开按键时,由于程序运行速度远大于舵机转动速度,target的值已经到达25,但是舵机直转到90度位置,松开按键后会继续旋转。
解决方法为,在keyscan函数中添加延时语句delay()来使程序运行速度变慢,通过多次尝试使得舵机旋转角度与target的值同步。
2>0.5ms到2.5ms的区间并不能使得舵机从0度转到180度
不同的舵机可能由于制作精度的区别而导致误差,可以通过调整PWM波的占空比来确定具体的角度。
比如,我使用的舵机从0到180度实际的PWM波的ms为6ms~27ms,我室友的舵机从0到180度实际的PWM波为4~18ms。