这是我们使用MPLAB和XC8学习PIC单片机的第11个教程。在本教程中,我们将学习如何使用PIC单片机控制伺服电机。如果您已经使用过伺服电机,则可以跳过本教程的前半部分,但是如果您不熟悉伺服电机本身,请继续阅读。
到目前为止,我们已经涵盖了许多基本教程,例如LED与PIC一起闪烁,PIC中的计时器,LCD与LCD的接口,7段接口与使用PIC的ADC等。如果您是绝对的初学者,请在此处访问PIC教程的完整列表,以及开始学习。
在上一教程中,我们学习了如何使用PIC单片机生成PWM信号,这些信号是根据从电位计读取的值生成的。如果您已理解所有程序,那么恭喜您,您已经为伺服电机编写了代码。是的,伺服电动机响应PWM信号(我们在此处使用计时器创建),我们将在本教程中学习原因和方式。我们将模拟并构建该项目的硬件设置,您可以在本教程末尾找到详细的视频。
什么是伺服电机?
伺服电机是一种执行器(大多数为圆形),可以进行角度控制。伺服电机有很多类型,但是在本教程中,我们将专注于以下所示的业余伺服电机。
业余伺服器很受欢迎,因为它们是运动控制的廉价方法。他们为大多数R / C和机器人爱好者的需求提供了现成的解决方案。它们还消除了为每种应用定制设计控制系统的需要。
大多数业余伺服电机的旋转角度为0- 180°,但是如果您感兴趣的话,也可以使用360°伺服电机。本教程使用0- 180°伺服电机。基于齿轮的伺服电动机有两种,一种是塑料齿轮伺服电动机,另一种是金属齿轮伺服电动机。金属齿轮用于电机易磨损的地方,但价格昂贵。
伺服电机的额定值为kg / cm(千克/厘米),大多数业余伺服电机的额定值为3kg / cm或6kg / cm或12kg / cm。该公斤/厘米告诉您在特定距离下伺服电机可以举起多少重量。例如:如果负载悬吊在距电机轴1cm的位置,则6kg / cm的伺服电机应能够举起6kg,该距离越大,承载能力越小。在此处了解伺服电机的基础知识。
伺服电机与微控制器的接口:
爱好伺服电机与MCU的连接非常简单。伺服系统有三根导线。其中两个将用于电源(正和负),一个将用于从MCU发送的信号。在本教程中,我们将使用MG995金属齿轮伺服电机,该电机最常用于RC车,人形机器人等。MG995的图片如下所示:
伺服电机的颜色编码可能会有所不同,因此请检查各自的数据表。
所有伺服电机都直接在+ 5V电源轨上工作,但是我们必须谨慎考虑电机消耗的电流量,如果您打算使用两个以上的伺服电机,则应设计适当的伺服屏蔽。在本教程中,我们将仅使用一个伺服电动机来演示如何对PIC MCU进行编程以控制电动机。检查以下链接以将伺服电机与其他微控制器接口:
- 伺服电机与8051微控制器的接口
- 使用Arduino进行伺服电机控制
- Raspberry Pi伺服电机教程
- 带AVR单片机的伺服电机
使用PICF877A PIC单片机对伺服电机进行编程:
在开始为伺服电机编程之前,我们应该知道要发送哪种类型的信号来控制伺服电机。我们应该对MCU进行编程,以将PWM信号发送到伺服电机的信号线。伺服电机内部有一个控制电路,可读取PWM信号的占空比并将伺服电机轴定位在相应位置,如下图所示
每个伺服电动机都在不同的PWM频率上运行(本教程中使用的最常见频率是50HZ),因此请获取电动机的数据表,以检查伺服电动机在哪个PWM周期上工作。
Tower pro MG995的PWM信号的详细信息如下所示。
由此我们可以得出结论,我们的电机以20ms(50Hz)的PWM周期工作。因此,PWM信号的频率应设置为50Hz。我们在上一教程中设置的PWM频率为5 KHz,使用相同频率对我们无济于事。
但是,我们这里有一个问题。该PIC16F877A不能生成低频的PWM信号使用CCP模块。根据数据表,可以为PWM频率设置的最低可能值为1.2 KHz。因此,我们必须放弃使用CCP模块的想法,找到一种方法来制作自己的PWM信号。
因此,在本教程中,我们将使用计时器模块生成 频率为50Hz的PWM信号,并改变其占空比以控制伺服电机的角度。如果您不熟悉使用PIC的定时器或ADC,请回到本教程,因为由于我们已经在此处进行了介绍,因此我将跳过大多数内容。
我们使用32的预分频器初始化Timer模块,并使其每1us溢出。根据我们的数据表,PWM的周期应仅为20ms。因此,我们的接通时间和断开时间加在一起应该完全等于20ms。
OPTION_REG = 0b00000100; //具有外部频率的Timer0和32作为预分频器TMR0 = 251; //加载1us的时间值delayValue只能在0-256之间,只有TMR0IE = 1; //使能PIE1寄存器GIE = 1的定时器中断位;//启用全局中断PEIE = 1; //启用外围中断
因此,在我们的中断例程功能中,我们将RB0引脚打开指定的时间,然后在扩孔时间内将其关闭(20ms – on_time)。接通时间的值可以通过使用电位计和ADC模块来指定。中断如下所示。
oid interrupt timer_isr(){if(TMR0IF == 1)//定时器溢出{TMR0 = 252; / *装入计时器值,(注:由于TImer0需要两个指令周期来开始递增TMR0,所以Timervalue是100的101,* / TMR0IF = 0; //清除计时器中断标志count ++;} if(count> = on_time){ RB0 = 1; //补充LED闪烁的值}如果(count> =(on_time +(200-on_time))){RB0 = 0; count = 0;}}
在 while 循环内部 , 我们仅使用ADC模块读取电位计的值,并使用读取的值更新PWM的接通时间。
while(1){pot_value =(ADC_Read(4))* 0.039; on_time =(170-pot_value); }
这样,我们创建了一个PWM信号,其周期为20ms,占空比可变,可以使用电位计进行设置。完整的代码已在下面的代码部分中给出。
现在,让我们使用变形仿真来验证输出,然后继续使用我们的硬件。
电路原理图:
如果您已经看过PWM教程,那么本教程的原理图将是相同的,除了我们将添加伺服电机代替LED灯。
仿真和硬件设置:
借助Proteus仿真,我们可以使用示波器验证PWM信号,还可以检查伺服电机的旋转角度。仿真的快照很少,如下所示,其中,根据电位计可以看到伺服电机的旋转角度和PWM占空比发生变化。最后,进一步检查在不同PWM下旋转的完整视频。
如我们所见,伺服旋转角度根据电位计值而改变。现在,让我们继续进行硬件设置。
在硬件设置中,我们刚刚卸下了LED板,并添加了伺服电机,如上图所示。
硬件如下图所示:
以下视频显示了伺服电机如何对电位计的各个位置做出反应。
这就对了!!我们已经将伺服电机与PIC单片机连接了起来,现在您可以发挥自己的创造力并找到相应的应用。有很多使用伺服电机的项目。