赞
踩
舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms 的正脉冲宽度和舵机的转角-90°~90°(即0~180度)相对应。注意,由于舵机牌子不同,其控制器解析出的脉冲宽度也不同,所以对于同一信号,不同牌子的舵机旋转的角度也不同。其原理是:它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号, 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
0.5ms------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
采用11.0592MHZ的51单片机驱动舵机转动程序如下:
- //上电自动转动
-
- #include <reg52.h>
-
- unsigned char count; //0.5ms次数标识
-
- sbit pwm =P1^0 ; //PWM信号输出
-
- sbit jia =P2^4; //角度增加按键检测IO口
-
- sbit jian =P2^5; //角度减少按键检测IO口
-
- unsigned char jd; //角度标识
-
-
-
- sbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用
-
- void delay(unsigned char i)//延时
-
- {
-
- unsigned char j,k;
-
- for(j=i;j>0;j--)
-
- for(k=125;k>0;k--);
-
- }
-
- void Time0_Init() //定时器0初始化
-
- {
-
- //定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下
-
- TH0 = (65536-445)/256;
-
- TL0 = (65536-445)%256;
-
-
- TMOD = 0x01; //定时器0工作在方式1
-
- IE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断
-
- TR0=1; //开定时器0
-
- }
-
- void Time0_Int() interrupt 1 //中断程序
-
- {
-
- //重装初值
-
- TH0 = (65536-445)/256;
-
- TL0 = (65536-445)%256;
-
-
-
- if(count< jd)
-
- {
-
- pwm=1; //确实小于,PWM输出高电平
-
- pwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识
-
- //pwm=1; //确实小于,PWM输出高电平
-
- else
-
- {
-
- pwm=0; //确实小于,PWM输出高电平
-
- pwm1=pwm; //接示波器用的io口,观测PWM波形用 }
-
- // pwm=0; //大于则输出低电平
-
- count=(count+1); //0.5ms次数加1
-
- count=count%40; //次数始终保持为40 即保持周期为20ms
-
- }
-
-
-
- //此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
-
- //通过jian按键控制反转
-
- /*void keyscan() //按键扫描
-
- {
-
- if(jia==0) //角度增加按键是否按下
-
- {
-
- delay(10); //按下延时,消抖
-
- if(jia==0) //确实按下
-
- {
-
- jd++; //角度标识加1
-
- count=0; //按键按下 则20ms周期从新开始
-
- if(jd==6)
-
- jd=5; //已经是180度,则保持
-
- while(jia==0); //等待按键放开
-
- }
-
- }
-
- if(jian==0) //角度减小按键是否按下
-
- {
-
- delay(10);
-
- if(jian==0)
-
- {
-
- jd--; //角度标识减1
-
- count=0;
-
- if(jd==0)
-
- jd=1; //已经是0度,则保持
-
- while(jan==0);
-
- }
-
- }
-
- }*/
-
-
- void main()
-
- {
-
- //上电,舵机自动正反转
-
- //应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想
-
- while(1)
-
- {
-
- for(jd=1;jd<6;jd++)
-
- {
-
- count=0;
-
- Time0_Init();
-
- delay(50000000);
-
- }
-
- delay(50000000);
-
- for(jd=6;jd>0;jd--)
-
- {
-
- count=0;
-
- Time0_Init();
-
- delay(50000000);
-
- }
-
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。