【Arduino实验16 步进电机的控制】

这篇具有很好参考价值的文章主要介绍了【Arduino实验16 步进电机的控制】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、实验目的

二、实验设备与环境

三、实验重点

四、实验难点

五、实验内容

5.1实验任务

5.2实验原理

5.3 实验内容

5.4实验结果

5.5思考题


一、实验目的

        (1)掌握ULN2003AN驱动阵列的原理,熟悉驱动模块的使用;

        (2)熟悉并理解步进电机的基本原理,熟悉步进电机的使用方法;

        (3)掌握步进电机驱动电路的连接方法

        (4)编写并测试步进电机控制程序

二、实验设备与环境

        Arduino UNO套件、Arduino IDE、计算机、步进电机、ULN2003AN驱动模块等

三、实验重点

        (1)步进实验电路连接;(2)步进电机驱动控制原理与使用方法;(3)步进电机控制程序编写

四、实验难点

        (1)步进电机的程序控制

五、实验内容

5.1实验任务

        任务描述:步进电机驱动电路搭建;步进电机驱动程序;步进电机角度控制、转速控制

5.2实验原理

        1.步进电机

        步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,是打印机、绘图仪、机器人等设备的动力核心,应用极为广泛。

        步进电机通过控制脉冲个数控制角位移达到准确定位,通过控制脉冲频率来控制步进电机转速和加速度达到调节和控制电机转速。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”或步进角,它的旋转是以转动固定角度一步一步运行的。步进电机在非超载情况下,电机转速、停止位置只取决于脉冲信号的频率和脉冲数,不受负载变化的影响。

【Arduino实验16 步进电机的控制】

        如图所示,采用4相5线连接的28BYJ48型4相8拍步进电机,是减速步进电机,减速比为1:64,步进角为5.625/64度,转动一圈需要360/(5.625/64) = 4096个脉冲信号。当对步进电机施加一系列连续不断的控制脉冲时,使步进电机连续不转地转动。每一个脉冲信号对应步进电机的某一项或两相绕组的通电状态改变一次,对应转子转过一个步进角,通电状态的改变完成一个循环时,转子转过一个齿距。

        四相步进电机通常有单4拍(A→B→C→D→A→„)、双4拍(AB→BC→CD→DA→AB→„)、8拍(A→AB→B→BC→C→CD→D→DA→A„)

【Arduino实验16 步进电机的控制】

        2.Stepper 库函数

        Stepper 是 Arduino 自带的库函数,用于控制步进电机。

        头文件:#include<Stepper.h>

        Stepper stepper(steps,pin1,pin2) //两相步进电机实例对象

        Stepper stepper(steps,pin1,pin2,pin3,pin4) //四相步进电机实例对象

        参数:steps,电机转一周需要的步数(脉冲数);pin1\pin2\pin3\pin4,Arduino 的引脚

        Stepper 库函数的成员函数:setSpeed()、step()

        setSpeed()

        功能:通过脉冲频率控制步进电机转速

        语法:stepper.setSpeed(rpms)

        参数:rpms,脉冲频率

        step()

        功能:通过脉冲数控制电机转动的角度

        语法:stepper.step(steps)

        参数:steps,电机转过的步数(int 型),正负控制转动方向

        Stepper 库函数程序示例:

#include <Stepper.h>
#define STEPS 4096 // 常量 STEPS = 4096,表示转一圈的步数
//声明一个实例对象 myStepper,设置步数和接开发板 IN1~IN4 的数字口
Stepper myStepper(STEPS, IN1,IN2,IN3,IN4); //
void setup() {
    myStepper.setSpeed(2048); // 设置电机的转速 2048 步/分钟,半圈
    Serial.begin(9600); // 串口初始化
}
void loop() {
    Serial.println("shun");
    stepper.step(2048); // 顺时针旋转 2048 步
    delay(500);
    Serial.println("ni");
    stepper.step(-2048); // 逆时针旋转 2048 步
    delay(500);
} 

        3.ULN2003AN驱动模块

        UNL2003APG 驱动阵列

【Arduino实验16 步进电机的控制】

        ULN2003 是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱 动继电器等负载。输入 5VTTL 电平,输出可达 500mA/50V。

        ULN2003 应用电路在自动化密集的的场合会有很多被控元件如继电器,微型电机,风机,电磁阀,空调, 水处理等元件及设备,这些设备通常由 CPU 所集中控制,由于控制系统不能直接驱动被控元件,这需要由 功率电路来扩展输出电流以满足被控元件的电流,电压。    

        ULN2003 阵列驱动步进电机

        步进电机驱动电流很大,用开发板提供电流无法驱动,需要用  ULN2003 芯片 IC 放大电流驱动步进电机

        4.步进电机实验电路

【Arduino实验16 步进电机的控制】

5.3 实验内容

        1.直接编写程序驱动步进电机转动

        步骤 1:连接电路

        步骤 2:编写程序

        // 程序示例1,直接编程驱动两相四线制步进电机

#define IN1pin8
#define IN2pin9
#define IN3pin10
#define IN4pin11
int steps = 0;
booleanDirection = true;
unsigned long currentTime;
unsigned long lastTime = 0;
int stepsLeft = 4096;
//电机旋转一周的步数
long time= 0;
voidsetup(){
    Serial.begin(9600);                          
    pinMode(IN1pin,OUTPUT);
    pinMode(IN2pin,OUTPUT);
    pinMode(IN3pin,OUTPUT);
    pinMode(IN4pin,OUTPUT);
    delay(1000);
}
void loop(){
    while(stepsLeft>0){
        currentTime= micros();// 获取系统当前时间us数
        if(currentTime-lastLime>=1000){
            // 步间时间
            stepper(1);
            // 调用步进电机驱动控制函数
            time=time+micros()-lastTime;
            lastTime=micros();
            stepsLeft--;
        }
    }
    Serialprint("Time is:");
    Serial.println(time);
    Serial.println("Wait...!");
    delay(2000);
    Direction=!Direction;stepsLeft=4096;
}
void stepper(int xz){
    for (int x=0;x<xw;x++){
    switch(steps){
        case 0:
            digitalWrite(IN1pin, LOW);
            digitalWrite(IN2pin, LOW);
            digitalWrite(IN3pin, LOW);
            digitalWrite(IN4pin, HIGH);
            break;
        case 1:
            digitalWrite(IN1pin, LOW);
            digitalWrite(IN2pin, LOW);
            digitalWrite(IN3pin, HIGH);
            digitalWrite(IN4pin, HIGH);
            break;
        case 2:
            digitalWrite(IN1pin, LOW);
            digitalWrite(IN2pin, LOW);
            digitalWrite(IN3pin, HIGH);
            digitalWrite(IN4pin, LOW);
            break;
        case 3:
            digitalWrite(IN1pin, LOW);
            digitalWrite(IN2pin, HIGH);
            digitalWrite(IN3pin, HIGH);
            digitalWrite(IN4pin, LOW);
            break;
        case 4:
            digitalWrite(IN1pin, LOW);
            digitalWrite(IN2pin, HIGH);
            digitalWrite(IN3pin, LOW);
            digitalWrite(IN4pin, LOW);
            break;
        case 5:
            digitalWrite(IN1, HIGH);
            digitalWrite(IN2, HIGH);
            digitalWrite(IN3, LOW);
            digitalWrite(IN4, LOW);
            break;
        case 6:
            digitalWrite(IN1pin, HIGH);
            digitalWrite(IN2pin, LOW);
            digitalWrite(IN3pin, LOW);
            digitalWrite(IN4pin, LOW);
            break;
        case 7:
            digitalWrite(IN1pin, HIGH);
            digitalWrite(IN2pin, LOW);
            digitalWrite(IN3pin, LOW);
            digitalWrite(IN4, HIGH);
            break;
        default:
            digitalWrite(IN1pin, LOW);
            digitalWrite(IN2pin, LOW);
            digitalWrite(IN3pin, LOW);
            digitalWrite(IN4pin, LOW);
            break;
        }
        SetDirection();//旋转方向控制函数
    }
}
void SetDirection(){// 步进电机方向控制
    if(Direction==1){
        steps++;
    }
    if(Direction==0){
        steps--;
    }
    if(steps>7){
        steps=0;
    }
    if(steps<0){
        steps=7;
    }
}

        步骤3:程序调试

        2.调用Stepper库函数驱动步进电机转动

        步骤1:连接电路

        步骤2:编写程序

        // 程序示例2,Stepper库驱动步进电机

//Stepper.h库函数驱动#
include<Stepper.h>
// 设置步进电机旋转一圈的步数
#define steps4096
// 步进电机转一周的步数(脉冲数)
//步进电机实体对象与驱动板上引脚接口IN1~IN4
int IN1pin= 8;
int IN2pin= 9;
intIN3pin= 10;
int IN4pin= 11;
Stepper myStepper(steps,IN1pin,IN2pin,IN3pin,IN4pin);
void setup(){
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(11,OUTPUT);
    myStepper.setSpeed(4096);// 设置电机转速每分钟为4096步
    Serial.begin(9600);// 初始化串口,以监测调试信息
}
void loop(){
    // 顺时针旋转一周
    Serial.println("shun");
    myStepper.step(4096);
    //旋转一周
    delay(500);
    // 逆时针旋转半周
    Serial.println("ni");
    myStepper.step(-2048);
    delay(500);
}

        步骤3:程序调试

        3.程序扩展:电位器精确控制步进电机转动

        实验任务:通过旋转电位器滑动头,实现步进电机0-360°旋转的精确定位控制。

const int hudon=A0;
 int hdvalue;
void setup() {
  for (int i = 2; i < 6; i++) {
    pinMode(i, OUTPUT);
  }
  Serial.begin(9600);
 
}

void clockwise(int num)
{
  for (int count = 0; count < num; count++)
  {
    for (int i = 2; i < 6; i++)
    {
      digitalWrite(i, HIGH);
      delay(3);
      digitalWrite(i, LOW);
    }
  }
}

void anticlockwise(int num)
{
  for (int count = 0; count < num; count++)
  {
    for (int i = 5; i > 1; i--)
    {
      digitalWrite(i, HIGH);
      delay(3);
      digitalWrite(i, LOW);
    }
  }
}

void loop() {
  hdvalue=analogRead(hudon);
  Serial.println(hudon);
  delay(500);
 
      
  clockwise(hdvalue);
  delay(10);
  anticlockwise(hdvalue);
}

5.4实验结果

        结论:连接电路,编写程序实现了电机转动

        反思:通过本次实验,我学到了很多的知识,掌握了 ULN2003AN 驱动阵列的原理,熟悉驱动模块的使用,熟悉并理解步进电机的基本原理,通过连接电路,编写程序实现了电机转动。熟悉步进电机的使用方法。

        作品:

        【Arduino实验16 步进电机的控制】

5.5思考题

1.在生产与生活中有哪些步进电机的应用,试举例说明?你能设计一款步进电机应用吗?文章来源地址https://www.toymoban.com/news/detail-402646.html

到了这里,关于【Arduino实验16 步进电机的控制】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止

    问题描述 按下第一个按键使步进电机可以正转、第二个反转反转、第三个按键停止 矩阵按键控制 画了张矩阵按键的内部电路图: 矩阵按键实物图: ABC 按键右边的就是步进电机。 按键第一行连接的是寄存器 GPFDAT0 的端口 第二行连接的是寄存器 GPFDAT2 的端口 第三行连接的是

    2024年02月09日
    浏览(26)
  • Arduino 下用A4988或TMC2209驱动42步进电机

    在DIY黑胶唱机的过程中,准备用一个42步进电机带动唱盘,需要恒定的每分钟33.33转的转速。 记录一下折腾的过程。 用洞洞板制作的驱动电路: 驱动板接线图 先拿价格便宜很多的A4988做实验 按照接线图在面包板上把线接好。 Ardunio代码如下: 代码主要使用了Timer1定时器。需

    2024年02月11日
    浏览(24)
  • STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    该篇文章中用到的步进电机闭环驱动器为Emm42_V4.0步进电机闭环驱动器。该闭环驱动器自带FOC矢量闭环控制算法,能实现力矩、速度、位置三环控制。 如下图所示,该42步进闭环电机驱动器的A+、A-、B+、B-连接步进电机,通过右侧的使能、脉冲、方向端对步进电机进行驱动控制

    2024年02月01日
    浏览(38)
  • STM32控制42步进电机

    首先采用TB6600驱动外接12VDC电源。 STM32选c8t6最小系统板 接线TB6600跟32接线有共阴级接法(把ENA-,DIR-,PUL-与32共地)也有共阳接法(把ENA+,DIR+,PUL+与32共地)。这里选共阴级接法。 判断42步进电机的4根线哪两根是A相(A-和A+),哪两根是B相(B-和B+),方法:将任意两根线短接起来

    2024年02月16日
    浏览(54)
  • STM32自学笔记16-步进电机驱动项目-磁编码器的校准

    上节我把MT6816的驱动给大致整明白了,接下去需要看看如何 校准 。 为什么编码器需要校准? 如上节所说,MT6816是一款 绝对值编码器 ,它为每个测量位置分配了唯一的二进制代码或字, 即使断电,也可以跟踪编码器的确切位置 。 但是由于硬件或其他因素的影响,编码器输

    2024年02月16日
    浏览(85)
  • 闭环控制步进电机对比传统开环控制的优点

    在工业自动化中,步进电机的应用非常的广泛,例如工业机器人、3D打印机、计算机硬盘等都有步进电机的身影。传统的步进电机可以控制转子的角度位置,而不需要传感器来控制位置,是一种开环控制系统,在这样的控制方式下,步进电机控制脉冲的输入并不依赖于转子的

    2023年04月17日
    浏览(39)
  • 51单片机——步进电机实验,小白讲解,相互学习

    步进电机简介:         步进电机是将电脉冲信号转变为角位移或多线位移的开源控制元件。在非超载的情况下,电机的转速,停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性的关系的存在

    2024年02月04日
    浏览(25)
  • 51单片机对步进电机的控制

    首先打开proteus软件,导入元器件并连线。 接着了解一下步进电机:  步进电机的特点:  步进电机的驱动芯片:  l298步进电机驱动芯片各引脚的功能:  L298的逻辑功能表  四相步进电机的工作原理:  接下来就是proteus中导入步进电机的方法:  proteus中导入L298芯片的方法:

    2024年02月09日
    浏览(31)
  • 干货 | 提高步进电机运行质量的电流控制方法

    A双极性步进电机的基础知识 双极性步进电机包含两绕组,为了使电机运行平稳,不断的给这两个线圈加以相位差90度的正弦波,步进电机就开始转动起来。 通常,步进电机不是由模拟线性放大器驱动;而是由PWM电流调节驱动,把线性的正弦波信号转换成了离散的直线段信号

    2024年02月08日
    浏览(35)
  • STM32基于CAN总线协议控制步进电机

    如上图所示,实现了以下功能: 1.两块stm32单片机通过CAN控制器与收发器进行半双工通信; 2.stm32主机通过检测按键,切换不同的模式,将不同模式的case值发送给stm32从机; 3.stm32从机根据收到的case值,控制步进电机进行不同的运动操作; 4.OLED用于显示收发内容与按键状态等

    2024年01月19日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包