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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第