STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)

一:步进电机简介

        步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩,步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步,因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。

1.1 步进电机主要分类

        目前市面上主要的步进电机,按照绕组来分的话,共有二相、三相和五相等系列,最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好。

        该种电机的基本步距角为1.8°/步,配上半步驱动器后,步距角减少为0.9°,配上细分驱动器后其步距角可细分达256倍(0.007°/微步),由于摩擦力和制造精度等原因,实际控制精度略低,同一步进电机可配不同细分的驱动器以改变精度和效果。

        目前主流的步进电机一般是42步进电机和57步进电机,42步进电机的42,是指长宽各42mm,而不是其它含义。高一点的力矩大一些。 步距角为1.8° 。42步进电机在3D打印、网友DIY的各种写字机中用的非常多。

42步进电机:

57步进电机:

1.2 步进电机结构拆解 

        实际上,步进电机内部的结构主要是由很多小齿交错而成的,每交错一次步距角就可以缩小一倍,步距角越小则步进电机越精密,旋转一圈所需要的脉冲也就越多。目前市面上不管是42电机,还是57电机,亦或者是86电机,步距角一般都是1.8°。

混合式42步进电机爆炸视图:

 42步进电机实物拆卸图:

 42步进电机内部齿图:

二:TB6600驱动器简介

        步进电机驱动器有很多,就比如说28步进电机驱动器ULN2003,A4988以及我们使用的TB6600等等。

2.1 TB6600驱动器原理介绍

        额,说实话驱动器的原理十分复杂,以我的能力我也讲不清楚,你也听不明白,所以还是搬出来最权威的手册吧!

TB6600驱动器手册地址:20161012102520yg1obn.pdf (dfrobot.com.cn)

虽然驱动器原理咱看不明白,但是不妨碍我们使用啊!

我们只要知道每一个端口分别是什么功能,怎么接,完全就可以了。

三:电路接线图示

3.1 TB6600驱动器端口功能讲解

        如下图所示,TB6600驱动器一共有12个端口,以及一排小开关。12个端口分别为电机使能信号(EN+)(EN-)、方向控制信号(DIR+)(DIR-)、步进脉冲信号(PIL+)(PUL-)、电机两相(A+,A-,B+,B-)、驱动电源(+,-)。一排小开关分别是细分设置和电流设置,sw1-sw3是细分设置,sw4-sw6是电流设置。

 ①电机使能信号(EN+)(EN-):电机使能信号,全名enable。顾名思义,就是让电机有旋转的能力和失去旋转的能力,他就相当于一个软件开关,只需要通过代码设计就可以实现步进电机使能或者失能,在失能的状态下,无论做何种操作,电机都不会有反应。

②方向控制信号(DIR+)(DIR-):方向控制信号,全名direction。顾名思义,就是可以通过控制这个端口的高低电平进而控制电机的旋转方向。后续我们可以使用这个驱动器的特性实现按键控制电机旋转方向或者其他一些操作。

步进脉冲信号(PIL+)(PUL-):步进脉冲信号,全名pulse。步进脉冲信号是控制步进电机的灵魂信号,简而言之,控制步进电机,使能信号端口可以不接,顶多就让电机一直转呗。方向信号也可以不接,顶多步进电机无法改变方向。但是脉冲信号一定要接,根据目前对驱动器的了解,驱动器内部的芯片会根据你的脉冲信号,转换成能让步进电机旋转的信号,具体怎么做的还是去看驱动器技术文档哈。

电机两相(A+,A-,B+,B-):按照目前的步进电机来说,市场上目前现行的步进电机一般都是二相步进电机,因为这样做在保证精度的情况下,更省成本。

⑤拨码开关:拨码开关的sw1-sw3是细分设置,sw4-sw6是电流设置。像42电机,我们假设采用8细分,转一圈需要1600个脉冲。他的额定电流是1.5A,那么我们就需要根据电流设定表,给他设定成 SW4 ON ,SW5 ON ,SW6 OFF。

        至于怎么设置拨码开关 ,在驱动器背部都写的明明白白的,按照上面写的来做就行了。

3.2 步进电机接线示意图

        想要实现控制,必须有控制器、驱动器和控制对象。控制器我们就选用STM32F407单片机进行控制,至于为什么选这个因为我只有这个,用STM32F103单片机也不是不可以。驱动器我们就选用TB6600步进电机驱动器,控制对象就是我们的42步进电机。

3.3.1 驱动器接线

        驱动器接线一般有两种,共阴极接法和共阳极接法。其实本质上都是一致的,共阴极即是把EN-、DIR-、PUL-全部都接到控制器上面的GND,也就是把他们全部接为低电位,其他端口只要设置为高电平就可以实现功能;共阳极也就是反过来接线,EN-、DIR-、PUL-全部都接到控制器上面的VCC,也就是把他们全部接为高电位,其他端口只要设置为低电平就可以实现功能。本质上都是检测到电位差实现相关功能。我们在此采用共阴极的接法。

先凑合看一下吧,本人画图能力实在有限。

        注意到驱动器能够接受的输入电压在直流9-42V左右,最合适的还是在24V。注意驱动器VCC和GND不要接反了,接反了驱动器就要抽烟抽死了。

         剩下的A、B两相,A+A-,B+B-,你不用担心步进电机的四根线,到底谁是A相,谁是B相。电机内部结构特性决定了谁是都可以,只是旋转方向会有差别而已(好像是这样)。教你一个小妙招,电机上面一共四根线,从中找出两根,只要这样根线碰在一起,步进电机手动旋转起来有阻力,那就说明这是同一相,不需要管是A相B相,暂定是A相,那另外两根线就是B相了。

 3.3.2 控制器接线

        控制器接线很简单,接那个I/O口全看自己的设置,就像我的话,我设置的PB3是控制步进电机旋转的I/O口,PB4是控制步进电机方向的I/O口,接线时只需要将PUL+接到PB3,DIR+接到PB4即可,这点没有什么可说的。

四:代码编写思路

        下面就是紧张又刺激的代码编写阶段了。在这里我说一下主要最为重要的代码怎么编写,想要全套源码的uu们可以在文档结尾下载工程源码。

        其实在代码里面,注释已经写得很清楚了,基本上不需要再怎么介绍了,直接上代码。

Motor.c

#include "Motor.h"
#include "Delay.h"
#include "led.h"#define TotalNulses 1600    //设置步进电机为8细分,脉冲总数为1600脉冲// Motor 配置
void Motor_Init(void)
{   	//首先打开准备输出引脚的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//紧接着初始化对应的GPIO端口,进行相应的参数配置GPIO_InitTypeDef GPIO_InitStructure;    //创建GPIO_InitStructure结构体GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   //设置引脚模式为输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //设置为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;  //设置引脚为PB3和PB4引脚GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;  //设置为下拉输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //设置为输出速度为50MHzGPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_3 | GPIO_Pin_4);    //设置引脚的初始状态为高电位状态
}void Motor_Start(void)
{LED_BLUE_OFF;   //宏定义,蓝灯打开LED_RED_ON;     //宏定义,红灯熄灭Delay_ms(1000);GPIO_SetBits(GPIOB,GPIO_Pin_4);for(int i= 0; i < TotalNulses*2; i++)   //模拟PWM控制步进电机{GPIO_SetBits(GPIOB,GPIO_Pin_3);Delay_us(500);  //可以修改延时函数里面的参数,更改步进电机旋转的速度。本质上是模拟改变了PWM的频率,进而改变了速度GPIO_ResetBits(GPIOB,GPIO_Pin_3);Delay_us(500);}LED_BLUE_ON;LED_RED_OFF;Delay_ms(1000);GPIO_ResetBits(GPIOB,GPIO_Pin_4);   //置PB4为低电位,改变旋转方向for(int i= 0; i < TotalNulses*2; i++)   //跟上文一样,不过是改变了步进电机旋转的方向{GPIO_SetBits(GPIOB,GPIO_Pin_3);Delay_us(500);GPIO_ResetBits(GPIOB,GPIO_Pin_3);Delay_us(500);}
}

         这段代码主要配置了控制步进电机脉冲和方向的两个端口引脚,然后自定义了一个电机控制函数,在函数里面模仿了PWM波形进行步进电机的控制。

Main.c

#include "stm32f4xx.h"
#include "led.h"
#include "Delay.h"
#include "usart.h"
#include "Motor.h"
#include "stm32f4xx_tim.h"uint16_t speed=500;// 程序入口主函数
int main(void)
{USART1_Init(115200);                                           // 初始化USART1; 注意, 在bsp_USART.c文件底部,printf已重定向到usart1, 可用于与电脑上位机通信;Led_Init();                                                    // LED 初始化Motor_Init();                                                    // 配置TIMwhile (1)                                        // while函数死循环;作用:不能让main函数运行结束,否则会产生硬件错误{Motor_Start();}
}// 每个代码文件的末尾,注意要加两个空行

        还有其他例如通信USART,LED模块在mian函数里面运行,移植时可能会出现灯不亮等情况,只需要简单的修改参数就可以了。至于工程源码大家可以到文章结尾进行下载。

五:实操效果展示

        当然是可以旋转的更快的,只需要修改Motor,c里面的模拟PWM波形函数里面的Delay_us()的参数即可,本质上是修改了模拟PWM的频率,频率越高电机旋转的就越快。 

         文件源码分享:02-1 Simple IO Port Control Of Stepper Motor.zip - 蓝奏云

        关于后续的PWM控制,将会在后面进行讲解。看在码字不易,用的不是某盘的份上,uu们可以点个赞嘛!谢谢。

        与君共勉 დ,关注我,持续更新中~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超越单兵作战:多智能体 Multi-Agent System (MAS)

超越单兵作战&#xff1a;多智能体 Multi-Agent System (MAS) Multi-Agent System 是指一个系统中有多个智能体同时工作的情况。在这样的系统中&#xff0c;每个智能体都具有一定程度的自主性&#xff0c;可以独立执行任务、做决定&#xff0c;并且能够与其他智能体进行交互&a…

STM32的Code、RO-data、RW-data、ZI-data和RAM以及flash的关系

对于刚接触stm32编程的同学来说&#xff0c;通常不知道如何选择合适型号的芯片来开发自己的项目&#xff0c;下面就分析一下多大的片内ram以及flash能符合我们项目的需求。 不知道大家有没有注意到&#xff0c;我们的项目每次编译完成后&#xff0c;都会出现这个Program Size&…

亚马逊卖家告别熬夜!批量定时上下架,自动调价

必用能功三个&#xff0c;不限制上传商品。 大家好&#xff0c;今天来讲下这款erp的定时上下架功能。 打开工具这栏选择智能调价&#xff0c;点击添加智能调价选择店铺&#xff0c;选择定时上架的商品添加也可以全部添加。每个商品的价格都是不同的&#xff0c;可以点击保底价…

windows10开启防火墙,增加入站规则后不生效,还是不能访问后端程序

一、背景&#xff1a; 公司护网要求开启防火墙&#xff0c;开启防火墙后&#xff0c;前后端分离的项目调试受影响&#xff0c;于是增加入站规则开放固定的后台服务端口&#xff0c;增加的mysql端口3306和redis端口6379&#xff0c;别人都可以访问&#xff0c;但是程序的端口808…

抖音工具箱功能菜单解析分享

一 支持视频链接 采集/点赞/评论/收藏 二 支持导入 用户id私信 内容自定义 可 关注后私信对方 私信间隔自定义 三 支持多直播间 发言 内容-间隔自定义 五 支持 监听指定用户作品 新发作品 自动 点赞/评论/收藏 六 支持 视频评论实时监控 新发评论自动采集获取 七 智能 暂停…

NLP入门——卷积语言模型的搭建、训练与预测

语言模型建模是针对句子建模&#xff0c;主要分为掩码语言模型和自回归语言模型。 我们从corpus中截取一句话作为例子&#xff0c;这句话是bpe分词后的句子&#xff1a; 1994 年 5 月 17 日 安全 理事会 第 33 77 次 会议 通过 掩码语言模型的主要机制是&#xff1a;例如将33 7…

PostgREST API 安装及基础使用

PostgREST是一个独立的Web服务器&#xff0c;它将PostgreSQL数据库转换为RESTful API。它提供基于基础数据库的结构自定义的API。 PostgREST安装 首先访问Releases PostgREST/postgrest (github.com)&#xff0c;根据安装平台选择下载的源码。比如我现在的设备是Mac但是我的…

删掉此电脑中烦人的百度网盘、WPS、迅雷下载图标(还有导航栏)-win10/11

删掉此电脑的图标 1、首先 搜索 注册表管理器 或者 win R 输入 regedit 2、在红框的地方输入这串路径&#xff08;下2选1&#xff09;&#xff1a; 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\ HKEY_CURRENT_US…

【C++】使用C++实现基于Socket的通信

在本文中&#xff0c;我们将详细讨论如何使用C实现基于Socket的通信&#xff0c;并设计一个TLV&#xff08;Type-Length-Value&#xff09;协议用于数据交互。TLV协议因其灵活性和可扩展性&#xff0c;在多种通信协议中被广泛使用&#xff0c;特别是在需要动态定义数据结构的场…

【Axure】产品原型如何在谷歌浏览器中打开

作为一名前端开发来说&#xff0c;在拿到产品的原型图后&#xff0c;如何打开&#xff1f;直接用谷歌浏览器打开&#xff0c;是打不开的&#xff0c;需要安装对应的插件。但是谷歌插件市场在不翻墙的情况下&#xff0c;是没有办法直接打开的&#xff0c;分享一种超级简单的方法…

深入解析RocketMQ的名字服务机制:功能、原理与应用

NameServer 是专为 RocketMQ 设计的轻量级名字服务&#xff0c;它的源码非常精简&#xff0c;八个类 &#xff0c;少于 1000 行代码。 这篇文章&#xff0c; 笔者会从基础概念、Broker 发送心跳包、NameServer 维护路由、Zookeeper vs NameServer 四个模块揭秘名字服务的设计精…

电脑怎样连接打印机?详细步骤告诉你!

在现代办公环境中&#xff0c;打印机是必不可少的设备之一。无论是打印文档、图片还是其他资料&#xff0c;连接打印机都是我们日常工作中的基本操作。然而&#xff0c;不同类型的打印机和连接方式可能会让人感到困惑。本文将介绍电脑怎样连接打印机的3种方法&#xff0c;帮助您…

简易限流实现

需求描述 写一个1秒两个的限流工具类&#xff0c;2r/s 使用semaphore 代码实现-类似令牌桶算法 public class LimitHelper {private int maxLimit;private Semaphore semaphore;private int timeoutSeconds;public LimitHelper(int maxLimit, int timeoutSeconds) {this.max…

LNMP搭建Discuz和Wordpress

1、LNMP L:linux操作系统 N&#xff1a;nginx展示前端页面web服务 M&#xff1a;mysql数据库&#xff0c;保存用户和密码&#xff0c;以及论坛相关的内容 P&#xff1a;php动态请求转发的中间件 数据库的作用&#xff1a; 登录时验证用户名和密码 创建用户和密码 发布和…

昇思25天学习打卡营第十七天|文本解码原理--以MindNLP为例

背景 提供免费算力支持&#xff0c;有交流群有值班教师答疑的华为昇思训练营进入第十七天了。 今天是第十七天&#xff0c;从第十天开始&#xff0c;进入了应用实战阶段&#xff0c;前九天都是基础入门阶段&#xff0c;具体的学习内容可以看链接 基础学习部分 昇思25天学习打卡…

Unity发布webgl之后修改StreamingAssets 内的配置文件读取到的还是之前的配置文件的解决方案

问题描述 unity发布webgl之后&#xff0c;修改在StreamingAssets 中的配置信息&#xff0c;修改之后读取的还是之前的配置信息 读取配置文件的代码IEnumerator IE_WebGL_LoadWebSocketServerCopnfig(){var uri new System.Uri(Path.Combine(Application.streamingAssetsPath…

居家客服人员分散,更需要统一客服话术

1、居家客服服务需求激增 近年来&#xff0c;随着线上消费的兴起&#xff0c;以及客服人员成本的不断攀升&#xff0c;越来越多的企业选择雇佣居家客服&#xff0c;以客服服务发包的形式接待客户的咨询。因此&#xff0c;居家客服人员的数量也逐渐增加。然而&#xff0c;居家办…

c++ 多边形 xyz 数据 获取 中心点方法

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…

PHP充电桩小程序系统源码

绿色出行新伴侣&#xff01;充电桩小程序&#xff0c;让充电不再烦恼✨ &#x1f50b; 开篇&#xff1a;告别电量焦虑&#xff0c;充电桩小程序来救场&#xff01; 在这个电动车日益普及的时代&#xff0c;电量不足成了不少车主的“心头大患”。但别担心&#xff0c;充电桩小…

nprogress进度条插件

打开一个页面时&#xff0c;往往会伴随一些请求&#xff0c;并且会在页面上方出现进度条。它的原理时&#xff0c;在我们发起请求的时候开启进度条&#xff0c;在请求成功后关闭进度条&#xff0c;所以只需要在request.js中进行配置。 如下图所示&#xff0c;我们页面加载时发起…