直线电机的正反转控制

使用两个继电器实现电机的正反转,继电器接线如图所示

故正反转控制与继电器开关的关系为:

继电器 A继电器 B电机
11停转
10反转
01正转
00停转

将继电器控制信号接至 Arduino Digital 引脚,首先定义引脚代号

int ctrl_A = 4;          //正极继电器
int ctrl_B = 5;          //负极继电器

设置引脚模式为 OUTPUT

void setup() {
  pinMode(ctrl_A, OUTPUT);
  pinMode(ctrl_B, OUTPUT);
}

根据正反转控制与继电器开关的关系,构建控制函数

//前进
void ForwardR() {
  digitalWrite(ctrl_A, LOW);
  digitalWrite(ctrl_B, HIGH);
}
//后退
void ReverseR() {

  digitalWrite(ctrl_A, HIGH);
  digitalWrite(ctrl_B, LOW);
}
//暂停
void Pause() {
  digitalWrite(ctrl_A, LOW);
  digitalWrite(ctrl_B, LOW);
}

编码器数据获取

霍尔传感器特性为,电机静止时,A、B 两相信号为同相的方波,电机运动时,A、B 两相信号相差 1/4 周期

在 Arduino 中利用中断来判断编码器数据

将信号线连接至 Arduino 外部中断引脚 2、3,首先设置中断引脚。同时定义编码器计数变量 count

int sgn_A = 2;           //输入信号A中断口2
int sgn_B = 3;           //输入信号B中断口3
volatile int count = 0;  //编码器计数

编码器计数函数定义如下,每检测到 A、B 两相信号不同相,计数变量 count++

//编码器计数函数
void count_A() {
  if (digitalRead(sgn_B) != digitalRead(sgn_A))
  count++;
}

setup 中设置引脚模式,并设置外部中断,A相信号下降沿触发回调编码器计数函数

注意此处 pinMode 必须设置为 INPUT_PULLUP 否则可能无法正常触发中断

void setup() {
  pinMode(sgn_A, INPUT_PULLUP);
  pinMode(sgn_B, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sgn_A), count_A, FALLING);  //A下降触发
}

可利用串口输出 count 观察程序运行情况

void setup() {
  Serial.begin(57600);  //设置波特率
}

void loop() {
  Serial.println(count);  //串口输出编码器数值
}

利用串口控制电机运动

为便于调试,可利用串口控制电机运动

char ctrl;       //串口输入控制(1前进、2后退、0停止)

void setup() {
  Serial.begin(57600);  //设置波特率
}

void loop() {
  //串口控制函数段
  if (Serial.available() > 0) {
    ctrl = Serial.read();
  }
  if (ctrl == '1')
    ForwardR();  //前进
  if (ctrl == '2')
    ReverseR();  //后退
  if (ctrl == '0')
    Pause();     //暂停
  if (ctrl == '3')
    count = 0;   //count归零
}