你可以自己写一个的。这种舵机比陵告较特殊,但是只要满足尺明明一下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()
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)