电子说
伺服电动机是一种特殊的齿轮减速直流电动机,配备有用于控制电动机轴的旋转方向以及位置的电子电路。由于伺服电机允许其输出轴的精确角度定位,因此它们广泛用于机器人技术和无线电控制的汽车,飞机和船只中,以控制其各个零件的运动。在本实验课程中,我们将首先探讨伺服电动机的组成及其工作原理,然后说明如何将其与PIC微控制器接口。
伺服电动机控制使用PIC微控制器
理论
伺服电动机(或伺服)是一个小盒子,其中装有一个直流电动机,通过一系列齿轮连接至电动机的输出轴(伺服臂)和控制该轴位置的电子电路。使用伺服的目的是实现对象的精确角度定位。
为了实现伺服功能,输出轴的瞬时定位信息通过换能器反馈到控制电路。最简单的方法是将电位计连接到输出轴或齿轮系中的某个位置。控制电子设备将电位计的反馈信号(包含轴的当前位置)与控制输入信号(包含轴的期望位置的信息)进行比较,并将实际值和期望值之间的差(称为误差信号)被放大并用于在减少或消除误差所需的方向上驱动直流电动机。当输出轴到达所需位置时,误差为零。典型伺服电机的功能框图如下所示。
伺服电机原理
伺服部件(来源:http://tutorial.cytron.com.my/2011/09/19/how-rc-servo-works/)
伺服是脉宽调制(PWM)信号,通常频率为50 Hz。这意味着脉冲应每20ms重复一次。脉冲的宽度决定了输出轴的角度位置。伺服器内部的电子电路将PWM信号转换为成比例的输出电压,并将其与电位计的反馈电压进行比较。如果两者之间存在差异,则控制电路会沿适当的方向驱动电动机,直到差异变为零为止。脉冲宽度的典型值在1.0到2.0毫秒(ms)的范围内。对于标准伺服器,脉冲宽度在1.0毫秒至1.5毫秒之间会使伺服器顺时针旋转(CW),在1.5毫秒至2.0毫秒之间使伺服器能够逆时针旋转(CCW),而1.5毫秒脉冲宽度会使伺服电动机转向它的中心。但是,这些值可能会因电机的品牌和制造而有所不同。建议阅读伺服器的数据表,以找到将伺服器定位在不同角度所需的脉冲宽度的真实值。
大多数伺服器旋转180°。然而。有些可以旋转360°或更大角度。 Servos由于其精确的角度定位而被广泛用作机器人手臂中的活动关节。他们还发现了在无线电(RC)玩具中的应用。例如,在RC汽车中,它们用于转向机构,在RC船中用于控制舵。
伺服电机具有三根电线:两根用于电源(Vcc和地面),第三根用于电源。 Vcc线通常是红色的,接地线是黑色或棕色的。控制信号线为白色,黄色或橙色。本实验中使用的伺服电机来自iCircuit技术,并具有分别用于Vcc,Gnd和控制信号的红色,棕色和黄色导线。它以5.0 V电源供电,并提供180°的角度旋转
典型的伺服电机
不同角度位置的伺服定时信息
伺服臂的不同角度位置
电路
此电路的电路图实验如下所示。伺服器的控制输入来自PIC16F628A微控制器的RB1引脚,该PIC16F628A微控制器使用外部陶瓷谐振器以4.0 MHz的频率工作。轻触开关连接到RB0引脚,以提供用户输入来控制伺服臂的位置。该实验的操作部分在下面的软件部分中进行介绍。
用于伺服电机控制演示的电路图
电路板上的电路设置
软件
PIC16F628A的固件是用用于PIC编译器的MikroC Pro编写的。 Timer0模块用作带预分频器1:256的定时器,以在两个连续的PWM脉冲之间产生大约20 ms的间隔。请记住,时钟频率为4.0 MHz,这导致1 s的机器周期,从而简化了使用Timer0计算延迟的数学运算。 MikroC提供了一个内置的库函数Delay_Cyc(),该函数生成可变的时钟周期延迟。此功能用于将控制脉冲的宽度从0.7毫秒更改为2.3毫秒。当电路第一次上电或复位时,在RB1引脚上连续产生脉冲宽度为0.7 ms的50 Hz PWM信号。该控制信号一直沿顺时针方向将伺服臂一直移动到末端,该末端被视为0角位置。按下连接到RB0引脚的轻触开关时,脉冲宽度增加0.2 ms,这将使轴逆时针(CCW)旋转大约22.5°。因此,每次按下开关,脉冲宽度都会增加0.2 ms,并且轴将进一步沿CCW方向旋转。连续按下开关8次后,脉冲宽度变为2.3 ms,轴到达另一端(180°角位置)。在第9次按下时,脉冲宽度被重置为0.7 ms,并且电机轴沿顺时针方向旋转,直到回到0角位置。在程序中,变量“ i”存储脉冲宽度信息(脉冲宽度= i * 10 * 10微秒),并以2为步长从7变为23。当i = 7时,脉冲宽度为7 * 10 * 10 = 700微秒(0.7 ms),当i = 23时,宽度为2.3 ms。
/*
Lab 21: Servo motor Control using PIC16F628A
MCU: PIC16F628A running at 4.0 MHz, MCLR enabled, WDT is OFF, Brown Out Detect
disabled
Written by: Rajendra Bhatt (www.embedded-lab.com)
2012/03/29
Description: User input switch is connected to RB0 and Servo Control signal
is generated from RB1 pin.
*/
sbit SW1 at RB0_bit;
sbit Control at RB1_bit;
unsigned short i=7, delay;
void interrupt() {
delay = i*10;
Control = 1;
Delay_Cyc(delay); // Generates delay equal to 10*delay clock cycles
Control = 0;
TMR0 = 180; // TMR0 returns to its initial value
INTCON.T0IF = 0; // Bit T0IF is cleared so that the interrupt could reoccur
}
void main() {
CMCON = 0x07; // Disable Comparators
TRISB = 0b00000001;
PORTB = 0;
OPTION_REG = 0x07; // Prescaler (1:256) is assigned to the timer TMR0
TMR0 = 180; // Timer T0 counts from 180 to 255 to create ~20 ms period
INTCON = 0xA0; // Enable interrupt TMR0 and Global Interrupts
do{
if(!SW1){ // Change pulse width when Switch is pressed
Delay_ms(300);
i = i+2;
if(i》23) i=7;
}
}while(1);
}
下载完整的源文件和HEX文件
输出
将HEX文件加载到PIC16F628A微控制器之后,您可以观察伺服控制器的运行情况。观看底部的演示视频,以查看该实验的输出。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !