目录
一、实验目的
(1)掌握ULN2003AN驱动阵列的原理,熟悉驱动模块的使用;
(2)熟悉并理解步进电机的基本原理,熟悉步进电机的使用方法;
(3)掌握步进电机驱动电路的连接方法
(4)编写并测试步进电机控制程序
二、实验设备与环境
Arduino UNO套件、Arduino IDE、计算机、步进电机、ULN2003AN驱动模块等
三、实验重点
(1)步进实验电路连接;(2)步进电机驱动控制原理与使用方法;(3)步进电机控制程序编写
四、实验难点
(1)步进电机的程序控制
五、实验内容
5.1实验任务
任务描述:步进电机驱动电路搭建;步进电机驱动程序;步进电机角度控制、转速控制
5.2实验原理
1.步进电机
步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,是打印机、绘图仪、机器人等设备的动力核心,应用极为广泛。
步进电机通过控制脉冲个数控制角位移达到准确定位,通过控制脉冲频率来控制步进电机转速和加速度达到调节和控制电机转速。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”或步进角,它的旋转是以转动固定角度一步一步运行的。步进电机在非超载情况下,电机转速、停止位置只取决于脉冲信号的频率和脉冲数,不受负载变化的影响。
如图所示,采用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„)
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 驱动阵列
ULN2003 是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱 动继电器等负载。输入 5VTTL 电平,输出可达 500mA/50V。
ULN2003 应用电路在自动化密集的的场合会有很多被控元件如继电器,微型电机,风机,电磁阀,空调, 水处理等元件及设备,这些设备通常由 CPU 所集中控制,由于控制系统不能直接驱动被控元件,这需要由 功率电路来扩展输出电流以满足被控元件的电流,电压。
ULN2003 阵列驱动步进电机
步进电机驱动电流很大,用开发板提供电流无法驱动,需要用 ULN2003 芯片 IC 放大电流驱动步进电机
4.步进电机实验电路
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 驱动阵列的原理,熟悉驱动模块的使用,熟悉并理解步进电机的基本原理,通过连接电路,编写程序实现了电机转动。熟悉步进电机的使用方法。
作品:
5.5思考题
1.在生产与生活中有哪些步进电机的应用,试举例说明?你能设计一款步进电机应用吗?