风筝
发表于: 2020-4-8 17:26:29 | 显示全部楼层

在本篇文章中,我们将学习如何使用电位器和Arduino开发板实现步进电机控制。步进电机可用于软盘驱动器、平板扫描仪、计算机打印机、绘图仪、图像扫描仪、光盘驱动器、智能照明、相机镜头、CNC机器以及最近比较流行的3D打印机。


因此,在本文中我们将学习有关步进电机及其应用的基础知识。我们还将步进电机与Arduino进行连接。步进电机的运动和旋转方向将通过电位器控制。


什么是步进电机

stepper-motor-ctrl.jpg

步进电动机(stepper motor)是一种无刷直流电动机,它将完整的全周长分为多个相等的步长。然后可以命令电机的位置移动并保持在其中一个步进,而无需任何位置传感器进行反馈(开环控制器),只要在转矩和速度方面仔细选择适合电动机尺寸的电动机即可。


步进电机的构造和工作原理

步进电机以其特性而闻名,它将一系列输入脉冲(通常为方波脉冲)转换为轴位置中精确定义的增量。每个脉冲将轴移动固定角度。

STEPPER-MOTOR-working-1024x604.png

实际上,步进电机具有多个“带齿”电磁铁,围绕中央齿轮状铁片排列。电磁铁由外部驱动器电路或微控制器供电。为了使电动机轴旋转,首先,给电磁铁供电,该电磁铁以磁性方式吸引齿轮的齿。当齿轮的齿与第一个电磁铁对齐时,它们与下一个电磁铁稍有偏移。这意味着当下一个电磁铁打开并且第一个电磁铁关闭时,齿轮会轻微旋转以与下一个电磁铁对齐。然后从该处开始重复该过程。这些旋转中的每一个都称为一个“步”,其中整数个步进行完整的旋转。这样,电动机可以旋转一个精确的角度。


电磁铁的圆形排列分为几组,每组称为一个相,每组中有相等数量的电磁铁。组数由步进电机的设计者选择。每组的电磁铁与其他组的电磁铁交错以形成均匀的布置图案。例如,如果步进电动机具有两个组,分别标识为A或B,总共有十个电磁铁,则分组模式将为ABABABABAB。


同一组中的电磁铁都一起通电。因此,具有更多相位的步进电动机通常具有更多的导线(或引线)来控制电动机。


所需的组件

为了学习使用电位器和Arduino控制步进电机,我们需要以下组件:

●    Arduino UNO开发板

●    ULN2003驱动芯片

●    10K电位器

●    步进电机28-BYJ48

●    面包板和连接线


电路连接图

以下是Arduino控制步进电机的电路图:

Stepper-motor-arduino-circuit-diagram.png


步进电动机28-BYJ48是一个具有5引线线圈布置的单极电动机。必须按特定顺序为四个线圈通电。红线连接到+ 5V电压,其余四根线将被拉到接地以触发相应的线圈。我们使用Arduino开发板以特定顺序为这些线圈通电,并使电动机执行所需的步数。

Stepper-motor-wires.png


步进电机需要借助驱动器芯片才能进行操作。原因是控制器需要较高的电流才能运行,但是仅步进电机将无法从其I / O引脚提供足够的电流来使电机运行。因此使用ULN2003作为驱动模块,电流被放大了。

ULN2003IC_LRG.jpg


步数计算

在将代码上传到Arduino板上之前需要进行步数计算


在Arduino中,我们将以4步顺序操作电机,因此需要计算步幅角(Stride Angle)。

步幅角= 5.625°

Arduino步骤顺序= 4

所需步骤顺序= 8

步数角度= 5.625 * 2 = 11.25

每转的步数= 360 /步角= 360 / 11.25 =每转32步。


源代码/程序:

  1. #include <Stepper.h> // Include the header file
  2. #define STEPS 64

  3. Stepper stepper(STEPS, 8, 10, 9, 11);

  4. int Pv = 0;
  5. int potV = 0;

  6. void setup() {
  7. Serial.begin(9600);
  8. stepper.setSpeed(200);
  9. }
  10. void loop() {

  11. potV = map(analogRead(A0),0,1024,0,360);
  12. if (potV>Pv)
  13. stepper.step(5);
  14. if (potV<Pv)
  15. stepper.step(-5);

  16. Pv = potV;
  17. Serial.println(Pv);
  18. }
复制代码

Stepper-motor-Control-with-Potentiometer-and-Arduino.jpg
跳转到指定楼层
wakerjiang
发表于: 2020-5-29 11:41:18 | 显示全部楼层

// 电位器控制stepper 增加去抖 效果

#include <AccelStepper.h>

// Define step constant
#define FULLSTEP 4
#define ANALOG_IN A0
int val;
int chuan;

// Creates an instance
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper stepper(FULLSTEP, 8, 10, 9, 11);
const int buttonPin = 2;  
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

void setup() {

  stepper.setMaxSpeed(1000.0);
  stepper.setAcceleration(50.0);
  //stepper.setSpeed(10);
// stepper.moveTo(255);
// stepper.setSpeed(500);
  int val = analogRead(A0);
  int chuan = map(val, 0, 1023, 0, 800);

// pinMode(buttonPin, INPUT);
}

void loop() {

              int x = analogRead(A0);

              if(abs(x-val)>100)val=x;
              chuan = map(val, 0, 1023, 0,800);
            //  if (stepper.isRunning() == false){
              stepper.moveTo(chuan);
              //}
              stepper.setSpeed(500);
            //  stepper.moveTo(255);
              stepper.runSpeedToPosition();
               stepper.stop();
             // stepper.run();
         
            }
回复

使用道具 举报

wakerjiang
发表于: 2020-5-29 17:31:50 | 显示全部楼层

// 使用IR 传感器 中断方式控制 stepper
#include <AccelStepper.h>

// Define step constant
#define FULLSTEP 4

// int step_num=700;         // 用了stepper.step() 没有成功

// Creates an instance
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper stepper(FULLSTEP, 8, 10, 9, 11);

void setup() {
  pinMode(7,OUTPUT);
  
  stepper.setMaxSpeed(1000.0);
  stepper.setAcceleration(50.0);
  //stepper.setSpeed(500);
  //stepper.moveTo(2038);

  attachInterrupt(digitalPinToInterrupt(3), IR_detected, RISING);
}
boolean led_On = false;

void loop()
{
  if (led_On)
  {
   delay(6000);
   digitalWrite(7,LOW);
   led_On=false;
    }
   stepper.setSpeed(500);                     // setspeed 在set up 里会导致中断后的转动变慢了
   stepper.runSpeed();

}

void IR_detected()
{
      
                                                //   stepper.runToNewPosition(10);
                                                 //  delay(1000);
                                                  //stepper.runToNewPosition(500);
   
     digitalWrite(7,HIGH);
     led_On=true;
     stepper.stop();                     // 不能stop runToNewPosition,可以stop stepper.run()
     
                                          //  stepper.step(1);
      
  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-26 05:58 , Processed in 0.045401 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表