拓展模块使用教程和心得(三):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

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超