51单片机电机控制模拟(4)闩锁电磁阀

闩锁(Latching)电磁阀是利用电流脉冲或内部永磁材料来保持设定位置,而无需持续施加电流。

虽然工作原理与所有线性电磁阀相似,但闩锁式电磁阀的不同之处在于电极性对于获得正确操作非常重要。当电流沿一个方向流动时,会为螺线管中的线圈场提供能量,这会增加永磁体的拉力。衔铁(armature)被吸引到螺线管体内的固定极(pole)上。

图片

一旦衔铁移动了全部行程并与固定极接触,它将保持在此位置而无需任何进一步的电力输入。这是因为永磁体可以在不施加电源的情况下,在磁路中产生一个小的磁通量,使得衔铁和固定极片之间互相吸引。要将螺线管从此保持位置释放,必须通过将电流沿相反方向送回线圈场来取消“保持”磁铁的吸引力。

当脉冲时间与保持时间相比非常短时,闩锁式电磁阀效率最高。虽然可用于短行程和长行程应用,但应尽量缩短螺线管行程以提高效率。

所以要正确驱动这种电磁阀,就需要施加两个不同方向的电流。如果要改变电流的方向,就必须要用到我们前面提到的H桥电路

让我们尝试在Proteus中模拟驱动电磁阀。

先采用单片机加H桥电路的驱动方式,建立以下电路图:

图片

从左到右分别为8051单片机,L293D H桥驱动,由于Proteus没有电磁阀,我们这里选用了一个latching类型的继电器,然后加了一个LED灯来模拟电磁阀的打开和关闭。

图片

单片机的代码如下:

#include <reg51.h>
#include <stdio.h>

// Define motor control pins
sbit IN1 = P2^0; // Motor direction pin 1
sbit IN2 = P2^1; // Motor direction pin 2

// Function to introduce delay
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 123; j++);
}

void main(void)
{ 
    IN1 = 0;
    IN2 = 0;
   // Write your code here
   while (1){
        IN1 = 1;       // Set IN1 high
        IN2 = 0;       // Ensure IN2 is low
        delay_ms(20);  // High for 20ms 

        IN1 = 0;       // Set IN1 low
        delay_ms(20);  // Low for 20ms 
      
        delay_ms(2000);

        // If you want to alternate between IN1 and IN2:
        IN1 = 0;       // Set IN1 low
        IN2 = 1;       // Set IN2 high
        delay_ms(20);  // High for 20ms 

        IN2 = 0;       // Set IN2 low
        delay_ms(20);  // Low for 20ms
      
        delay_ms(2000);
      }
      ;
 }

运行结果单片机应产生一个20ms的脉冲,命令继电器以2s的间隔打开和关闭。

图片

将示波器接入IN1和IN2可以得到以上波形

图片

运行结果:继电器以每隔两秒的频率打开和关闭

单片机虽然功能强大,但是有时候考虑到能耗,成本和空间,未必是最优解。这里其实我们只需要单片机产生一个脉冲,可以考虑使用555芯片。555芯片的使用在这篇文章中有详细介绍。

下面的电路图是一种思路,采用两个555芯片(或者一个带有双时钟的556芯片)加一个H桥驱动,555芯片模式设为单稳态,按一下按钮就可以产生一个固定脉冲长度的方波。

图片
图片

另一个思路是采用555+D flipflop+H bridge,555设为无稳态作为时钟信号输入。D flip-flop接收控制信号来源。

图片

D类型FlipFlop示意图如下,作用就是可以把一个输入信号D变为两个相反的信号从Q和Q-bar(Q-bar对Q取反)输出:

图片

真值表:

ClockDQnext
Rising edge00
Rising edge11
Non-risingXQ
图片

运行示意:采用0.5Hz的方波作为D输入源