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

文章正文
发布时间:2024-12-07 02:03

目录

一、实验宗旨

        (1)把握ULN2003AN驱动阵列的本理&#Vff0c;相熟驱动模块的运用&#Vff1b;

        (2)相熟并了解步进电机的根柢本理&#Vff0c;相熟步进电机的运用办法&#Vff1b;

        (3)把握步进电机驱动电路的连贯办法

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

二、实验方法取环境

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

三、实验重点

        (1)步进实验电路连贯&#Vff1b;(2)步进电机驱动控制本理取运用办法&#Vff1b;(3)步进电机控制步调编写

四、实验难点

        (1)步进电机的步调控制

五、实验内容 5.1实验任务

        任务形容&#Vff1a;步进电机驱动电路搭建&#Vff1b;步进电机驱动步调&#Vff1b;步进电机角度控制、转速控制

5.2实验本理

        1.步进电机

        步进电机是将电脉冲信号改动成角位移或线位移的开环控制电机&#Vff0c;是现代数字步调控制系统中的次要执止元件&#Vff0c;是打印机、绘图仪、呆板人等方法的动力焦点&#Vff0c;使用极为宽泛。

        步进电机通过控制脉冲个数控制角位移抵达精确定位&#Vff0c;通过控制脉冲频次来控制步进电机转速和加快度抵达调理和控制电机转速。当步进驱动器接管到一个脉冲信号&#Vff0c;它就驱动步进电机按设定的标的目的动弹一个牢固的角度&#Vff0c;称为“步距角”或步进角&#Vff0c;它的旋转是以动弹牢固角度一步一步运止的。步进电机正在非超载状况下&#Vff0c;电机转速、进止位置只与决于脉冲信号的频次和脉冲数&#Vff0c;不受负载厘革的映响。

        如图所示&#Vff0c;给取4相5线连贯的28BYJ48型4相8拍步进电机&#Vff0c;是减速步进电机&#Vff0c;减速比为1:64&#Vff0c;步进角为5.625/64度&#Vff0c;动弹一圈须要360/(5.625/64) = 4096个脉冲信号。当对步进电机施加一系列间断不停的控制脉冲时&#Vff0c;使步进电机间断不转地动弹。每一个脉冲信号对应步进电机的某一项或两相绕组的通电形态扭转一次&#Vff0c;对应转子转过一个步进角&#Vff0c;通电形态的扭转完成一个循环时&#Vff0c;转子转过一个齿距。

        四相步进电机但凡有单4拍&#Vff08;A→B→C→D→A→„&#Vff09;、双4拍&#Vff08;AB→BC→CD→DA→AB→„&#Vff09;、8拍&#Vff08;A→AB→B→BC→C→CD→D→DA→A„&#Vff09;

        2.Stepper 库函数

        Stepper 是 Arduino 自带的库函数&#Vff0c;用于控制步进电机。

        头文件&#Vff1a;#include<Stepper.h>

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

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

        参数&#Vff1a;steps&#Vff0c;电机转一周须要的步数&#Vff08;脉冲数&#Vff09;&#Vff1b;pin1\pin2\pin3\pin4&#Vff0c;Arduino 的引脚

        Stepper 库函数的成员函数&#Vff1a;setSpeed()、step()

        setSpeed()

        罪能&#Vff1a;通过脉冲频次控制步进电机转速

        语法&#Vff1a;stepper.setSpeed(rpms)

        参数&#Vff1a;rpms&#Vff0c;脉冲频次

        step()

        罪能&#Vff1a;通过脉冲数控制电机动弹的角度

        语法&#Vff1a;stepper.step(steps)

        参数&#Vff1a;steps&#Vff0c;电机转过的步数&#Vff08;int 型&#Vff09;&#Vff0c;正负控制动弹标的目的

        Stepper 库函数步调示例&#Vff1a;

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

        3.ULN2003AN驱动模块

        UNL2003APG 驱动阵列

        ULN2003 是大电流驱动阵列&#Vff0c;多用于单片机、智能仪表、PLC、数字质输出卡等控制电路中。可间接驱 动继电器等负载。输入 5xTTL 电平&#Vff0c;输出可达 500mA/50x。

        ULN2003 使用电路正在主动化密集的的场折会有不少被控元件如继电器&#Vff0c;微型电机&#Vff0c;风机&#Vff0c;电磁阀&#Vff0c;空调&#Vff0c; 水办理等元件及方法&#Vff0c;那些方法但凡由 CPU 所会合控制&#Vff0c;由于控制系统不能间接驱动被控元件&#Vff0c;那须要由 罪率电路来扩展输出电流以满足被控元件的电流&#Vff0c;电压。    

        ULN2003 阵列驱动步进电机

        步进电机驱动电流很大&#Vff0c;用开发板供给电流无奈驱动&#Vff0c;须要用  ULN2003 芯片 IC 放大电流驱动步进电机

        4.步进电机实验电路

5.3 实验内容

        1.间接编写步调驱动步进电机动弹

        轨范 1&#Vff1a;连贯电路

        轨范 2&#Vff1a;编写步调

        // 步调示例1&#Vff0c;间接编程驱动两相四线制步进电机

#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; ZZZoidsetup(){ Serial.begin(9600); pinMode(IN1pin,OUTPUT); pinMode(IN2pin,OUTPUT); pinMode(IN3pin,OUTPUT); pinMode(IN4pin,OUTPUT); delay(1000); } ZZZoid 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; } ZZZoid stepper(int Vz){ for (int V=0;V<Vw;V++){ 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();//旋转标的目的控制函数 } } ZZZoid SetDirection(){// 步进电机标的目的控制 if(Direction==1){ steps++; } if(Direction==0){ steps--; } if(steps>7){ steps=0; } if(steps<0){ steps=7; } }

        轨范3&#Vff1a;步调调试

        2.挪用Stepper库函数驱动步进电机动弹

        轨范1&#Vff1a;连贯电路

        轨范2&#Vff1a;编写步调

        // 步调示例2&#Vff0c;Stepper库驱动步进电机

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

        轨范3&#Vff1a;步调调试

        3.步调扩展&#Vff1a;电位器正确控制步进电机动弹

        实验任务&#Vff1a;通过旋转电位器滑动头&#Vff0c;真现步进电机0-360°旋转的正确定位控制。

const int hudon=A0; int hdZZZalue; ZZZoid setup() { for (int i = 2; i < 6; i++) { pinMode(i, OUTPUT); } Serial.begin(9600); } ZZZoid 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); } } } ZZZoid 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); } } } ZZZoid loop() { hdZZZalue=analogRead(hudon); Serial.println(hudon); delay(500); clockwise(hdZZZalue); delay(10); anticlockwise(hdZZZalue); } 5.4实验结果

        结论&#Vff1a;连贯电路&#Vff0c;编写步调真现了电机动弹

        深思&#Vff1a;通过原次实验&#Vff0c;我学到了不少的知识&#Vff0c;把握了 ULN2003AN 驱动阵列的本理&#Vff0c;相熟驱动模块的运用&#Vff0c;相熟并了解步进电机的根柢本理&#Vff0c;通过连贯电路&#Vff0c;编写步调真现了电机动弹。相熟步进电机的运用办法。

        做品&#Vff1a;

        

5.5考虑题

1.正在消费取糊口中有哪些步进电机的使用&#Vff0c;试举例注明&#Vff1f;你能设想一款步进电机使用吗&#Vff1f;