伺服电机是我们常用的一种电机,在本文的案例中,将学习如何使用单片机控制伺服电机,案例以PIC16F877A单片机作为接口的连接与控制示例。
什么是伺服电机?
伺服电机是一种根据给定指令运行的特殊电机。它提供了精确的角度控制,这也意味着与其他电机通电即旋转不同。伺服电机仅旋转到一定程度或直到需要下一次旋转,在这之前电机会停止不动并等待下一条指令,才能执行进一步的动作。所以,伺服电机需要借助伺服机电路进行控制才能按要求旋转,它的角旋转和最终运动由位置反馈决定,其控制线的输入也决定了输出轴所需的位置。
伺服电机与PIC16F877A接口的伺服电机电路图:
它有一个非常简单的电路图。伺服电机的控制线直接连接到单片机的RB0引脚。该销将提供电机所需的角位移。在这个项目中,假设我们正在使用一个角旋转被限制在0°-180°的伺服电机。我们可以通过使用宽度变化的脉冲以最高精度控制电机的旋转以达到所需的角度。
每20毫秒(20000微秒)后向伺服电机提供一个脉冲。电机的角位置由该脉冲的长度决定。角度位置0°、90°和180°在代码中演示。
下面是用于控制伺服电机的PIC单片机接口的C代码,我们在编译器中编写以下与PIC接口的伺服电机代码:
void Rotation0() //0度
{
unsigned int i;
for(i=0;i<50;i++)
{
PORTB.F0 = 1;
Delay_us(800); //800us 脉冲
PORTB.F0 = 0;
Delay_us(19200);
}
}
void Rotation90() //90度
{
unsigned int i;
for(i=0;i<50;i++)
{
PORTB.F0 = 1;
Delay_us(1500); //1500us 的脉冲
PORTB.F0 = 0;
Delay_us(18500);
}
}
void Rotation180() //180 度
{
unsigned int i;
for(i=0;i<50;i++)
{
PORTB.F0 = 1;
Delay_us(2200); //2200us 的脉冲
PORTB.F0 = 0;
Delay_us(17800);
}
}
void main()
{
TRISB = 0; // PORTB作为输出端口
do
{
Rotation0(); //0度
Delay_ms(2000);
Rotation90(); //90度
Delay_ms(2000);
Rotation180(); //180度
}while(1);
}
代码开头已经声明了电机角旋转0°、90°和 180°的各个函数。在本教程中,我们没有使用PIC16F877A的实际脉冲宽度调制功能来生成脉冲。而是,脉冲是在程序延迟的帮助下产生的。特定角度的延迟持续时间等于电机旋转到相应角度所需的脉冲长度。也就是说,对于0°角,脉冲宽度约为800ms,因此在PORT引脚RB0设置为高时引入了800ms的延迟。同样,旋转90°需要1500ms的脉冲,180°角度需要2200ms。
在主程序中,将PORTB设置为输出端口,三个函数都被调用,它们之间有2000ms的延迟。该程序使电机以某种模式旋转,比如0°–90°–180°–0°等等。这将在无限循环“do-while”循环中持续运行,直到程序中止。
以上就是英锐恩单片机开发工程师分享的如何用单片机控制伺服电机?。英锐恩专注单片机应用方案设计与开发,提供8位单片机、16位单片机、32位单片机。