最近的一个想法是用编码器的旋转来控制步进电机,旋转编码器的转一圈发出的脉冲和小步进电机28BYJ-48转一圈所需的脉冲不一样,不能做到手转一圈编码器,步进电机也同步转一圈。而且手转的速度,这个64减速比的小电机也跟不上。但是能实现电机转动和编码器转动的方向一致。电机转动很顺滑。
实现方法是:编码器A相产生中断,就在中断里面给步进电机发一个脉冲。
#include <AccelStepper.h>
#define encoder0PinA 2
#define encoder0PinB 4
#define motorPin1 8 // Blue - 28BYJ-48 pin 1
#define motorPin2 9 // Pink - 28BYJ-48 pin 2
#define motorPin3 10 // Yellow - 28BYJ-48 pin 3
#define motorPin4 11 // Orange - 28BYJ-48 pin 4
AccelStepper stepper(8,motorPin1,motorPin3,motorPin2,motorPin4);
volatile unsigned int encoder0Pos = 0;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // 管脚配置
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // 管脚配置
stepper.setMaxSpeed(1000);
attachInterrupt(0, doEncoder, CHANGE); // 中断配置
}
void loop()
{
// 啥也不做
}
void doEncoder()
{
if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB))
{
encoder0Pos++;
stepper.setSpeed(-800);
stepper.runSpeed();
}
else
{
encoder0Pos--;
stepper.setSpeed(800);
stepper.runSpeed();
}
}
这里用到了 <AccelStepper.h>库,可以在这个链接下载
旋转编码器的使用请看我之前发布的文章
stepper.setSpeed(800);通过改变速度的正负值就可以设定旋转的方向。
attachInterrupt(0, doEncoder, CHANGE);这里选用CHANGE脉冲改变就进入中断,目的是在编码器旋转产生一个周期的时候,能过产生4次变化,这样电机就能得到更多的脉冲信号。
stepper(8,motorPin1,motorPin3,motorPin2,motorPin4);这里的8表示半步运行,旋转一圈需要4096的脉冲,如果是4就是全部运行,但是速度就不能设置成示例中的800了,否则电机会丟步。