51单片机PWM控制舵机,为什么舵机动不起来,每次开电源只转动一点点角度,修改很多次占空比也没用

#include <reg51.h>
sbit PWM=P0^0;
unsigned char time,duoji; //duoji是调节占空比的
void init()
{
duoji=15;
time=0;
TMOD=0X01;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;

EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if (time<=duoji)

PWM=1;

else

PWM=0;

}
}
void time1() interrupt 1
{

TH0=(65536-20000)/256;
TL0=(65536-20000)%256;

time++;

if(time>=200)
{
time=0;

}
}

舵机的控制信号为周期是20ms的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。
舵机的原理和控制 如下:
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
舵机的追随特性 假设现在舵机稳定在A点,这时候CPU发出一个PWM信号,舵机全速由A点转向B点,在这个过程中需要一段时间,舵机才能运动到B点。追问

用定时器产生了PWM波不能直接控制的吗,那个是MG995舵机

追答

1500ms对应中点,500ms对应-90度,2500ms对应90度。
如果控制舵机时候对舵机的转动速度没有要求的话,舵机会以最快的速度来工作。也就是说,在实现90度转动的过程则需要225ms,如果我们在之后好要实现其他角度的转动,那么相对应的控制pwm应该在上一个控制pwm的225ms之后发出。说得更详细点就是:在转动的225ms时间里,需要一直保持“1.5ms的高电平,18.5ms的低电平的脉宽,之后再实现其他的转动。

追问

那这个程序要怎样修改,延时225Ms吗

现在还不用转很多角度,只要固定一个角度,但每次转的角度都很小,震一下就不转了

3极管怎样连接

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-11-25
你的(65536-20000)这个能不能得到准确的周期20ms/200的单片机中断时间呢?
你试试下面参数,这个是12M晶振,12T,给出的是100微秒中断时间的参数

TH0 = 0x0FF;
TL0 = 0x9C;