arduino旋转编码器控制步进电机

最近的一个想法是用编码器的旋转来控制步进电机,旋转编码器的转一圈发出的脉冲和小步进电机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了,否则电机会丟步。

arduino旋转编码器控制步进电机

上一篇:oracle备份之备份测试脚本(冷备、热备、rman)


下一篇:【剑指Offer】48.最长不含重复字符的子字符串(JS实现)(动态规划)