那位大神给段c语言控制舵机从0~180持续来回转动的程序,不胜感激

那位大神给段c语言控制舵机从0~180持续来回转动的程序,不胜感激,第1张

180度舵机是一特殊的机器人专用舵机。你所说的0-180度,在专业玩家里不这样说的,而是说成±90度。即顺时针90度,逆时针90度。

你可以自己写一个的。这种舵机比陵告较特殊,但是只要满足尺明明一下PWM就可以实现了:

1. 周期T=20ms(即50HZ),占空比500us-2500us。槐困

2. 500us舵机逆时针转90度,2500us舵机顺时针转90读。 (其中0度是1500us)

3. 即: TL+TH=20ms 改变TH的值,舵机角度随之改变。参数参照以上1.2点。

TL TH

_____ ____

_________| |_________|| _________|

4. 电路原理很简单,接好电源,地,信号线。

信号线接到单片机或者其他能输出PWM的控制脚。

#include<reg52.h>typedef unsigned int uinttypedef unsigned char ucharsbit pwm=P0^3//输出PWM信号uchar count=0uint pwm_value=1500//初值为1.5msuint value[]={1500,1000,1500,2000,1500}//void delay_ms(uint x){uint iwhile(x--)for(i=0i<125i++)}void InitTimer(void){TMOD=0x11//开定型纳烂时卜漏器0,1TH0=-20000/256//茄中定时20MS,20MS为一个周期TL0=-20000%256TH1=-1500/256//定时1.5MS,这时舵机处于0度TL1=-1500%256EA=1//开总断TR0=1//开定时器0ET0=1TR1=1//开定时器1ET1=1}void timer0(void) interrupt 1//定时器0中断函数{pwm=1TH0=-20000/256TL0=-20000%256TR1=1count++}void timer1(void) interrupt 3//定时器1中断函数{pwm=0TH1=-pwm_value/256TL1=-pwm_value%256TR1=0}void main(void)//主函数{uchar iInitTimer()pwm_value=1500while(1){for(i=0i<5i++){pwm_value=value[i]//通过数组就可以改变舵机的转角度delay_ms(1000)}}}

#include "reg52.h"

unsigned char count //0.5ms次数标识

sbit pwm =P1^7 //PWM信号输出

sbit jia =P3^6 //角度增加按键检测IO口

sbit jan =P3^7 //角度减少按键检测IO口

unsigned char jd//角度标识

unsigned char flag

sbit dula=P2^6

sbit wela=P2^7

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

void delay(unsigned char i)//延时

{

unsigned char j,k

for(j=ij>0j--)

for(k=125k>0k--)

}

void Time0_Init()//定时器初始辩侍消化

{

TMOD = 0x01//定时器0工作在方式1

IE = 0x82

TH0 = 0xfe

TL0 = 0x33//11.0592MZ晶振,0.5ms

TR0=1 //定时器开始

}

void Time0_Int() interrupt 1 //中断程序

{

TH0 = 0xfe//重新赋值

TL0 = 0x33

if(flag!=29||jd!=1) //这个判断谈悔是为了在0度时让信号线只输出30个周期的PWM信号,然后就让信号线为低电平

{

if(count<jd) //判断0.5ms次数是否小于角携知度标识

pwm=1 //确实小于,PWM输出高电平

else

pwm=0

}

count=(count+1) //0.5ms次数加1

if(count==39) //次数始终保持为40 即保持周期为20ms

{

count=0

if(jd==1)

if(flag!=29)

flag=flag+1 //如果30个周期已经到了,则保持这个flag为29,使在前面的判断中不在输出PWM信号

}

}

void keyscan() //按键扫描

{

if(jia==0)//角度增加按键是否按下

{

delay(10) //按下延时,消抖

if(jia==0) //确实按下

{ flag=0 //有键按下就让flag为0,这样当再次要使电机为0度时可以再次输出30个周期的PWM信号

jd++ //角度标识加1

count=0 //按键按下 则20ms周期从新开始

if(jd==6)

jd=5 //已经是180度,则保持

while(jia==0)//等待按键放开

}

}

if(jan==0)//角度减小按键是否按下

{

delay(10)

if(jan==0)

{flag=0 //有键按下就让flag为0,这样当再次要使电机为0度时可以再次输出30个周期的PWM信号

jd--//角度标识减1

count=0

if(jd==0)

jd=1 //已经是0度,则保持

while(jan==0)

}

}

}

void display() //数码管显示函数

{

unsigned char bai,shi,ge

switch(jd)//根据角度标识显示相应的数值

{

case 1://为1,角度为0,前3个数码管显示000

bai=0

shi=0

ge=0

break

case 2:

bai=0

shi=4

ge=5

break

case 3:

bai=0

shi=9

ge=0

break

case 4:

bai=1

shi=3

ge=5

break

case 5://为5,角度为180,前3个数码管显示180

bai=1

shi=8

ge=0

break

}

dula=0

P0=table[bai]

dula=1

dula=0

wela=0

P0=0xfe

wela=1

wela=0

delay(5)

P0=table[shi]

dula=1

dula=0

P0=0xfd

wela=1

wela=0

delay(5)

P0=table[ge]

dula=1

dula=0

P0=0xfb

wela=1

wela=0

delay(5)

}

void main()

{

jd=1

flag=0

count=0

pwm=0

Time0_Init()

while(1)

{

keyscan() //按键扫描

display()

}

}


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

原文地址: http://outofmemory.cn/yw/12404013.html

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

发表评论

登录后才能评论

评论列表(0条)

保存