⑴ 51单片机控制舵机转角的C语言程序
定时器0表示的是脉冲总周期20ms,定时器1表示的是正脉冲宽度(如pwm_value = 1500时表示正脉冲宽度为1.5ms), 而while循序只是为了改变正脉冲宽度。运行过程是:定时器0和定时器,1同时开启,此时pwm = 1,定时器1的时间到了之后pwm = 0,并关闭定时器1,等待脉冲总周期达到20ms即定时器0中断,在定时器0的中断服务中又将pwm赋值为1并开启定时器1……以这样的方式循环就可以控制舵机转动了!
⑵ 51单片机pwm输出控制舵机,c程序,但是不能正常输出,求大家看看
是不是高低电平时间太短,我看你的程序输出应该是很乱的,不是固定长度的高低电平
你用示波器看看PWM管脚是否有波形输出
⑶ 求问单片机控制舵机连续来回转动而不停下来的C程序怎么写
因为舵机中有电位器,输出1.5ms宽度的脉冲宽度是正90度,所以你可以写一个for循环,然后引进一个参数,不停地改变0.5ms到2.5ms之间的脉冲宽度就行了。(用延迟函数可以调整速度)希望能帮到你!
⑷ 如何用单片机控制舵机及程序详细
//双定时器产生PWM波,控制舵机
//定时器0负责置高电平和控制定时器1的开停,定时器1负责置低电平
#include<STC12C5A.H>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P3^7;
uint b=1500;//1.5ms 舵机0位
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void main()
{
b=1500;
TMOD=0X11;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TH1=(65536-b)/256;
TL1=(65536-b)%256;
ET0=1;
EA=1;
TR0=1;
PWM=1;
P1M0=0X0F; //P1低4位推挽输出 接L298N直流电机驱动模块 带动后轮两个电机
P1M1=0X00;
while(1)
{
P1=0x0a; //低4位 1010 正转
b=1500;Delay1ms(2000);//直行
b=1000;Delay1ms(1000);//左转
b=1500;Delay1ms(2000);//直行
b=2000;Delay1ms(1000);//右转
b=1500;Delay1ms(2000);//直行
P1=0x05; //低4位 0101 反转
b=1500;Delay1ms(2000);//后退
b=1000;Delay1ms(1000);//后左转
b=1500;Delay1ms(2000);//后退
b=2000;Delay1ms(1000);//后右转
b=1500;Delay1ms(2000);//后退
}
}
void timer0()interrupt 1//定时器0定时20ms
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
PWM=1;
TR1=1;
ET1=1;
}
void timer1()interrupt 3//定时器1定时1到2ms
{
TH1=(65536-b)/256;
TL1=(65536-b)%256;
PWM=0;
TR1=0;
ET1=0;
}
⑸ 编51单片机C程序,遥控器按键控制舵机左右转,仅每上电转一下。示波器见控制波形正常,原因可能是什么
量电压是不行的,如果达不到那么大的电流舵机还是转不动,建议将控制器跟舵机电机分开供电,这些东西都是比较耗电的,很容易在启动时把电源电压拉低,很不稳定。
⑹ 急求51单片机控制舵机C语言程序,舵机可以根据设定旋转任意角度!急求啊,大神帮帮忙!非常感谢!
#include<reg52.h>typedef unsigned int uint;typedef unsigned char uchar;sbit pwm=P0^3;//输出PWM信号uchar count=0;uint pwm_value=1500;//初值为1.5msuint value[]={1500,1000,1500,2000,1500};//void delay_ms(uint x){uint i;while(x--)for(i=0;i<125;i++);}void InitTimer(void){TMOD=0x11;//开定时器0,1TH0=-20000/256;//定时20MS,20MS为一个周期TL0=-20000%256;TH1=-1500/256;//定时1.5MS,这时舵机处于0度TL1=-1500%256;EA=1;//开总断TR0=1;//开定时器0ET0=1;TR1=1;//开定时器1ET1=1;}void timer0(void) interrupt 1//定时器0中断函数{pwm=1;TH0=-20000/256;TL0=-20000%256;TR1=1;count++;}void timer1(void) interrupt 3//定时器1中断函数{pwm=0;TH1=-pwm_value/256;TL1=-pwm_value%256;TR1=0;}void main(void)//主函数{uchar i;InitTimer();pwm_value=1500;while(1){for(i=0;i<5;i++){pwm_value=value[i];//通过数组就可以改变舵机的转角度delay_ms(1000);}}}
⑺ 单片机C语言控制舵机
如果需要上电就动作
只需要把程序里面的if(KEY)判断语句直接去掉就可以了。
不判断直接执行动作即可。
⑻ 单片机控制舵机程序
//12MHz
#include
<reg51.h>
void
InitTimer0(void)
{
TMOD
=
0x01;
TH0
=
0x0B1;
TL0
=
0x0E0;
EA
=
1;
ET0
=
1;
TR0
=
1;
}
void
delay(void)
//误差
0us
延时1ms
此处可以修改高电平周期
//修改此处的延时可以更改舵机转的角度
,45度具体是多少
你可以试试
{
unsigned
char
a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void
main(void)
{
InitTimer0();
P1_2=0;
while(1);
}
void
Timer0Interrupt(void)
interrupt
1
{
//20ms中断
TH0
=
0x0B1;
TL0
=
0x0E0;
P1_2=1;
delay();
P1_2=0;
}
⑼ 51单片机控制舵机转角的C语言程序
舵机频率50hz就是说一周期是20ms,占空比在百分之2.5到12.5可以从-90转到90度
单片机内部有工作的晶振频率,定时器就是基于这个频率计时,根据程序可以知道,20ms计时20000,所以计时器每加一的时间为1us,这个程序的意思就是先工作定时器0,20ms后输出置为1并打开定时器1,定时器1计时到1.5ms后触发中断使得输出为0,即占空比为1.5/20=百分之7.5,中间位置
定时器的寄存器加到0会触发中断,所以寄存器都写负数,如想要20ms就写-20000,这样往上加到0需要的计数的次数就为20000,一次计数为1us,所以为20ms,而寄存器是由两个八位寄存器组成的,所以20000要分开写
建议有时间可以去看一下郭天祥老师的51单片机视频,能搜到而且不多,貌似第三集是讲的定时器
⑽ 求一段c语言舵机程序
给段伪代码吧
intmain()
{
初始化src_angle_A,dst_angle_A;
初始化src_angle_B,dst_angle_B;
初始化src_angle_C,dst_angle_C;
初始化src_angle_D,dst_angle_D;
intA_flag=0;
intB_flag=0;
intCD_flag=0;
while(1)
{
if(key1_down())
{
if(A_flag==0)
{
set_angle_A(dst_angle_A);
}
else
{
set_angle_A(src_angle_A);
}
A_flag=1-A_flag;
}
if(key2_down())
{
if(B_flag==0)
{
set_angle_B(dst_angle_B);
}
else
{
set_angle_B(src_angle_B);
}
B_flag=1-B_flag;
}
if(key3_down())
{
if(CD_flag==0)
{
set_angle_C(dst_angle_C);
set_angle_D(dst_angle_D);
}
else
{
set_angle_C(src_angle_C);
set_angle_D(src_angle_D);
}
CD_flag=1-CD_flag;
}
delay_ms(10);
}
return0;
}