单片机控制舵机 修改浏览权限 | 删除
. 什么是舵机:
舵机如下所示:
有三根线,一般依次是地,电源(5V 左右),信号(信号的幅值>=3.3V),不清
楚各个脚打开舵机一测量就知道了。
2. 其工作原理是:
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms ,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。 3. 舵机的控制:
舵机的控制一般需要一个20ms 左右的时基脉冲,该脉冲的高电平部分一般为
0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
重要说明:
1:上面部分还是成线形关系的,Y=90X-45(X 单位是ms,Y 单位是度数:)
2:上面所说的0度 45度等是指度 45度位置(什么意思呢:我说明一下就知道了,就拿45度位置来说,若舵机停在0度位置,下载45度位置程序后则舵机停在45度,即顺时针走了45度,若当时舵机在135度位置,则反转90度到45度位置。所以舵机不存在正转反转问题。这点非常重要。
3:若想转动到45度位置,要一直产生1.0ms 的高电平(即PA0=1;
Delay(1ms);PA0=0;Delay(20ms);要不停的产生这个高低电平,产生PWM 脉冲 请看下形象描述吧:
下面是我在ATMEGA32上的测试程序,开发软件:ICC AVR
#include
typedef struct BYTE_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
unsigned BIT5:1;
unsigned BIT6:1;
unsigned BIT7:1;
}BYTEBIT;
#define SET_BIT8_FORMAT(Addr) (*((volatile BYTEBIT *)&Addr)) # define PORTB_BIT SET_BIT8_FORMAT(PORTB)
# define _PB0 PORTB_BIT.BIT0
# define _PB1 PORTB_BIT.BIT1
# define _PB2 PORTB_BIT.BIT2
# define _PB3 PORTB_BIT.BIT3
# define _PB4 PORTB_BIT.BIT4
# define _PB5 PORTB_BIT.BIT5
# define _PB6 PORTB_BIT.BIT6
# define _PB7 PORTB_BIT.BIT7
/*delay(1)延时时间为300US
delay(80)延时时间为20mS
delay(4)延时时间为1mS
delay(8)延时时间为2mS
delay(6)延时时间为1.55mS
delay(2)延时时间为0.55MS
delay(10)延时时间为2.5mS
*/
void Delay(int j)
{ int i;
for(;j>0;j--)
{
for(i=0;i
}
}
void main(void) {
int i,j;
DDRB=0XFF;
while(1)
{
//2.0ms 135度位置
_PB7=1;
Delay(8);
_PB7=0;
Delay(74);
/*
//1.0ms 45度位置
_PB7=1;
Delay(4);
_PB7=0;
Delay(78);
//1.5ms 90度位置
_PB7=1;
Delay(6);
_PB7=0;
Delay(78);
// 2.5ms 180度位置
_PB7=1;
Delay(10);
_PB7=0;
Delay(72);
//0.5ms 0度位置
_PB7=1;
Delay(2);
_PB7=0;
Delay(78);
*/
}
}
测试过绝对可以。延时时间是我用示波器测量的,硬件开发板晶振用的内部1M 晶振。
看了网上其他人有用中断的,有用PWM 的,其实目的是一样的。改变20ms 的周期波形的占空比。其实用单片机这样做也有不方面,若转动某个角度,程序修改 需要再下载一下,挺麻烦的。我让同事在LABVIEW 下做的。在上面改就可以了,非常方便
单片机控制舵机 修改浏览权限 | 删除
. 什么是舵机:
舵机如下所示:
有三根线,一般依次是地,电源(5V 左右),信号(信号的幅值>=3.3V),不清
楚各个脚打开舵机一测量就知道了。
2. 其工作原理是:
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms ,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。 3. 舵机的控制:
舵机的控制一般需要一个20ms 左右的时基脉冲,该脉冲的高电平部分一般为
0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
重要说明:
1:上面部分还是成线形关系的,Y=90X-45(X 单位是ms,Y 单位是度数:)
2:上面所说的0度 45度等是指度 45度位置(什么意思呢:我说明一下就知道了,就拿45度位置来说,若舵机停在0度位置,下载45度位置程序后则舵机停在45度,即顺时针走了45度,若当时舵机在135度位置,则反转90度到45度位置。所以舵机不存在正转反转问题。这点非常重要。
3:若想转动到45度位置,要一直产生1.0ms 的高电平(即PA0=1;
Delay(1ms);PA0=0;Delay(20ms);要不停的产生这个高低电平,产生PWM 脉冲 请看下形象描述吧:
下面是我在ATMEGA32上的测试程序,开发软件:ICC AVR
#include
typedef struct BYTE_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
unsigned BIT5:1;
unsigned BIT6:1;
unsigned BIT7:1;
}BYTEBIT;
#define SET_BIT8_FORMAT(Addr) (*((volatile BYTEBIT *)&Addr)) # define PORTB_BIT SET_BIT8_FORMAT(PORTB)
# define _PB0 PORTB_BIT.BIT0
# define _PB1 PORTB_BIT.BIT1
# define _PB2 PORTB_BIT.BIT2
# define _PB3 PORTB_BIT.BIT3
# define _PB4 PORTB_BIT.BIT4
# define _PB5 PORTB_BIT.BIT5
# define _PB6 PORTB_BIT.BIT6
# define _PB7 PORTB_BIT.BIT7
/*delay(1)延时时间为300US
delay(80)延时时间为20mS
delay(4)延时时间为1mS
delay(8)延时时间为2mS
delay(6)延时时间为1.55mS
delay(2)延时时间为0.55MS
delay(10)延时时间为2.5mS
*/
void Delay(int j)
{ int i;
for(;j>0;j--)
{
for(i=0;i
}
}
void main(void) {
int i,j;
DDRB=0XFF;
while(1)
{
//2.0ms 135度位置
_PB7=1;
Delay(8);
_PB7=0;
Delay(74);
/*
//1.0ms 45度位置
_PB7=1;
Delay(4);
_PB7=0;
Delay(78);
//1.5ms 90度位置
_PB7=1;
Delay(6);
_PB7=0;
Delay(78);
// 2.5ms 180度位置
_PB7=1;
Delay(10);
_PB7=0;
Delay(72);
//0.5ms 0度位置
_PB7=1;
Delay(2);
_PB7=0;
Delay(78);
*/
}
}
测试过绝对可以。延时时间是我用示波器测量的,硬件开发板晶振用的内部1M 晶振。
看了网上其他人有用中断的,有用PWM 的,其实目的是一样的。改变20ms 的周期波形的占空比。其实用单片机这样做也有不方面,若转动某个角度,程序修改 需要再下载一下,挺麻烦的。我让同事在LABVIEW 下做的。在上面改就可以了,非常方便