直线电机的正反转控制
使用两个继电器实现电机的正反转,继电器接线如图所示
故正反转控制与继电器开关的关系为:
继电器 A | 继电器 B | 电机 |
---|---|---|
1 | 1 | 停转 |
1 | 0 | 反转 |
0 | 1 | 正转 |
0 | 0 | 停转 |
将继电器控制信号接至 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归零
}