目录
步进电机28BYJ-48的驱动(arduino平台,STM32),最全的驱动详细原理,驱动电路分析,驱动代码解释
前言
一、步进电机28BYJ-48结构和工作原理
1.基本知识:
2.步进电机28BYJ-48结构:
3.步进电机的控制的基本概念
4.步进电机28BYJ-48工作原理
5.步进电机的驱动拍数设定模式
6.步进电机的驱动参数解读
二、驱动电路分析和使用
1.ULN2003驱动电路
2.L298N小功率驱动电路
三.驱动代码分析
1.ULN2003驱动代码分析
(1)驱动库:
(2)应用案例:
2.L298N驱动代码分析
(1)驱动库
(2)应用案例
四、Arduino STM32驱动参考代码下载
1.ULN200驱动库下载链接:
2.L298N驱动库下载链接:
3.STM32驱动库链接:
总结
在本网站查找了很多资料,收益匪浅,今来研究了步进电机28BYJ-48的驱动,查了很多资料,发现介绍不够详细,没有抓到关键点,特别是原理,只有原理清楚才能实现精确控制。因此写了本文,借用一些作者的资源,表示感谢,以飨读者,回报大家!
提示:以下是本篇文章正文内容,下面案例可供参考
步进电机:是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB),后两种常用。
步进电机控制特点:1、它是通过输入脉冲信号来进行控制的。2、电机的总转动角度由输入脉冲数决定。3、电机的转速由脉冲信号频率决定。
arduino自带的steper驱动库,针对两相电机,而我们驱动的28BYJ48步进电机时四相的,直接使用不可以,笔者试用发现电机嗯嗯响不转动,如果要用自带库,可以对电机接线进行调换改造,或者修改驱动里的拍子表,太麻烦一些。
我们采用自建的驱动库,知道工作原理,驱动库可以自建。
/*
* 用法:
1、把Stepper28BYJ48.zip解压在libraries目录下
2、电机通过ULN2003驱动板和ULN2803驱动板测试通过
3、驱动的输入依次接arduino的8~9,步进电机依次接蓝,粉,黄,橙。
*/
// ensure this library description is only included once
#ifndef Stepper28BYJ48_h
#define Stepper28BYJ48_h
// library interface description
class Stepper {
public:
// constructors:
Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2,
int motor_pin_3, int motor_pin_4);
// speed setter method:
void setSpeed(long whatSpeed);
// mover method:
void step(int number_of_steps);
private:
void stepMotor(int this_step);
int direction; // Direction of rotation
int speed; // Speed in RPMs
unsigned long step_delay; // delay between steps, in ms, based on speed
int number_of_steps; // total number of steps this motor can take
int pin_count; // how many pins are in use.
int step_number; // which step the motor is on
// motor pin numbers:
int motor_pin_1;
int motor_pin_2;
int motor_pin_3;
int motor_pin_4;
unsigned long last_step_time; // time stamp in us of when the last step was taken
};
#endif
/*
控制28BYJ48电机,正转一圈,反转一圈
*/
#include
const int stepsPerRevolution = 4096; //28BYJ48电机旋转一周需要的步数
// 电机接在引脚8 ~ 11: 电机线依次为蓝,粉,黄,橙
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
int stepCount = 0; // number of steps the motor has taken
void setup() {
// initialize the serial port:
Serial.begin(9600);
//设置电机转速r/min
myStepper.setSpeed(10);
}
void loop() {
// 正转一圈
myStepper.step(stepsPerRevolution);
Serial.print("steps:" );
Serial.println(stepsPerRevolution);
delay(5000);
// 反转一圈
myStepper.step(-stepsPerRevolution);
Serial.print("steps:" );
Serial.println(-stepsPerRevolution);
delay(5000);
// 正转64步
myStepper.step(64);
Serial.print("steps:" );
Serial.println(64);
delay(5000);
// 正转64步
myStepper.step(64);
Serial.print("steps:" );
Serial.println(64);
delay(5000);
}
参考网上驱动库,经过我修改完善,运行很好。
// library interface description
//二相步进电机可以用arduino IDE 自带的实例里的程序和库驱动,。但是 Steper_28BYJ48四相的驱动不了
class Steper_28BYJ48 {
public:
// constructors:
Steper_28BYJ48(unsigned int speed_ratio,unsigned int beat_mode, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4);
// mover method:
void step(int degree_to_move);
//set speed
void setSpeed(unsigned int step_delay);
void lowPower_idel();
private:
unsigned int beat_mode; //1:EightBeat��2:FourBeat��3:DoubleFourBeat
unsigned int step_delay; // delay between steps, in ms, based on speed
unsigned int speed_ratio ;
// motor pin numbers:
int motor_pin_1;
int motor_pin_2;
int motor_pin_3;
int motor_pin_4;
};
应用这个库编写了案例,实现功能,通过串口1进行交互,输入转动角度,实现控制电机转动角度,修改代码可以体验驱动步进电机拍数3种模式,1:EightBeat,2:FourBeat,3:DoubleFourBeat
代码使用说明在程序头部。
/*接线:务必不要错了,不然查错非常头大!
L298输入1-4 对应 arduino数字端口 8,9,10,11
L298电路板输出有两种接口,一种是有步进电机的卡扣端子ABCD+vcc,一种是输出端子:out1--A+白,OUT2--A-蓝,out3--B+黄,out4--B-绿,电源端接红线5V
或者 红线接电源5V,橙色电线接out4口,黄色电线接out3口,粉色电线接out2口,蓝色接out1口根据提示进行接线。
//思路是通过减速比来控制单步执行的脉冲次数,电机是减速比16,电机每一个脉冲前进5.625度,而主轴前进5.625/16=0.3515625度,但经过我测试,这种玩具级的电机主轴低于5.625度步进的精度是无法保障的,因此我简化了代码,每步执行16次脉冲。
//接线顺序是红->﹢5V,橙黄粉蓝分别接L298N 的OUT1、OUT2、OUT3、OUT4, arduino的8,9,10,11分别接L298N的IN1-IN4
*/
/*28BYJ-48步进电机的齿轮减速比常见有两种,1:16,1:64,
* 步距角:θ=360度/(转子齿数J*运行拍数),齿数为8,八拍运行,电机主轴的步距角为θ=360度/(8*8)=5.625度(俗称半步),在除以减速比64,所以输出轴的步距角:5.625/64。
电机参数表中的减速比这个参数吧——1:64,转子转64圈,最终输出轴才会转一圈,也就是需要64*64=4096个节拍输出轴才转过一圈,2 ms*4096=8192 ms,8秒多才转一圈4096个节拍转动一圈,那么一个节拍转动的角度——步进角度就是360/4096,看一下表中的步进角度参数5.625/64。
要输出某一角度degree,求输出步数N=(degree*减速比)*(齿数*运行拍数)/360
启动频率是≥550,单位是 P.P.S,即每秒脉冲数,这里的意思就是说:电机保证在你每秒给出550个步进脉冲的情况下,可以正常启动。那么换算成单节拍持续时间就是 1 s/550=1.8 ms,为了让电机能够启动,我们控制节拍刷新时间大于 1.8 ms 就可以了。
减速比为1:64情况下
4步控制信号序列:11.25度/步,主电机32步旋转一周。
8步控制信号序列:5.625度/步,主电机64步旋转一周,减速轴旋转一周将用:64(步/周)X64(齿轮比) = 4096 步
测试电机减速比为1:16,8拍模式下旋转一周将用:64(步/周)X16(齿轮比) = 1024 步。*/
#include "Steper_28BYJ48.h" //自带驱动,也可以加入驱动库
Steper_28BYJ48 steper(16, 1, 8, 9, 10, 11);
//6个参数为:第1个是步进电机减速比,第2个是步进电机拍数模式设定,1:EightBeat,2:FourBeat,3:DoubleFourBeat,另外4个驱动引脚
int degree; //转动的角度,负值为逆时针方向。
String inString = ""; // 用于转换数字的字符串缓冲区
String read_String = "";
unsigned char dir = 3; //1顺时针方向。clockwise,2逆时针。3,空闲等待。
void setup() {
Serial.begin(9600); //初始化串口,作为监视。
steper.setSpeed(3);//节拍刷新时间,一般要大于2ms// delay between steps, in ms, based on speed,if delay<2ms,lost step.so delay must be more than 3ms
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// 发送信息
Serial.println("Please input MOTOR diretion and turn degree(eg,-24,mean,counterclockwise,24 du)");
}
void loop() {
int inChar;
// 读取串口发送的信息:
while (Serial.available() > 0)
{
inChar = Serial.read();
read_String += (char)inChar;
delay(2);
}
if (read_String.length() != 0) {
Serial.println("**********************************************************************");
Serial.print("serial port read_string:");
Serial.println(read_String);
if (read_String.charAt(0) == '-')
{
dir = 0;
Serial.print("turn direction:");
Serial.println("CounterClockWise");
degree = (read_String.substring(1)).toInt();
}
else
{
Serial.print("turn direction:");
Serial.println("ClockWise");
dir = 1;
degree = read_String.toInt();
}
read_String = "";
}
if (dir == 1)//CW
{
steper.step(degree);
steper.lowPower_idel();
Serial.print("Motor finished degree: ");
Serial.println(degree);
Serial.println("**********************************************************************");
dir = 3;
}
if (dir == 0)//CCW
{
degree=0-degree;
steper.step(degree);
steper.lowPower_idel();
dir = 3;
Serial.print("Motor finished degree: ");
Serial.println(degree);
Serial.println("**********************************************************************");
}
degree = 0;
delay(5000);
}
https://download.csdn.net/download/anchoretor/15176116
https://download.csdn.net/download/anchoretor/15176829
https://download.csdn.net/download/anchoretor/15270614
1首先需要熟悉步进电机28BYJ-48的机构,工作原理。驱动拍的工作特点。关键:五线四相结构,驱动的步进角公式会计算。
2..驱动库编写需要针对不同驱动电路的设计,驱动电路的使用工作原理。关键:ULn2003驱动电路特点,输入和输出是反相,输入高电平,驱动输出端拉低,驱动绕组励磁工作。L298N驱动电路特点,输入和输出是同相,输入低电平,驱动输出端拉低,驱动绕组励磁工作。
3.应用代码分析,通过应用大家熟悉如何使用自建库,同时完成实践应用,知行合一多多练习。
4.看过有用,鼓励一下我的劳动成果,收藏点个赞呗,能力有限,有错误地方欢迎指正。