拓展模块使用教程和心得(三):ULN2003模块与28BYJ48步进电机(测试平台:STC8A8K,STM32F103)

本文主要是介绍拓展模块使用教程和心得(三):ULN2003模块与28BYJ48步进电机(测试平台:STC8A8K,STM32F103),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

成就更好的自己

关于ULN2003模块和对应的28BYJ48步进电机,网上现有的资料与教程对于初学者有点不太友好,造成的现象是仅仅只能让步进电机转起来,但是没有对于控制转速和转角的实践分析,本文的所有内容博主都经过了实物及程序的验证和计算,并以最言简意赅的方式记录下来。(测试平台:STC8A8K,STM32F103)

目录

ULN2003模块电路

28BYJ48步进电机

细枝末节的知识

 

ULN2003模块电路

先上实物图:

左边7PIN的排针是连到单片机IO口上的,中间偏下插着短接帽的4PIN排针是供电给模块和步进电机(有时候是单独供电,但是要共地),偏右边白色的5PIN插槽是五线四相步进电机专用接口,最右边的的7PIN排针是控制其他多项电机(低于七项)用的。

ULN2003本质很简单

除了8.9俩电源引脚之外,其他引脚(7*2)都是相互对应的(以上图为例,1~16,2~15以此类推),具体是什么原理呢,咱不用知道那么多,咱只用知道ULN2003内部用的是高耐压、大电流复合晶体管阵列,是让单片机IO口驱动大电流用的(因为咱们用的步进电机内部其实还是线圈,所以用到了ULN2003),多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。由于单片机采用的是灌电流驱动方式(这种驱动方式驱动能力强,但是容易烧),因此控制步进电机的IO口0为有效电平,1为无效电平

步进电机,ULN2003,单片机的前后连接原理图如下:

 

 

28BYJ48步进电机

所有资料都写的是步进电机靠脉冲驱动的,一个脉冲对应转过一个步距角,这句话会有部分理解上的问题的,下面我会一一分析的。

现在给大家区分一个概念,上图中能直接看到的绑个弹簧的那个轴是输出轴,在这个步进电机内部有个真正的步进马达转子每一个脉冲(或者下文所谓的“拍”)能使这个真正的转子转动5.625°,看下图的数据表格中的减速比是1:64,意思是这个真正的步进马达转子转动64周才能让输出轴转动1周(这个术语叫做步进马达的细分),因此下图的表格中步距角度才写的是5.625°/64,表明的意思是一个脉冲可以让输出轴转动5.625°/64的角度

脉冲的意思,必须由低电平变高电平,说白了这玩意看上升沿的,持续一段时间然后拉低即可,这段持续的时间直接决定了电机的转速,据说这废物最快14转每分钟。

下面详细说一下通电方式(或者叫励磁方式)

首先,脉冲(或拍)的数量决定转动的角度,单位时间内脉冲(或拍)的数量决定转动的速度

常见的通电方式有:

  • 一相励磁:单(单相绕组通电)四拍(A-B-C-D-A。。。)
  • 二相励磁:双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。)
  • 一二相励磁:八拍(A-AB-B-BC-C-CD-D-DA-A。。。)

其中,经过博主的对比试验和资料查找,一相励磁和二相励磁一个脉冲转动两个步距角,一二相励磁一次脉冲只转一个步距角(测试平台STC8A8K,STM32F103)

举个简单例子,这里博主为了朋友们便于理解,没有采用网上的相序表(数组法因接口而异):

单(单相绕组通电)四拍(A-B-C-D-A。。。)

void main()		//一相励磁的例程					
{uint16 num;IN1=IN2=IN3=IN4=1;for(num=640;num>0;num--)  //640个循环,5.625/64步距角*2(一相励磁一拍走2个步距角)*4拍*640次循环=450度{IN1=~IN1;	//控制A相的IO口非运算后的电平变化产生一个脉冲,第一拍delay(speed);IN1=~IN1;IN2=~IN2;	//控制B相的IO口非运算后的电平变化产生一个脉冲,第二拍delay(speed);IN2=~IN2;IN3=~IN3;	//控制C相的IO口非运算后的电平变化产生一个脉冲,第三拍delay(speed);IN3=~IN3;IN4=~IN4;	//控制D相的IO口非运算后的电平变化产生一个脉冲,第四拍delay(speed);IN4=~IN4;}IN1=IN2=IN3=IN4=1;while(1);
}

双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。)

void main()		//二相励磁的例程
{uint16 num;IN1=IN2=IN3=IN4=1;for(num=640;num>0;num--)  //640个循环,5.625/64步距角*2(二相励磁一拍走2个步距角)*4拍*640次循环=450度{IN1=~IN1;	//控制A相的IO口非运算后的电平变化产生一个脉冲,第一拍IN2=~IN2;	//控制B相的IO口非运算后的电平变化产生一个脉冲,第一拍delay(speed);IN1=~IN1;	IN2=~IN2;	IN2=~IN2;	//控制B相的IO口非运算后的电平变化产生一个脉冲,第二拍IN3=~IN3;   //控制C相的IO口非运算后的电平变化产生一个脉冲,第二拍delay(speed);IN2=~IN2;IN3=~IN3;	IN3=~IN3;	//控制C相的IO口非运算后的电平变化产生一个脉冲,第三拍IN4=~IN4;	//控制D相的IO口非运算后的电平变化产生一个脉冲,第三拍delay(speed);IN3=~IN3;IN4=~IN4;	IN4=~IN4;	//控制D相的IO口非运算后的电平变化产生一个脉冲,第四拍IN1=~IN1;	//控制A相的IO口非运算后的电平变化产生一个脉冲,第四拍delay(speed);IN4=~IN4;IN1=~IN1;}IN1=IN2=IN3=IN4=1;while(1);
}

八拍(A-AB-B-BC-C-CD-D-DA-A。。。)

void main()			//一二相励磁的例程
{uint16 num;IN1=IN2=IN3=IN4=1;for(num=640;num>0;num--)  //640个循环,5.625/64步距角*1(一二相励磁一拍走1个步距角)*8拍*640次循环=450度{IN1=~IN1;	//控制A相的IO口非运算后的电平变化产生一个脉冲,第一拍delay(speed);IN1=~IN1;IN1=~IN1;	//控制A相的IO口非运算后的电平变化产生一个脉冲,第二拍IN2=~IN2;	//控制B相的IO口非运算后的电平变化产生一个脉冲,第二拍delay(speed);IN1=~IN1;IN2=~IN2;IN2=~IN2;	//控制B相的IO口非运算后的电平变化产生一个脉冲,第三拍delay(speed);IN2=~IN2;IN2=~IN2;	//控制B相的IO口非运算后的电平变化产生一个脉冲,第四拍IN3=~IN3;	//控制C相的IO口非运算后的电平变化产生一个脉冲,第四拍delay(speed);IN2=~IN2;IN3=~IN3;IN3=~IN3;	//控制C相的IO口非运算后的电平变化产生一个脉冲,第五拍delay(speed);IN3=~IN3;IN3=~IN3;	//控制C相的IO口非运算后的电平变化产生一个脉冲,第六拍IN4=~IN4;	//控制D相的IO口非运算后的电平变化产生一个脉冲,第六拍delay(speed);IN3=~IN3;IN4=~IN4;IN4=~IN4;	//控制D相的IO口非运算后的电平变化产生一个脉冲,第七拍delay(speed);IN4=~IN4;IN4=~IN4;   //控制D相的IO口非运算后的电平变化产生一个脉冲,第八拍IN1=~IN1;   //控制A相的IO口非运算后的电平变化产生一个脉冲,第八拍delay(speed);IN4=~IN4;IN1=~IN1;}IN4=IN1=IN2=IN3=1;while(1);
}

关于控制线的脉冲有严格顺序,通脉冲的顺序影响转向(顺向逆向),负载能力,电机发热程度等。

这里博主给出了使用手册上的标准脉冲流程,如果想反转的话只用颠倒给脉冲的顺序即可,但是不要打乱顺序,否则也可能会转但是会造成各种问题。

 

细枝末节的知识

  • 这个步进电机最快转速据说14转每分钟(博主实测10转,可能延时有点慢),不能贪图速度,延时一定要延够,否则只会震动不会转动,至于慢的话,没有那个耐心测出他最慢有多慢。。。
  • 至于转角的话,只用算出他需要转几个脉冲然后循环就行了。
  • 在停止转动后,记得将所有控制线拉高,不然电机时间长了会很热,一般内部热度超过130度就会对内部的永磁体造成不可逆转的退磁现象,电机的步距角就会不准确。
  • 觉得驱动力矩不够的可以加到12v,记得与ULN2003共地。
  • 博主在初期调试的时候,一相和二相励磁时,实际转角一直是理论计算的两倍,后期查资料才知道,这两种励磁方式一脉冲转的是两个步距角,这个问题网上提到的人很少,也发现有朋友遇到过类似问题,但是我毕竟不是机械专业的,只能根据网友的结论和自己实际的情况下定论,如果发现有误或者知道原理的朋友欢迎评论或私信,共同进步,谢谢。
  • 还有一种励磁方式是以PWM脉冲调制取代单一高低电平作为上文中的3种励磁方式的输入,这种新的励磁方式有很大优点,但是因为实现起来相当复杂,一般是用不到的,有兴趣的朋友们可以自行百度一下。

这篇关于拓展模块使用教程和心得(三):ULN2003模块与28BYJ48步进电机(测试平台:STC8A8K,STM32F103)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167992

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有