求51单片机直接控制舵机转动角度的程序

求51单片机直接控制舵机转动角度的程序,第1张

#include<REG52H>

#define OUT P0

#define CON P2

#define ms0_5Con 461

#define ms2_5Con 2304

typedef unsigned char unit8;

typedef unsigned short unit_16;

sbit servo0=OUT^0;

sbit servo1=OUT^1;

sbit servo2=OUT^2;

sbit servo3=OUT^3;

sbit servo4=OUT^4;

sbit servo5=OUT^5;

sbit servo6=OUT^6;

sbit servo7=OUT^7;

sbit KEY1=CON^0;

sbit KEY2=CON^1;

unit_16 pwm[8]={1382,1382,1382,1382,1382,1382,1382,1382}; //90,(13824,1382)

void Inter_Form()

{

TMOD|=0x01;

TH0 =0xf7;

TL0 =0x00;

TR0 =1;

ET0 =1;

EA =1;

}

void delay(unit8 x)

{

unit8 i=0;

while(x--)

{

for(i=0;i<125;i++);

}

}

/--------------------------------------------------/

/unit_16 Transform(uchar val)

{

//0=05ms, 45=1ms, 90=15ms, 135=2ms, 180=25ms

//25 ms F700, (12n/11059200=25/1000, n=2304, X=65536-2304=63232 > F700)

//return (unit_16)(((float)(2/180)X+05)/100011059200/12);

unit_16 a = (val+46)10;

if(a<ms0_5Con)

a=ms0_5Con;

if(a>ms2_5Con)

a=ms2_5Con;

return a;

} /

/----------------------------------------------------/

void Steering_UP(unit8 val)

{

if(pwm[val]>ms2_5Con)

pwm[val]=ms2_5Con;

pwm[val]=pwm[val]+10;

}

void Steering_Down(unit8 val)

{

if(pwm[val]<ms0_5Con)

pwm[val]=ms0_5Con;

pwm[val]=pwm[val]-10;

}

void main(void)

{

Inter_Form();

while(1)

{

if(!KEY1)

{

delay(2);

if(!KEY1)

Steering_UP(0);

}

else if(!KEY2)

{

delay(2);

if(!KEY2)

Steering_Down(0);

}

}

}

/--------------------------------------------------/

void SteeringGear() interrupt 1

{

static unit8 pwm_flag=0;

switch(pwm_flag)

{

case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;

case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;

case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;

case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;

case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;

case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;

case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;

case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;

case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;

case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;

case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;

case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;

case 13: servo6=1; TH0=-pwm[6]>>8; TL0=-pwm[6]; break;

case 14: servo6=0; TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;

case 15: servo7=1; TH0=-pwm[7]>>8; TL0=-pwm[7]; break;

case 16: servo7=0; TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;

default:TH0=0xff; TL0=0x80; pwm_flag=0;

}

pwm_flag++;

}

/---------------------------------------------------------------------------------

如有问题可再咨询

-----------------------------------------------------------------------------------/

文库里面有一篇文献,就是讲51单片机控制舵机动作的,你去看看吧:

>

定时器0表示的是脉冲总周期20ms,定时器1表示的是正脉冲宽度(如pwm_value = 1500时表示正脉冲宽度为15ms), 而while循序只是为了改变正脉冲宽度。运行过程是:定时器0和定时器,1同时开启,此时pwm = 1,定时器1的时间到了之后pwm = 0,并关闭定时器1,等待脉冲总周期达到20ms即定时器0中断,在定时器0的中断服务中又将pwm赋值为1并开启定时器1……以这样的方式循环就可以控制舵机转动了!

//12MHz

#include <reg51h>

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;

}

#include <reg52h> //12M晶振

sbit PWM=P1^0; //定义P1^0为输出端口

unsigned int pwm_h=2430,pwm; //定义pwm信号中的高电平时间

范围 535< pwm_h <2430

bit fa;

void Init_Timer0() //定时器初始化子程序

{

TMOD = 0x01;

TH0 = 0x0FF;

TL0 = 0x0F6;

EA = 1;

ET0 = 1;

TR0 = 1; //定时器开关打开

}

void main() //主函数

{

Init_Timer0(); //定时器初始化

PWM=0;

while(1)

{

if(fa)

{

fa=0;

pwm_h=20000-pwm_h;

}

}

}

void Timer0() interrupt 1 using 1

{

TH0 =(-pwm_h)/256;

// (65535-200) /256=0xff;

TL0 =(-pwm_h)%256; //01ms一个记时器周期

236 % 256 = 236

fa=1;

PWM=~PWM;

}

控制舵机旋转方法:

1、控制信号(如图H)是一种脉宽调制(PWM)信号,凡是微控制器能轻松的产生这种信号。在此文中,我用的是常用的Arduino开发环境下的微控制器。

2、 脉冲的高电平持续1到2毫秒(ms),也就是1000到2000微秒(µs)。在1000µs时,舵机左满舵。在2000µs时,右满舵。不过你可以通过调整脉宽来实现更大或者更小范围内的运动。

3、控制脉冲的低电平持续20毫秒。每经过20毫秒(50次每秒),就要再次跳变为高电平,否则舵机就可能罢工,难以保持稳定。不过你要是想让它一瘸一拐的跳舞,倒可以采取这种方法。

以上就是关于求51单片机直接控制舵机转动角度的程序全部的内容,包括:求51单片机直接控制舵机转动角度的程序、用51单片机产生pwm信号来控制舵机转动的程序、51单片机控制舵机转角的C语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9768442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存