当前位置: 首页 > news >正文

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

一:步进电机简介

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

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们可以点个赞嘛!谢谢。

,关注我,持续更新中~

相关文章:

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

一&#xff1a;步进电机简介 步进电机又称为脉冲电机&#xff0c;简而言之&#xff0c;就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩&#xff0c;步进电机的角位移量与输入的脉冲个数严格成正…...

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 论文解读

目录 一、概述 二、相关工作 三、前置知识 1、LVDM Introduction 2、LVDM Method 3、LVDM for Short Video Generation 4、Hierarchical LVDM for Long Video Generation 5、训练细节 6、推理过程 四、MotionCtrl 1、CMCM 2、OMCM 3、训练策略 五、实验 一、概述…...

LINUX线程操作

文章目录 线程的定义LINUX中的线程模型一对一模型多对一模型多对多模型 线程实现原理线程的状态新建状态&#xff08;New&#xff09;就绪状态&#xff08;Runnable&#xff09;运行状态&#xff08;Running&#xff09;阻塞状态&#xff08;Blocked&#xff09;死亡状态&#…...

在Lua中,Metatable元表如何操作?

Lua中的Metatable&#xff08;元表&#xff09;是一个强大的特性&#xff0c;它允许我们改变表&#xff08;table&#xff09;的行为。下面是对Lua中的Metatable元表的详细介绍&#xff0c;包括语法规则和示例。 1.Metatable介绍 Metatable是一个普通的Lua表&#xff0c;它用于…...

4D LUT: Learnable Context-Aware 4D LookupTable for Image Enhancement

摘要&#xff1a;图像增强旨在通过修饰色彩和色调来提高照片的审美视觉质量&#xff0c;是专业数码摄影的必备技术。 近年来&#xff0c;基于深度学习的图像增强算法取得了可喜的性能并越来越受欢迎。 然而&#xff0c;典型的努力尝试为所有像素的颜色转换构建统一的增强器。 它…...

瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp)

瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp) RK3568及rkmpp介绍编译安装mpp获取源码交叉编译安装 libdrmlibdrm-2.4.89 make 方式编译(cannot find -lcairo, 不推荐)下载源码编译编译错误: multiple definition of `nouveau debug‘错误cannot find -lcairo:…...

使用SuperMap制作地形图的详细教程

一、数据准备 本示例以山东为例&#xff0c;演示如何通过SuperMap iDesktopX制作一个好看的地形图。所有数据均来源于互联网公开数据&#xff0c;如有自己项目真实数据&#xff0c;可直接跳过数据下载进入下一步。 本示例所需数据包括&#xff1a; 数据类别 数据类型 DEM数据…...

PHP Array:精通数组操作

PHP Array&#xff1a;精通数组操作 PHP&#xff0c;作为一门流行的服务器端编程语言&#xff0c;提供了强大的数组处理能力。数组是PHP中非常灵活和强大的数据结构&#xff0c;它可以存储多个相同类型的值。在PHP中&#xff0c;数组不仅可以存储数字&#xff0c;还可以存储字…...

【使用命令配置java环境变量永久生效与脚本切换jdk版本】

java配置环境变量命令与脚本切换jdk版本 新建用户环境变量永久生效 setx JAVA8_HOME "D:\Java\jdk8" setx JAVA17_HOME "d:\Java\jdk-17" setx JAVA_HOME %JAVA8_HOME% setx CLASSPATH ".;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;"…...

STM32-笔记32-ESP8266作为服务端

esp8266作为服务器的时候&#xff0c;这时候网络助手以客户端的模式连接到esp8266&#xff0c;其中IP地址写的是esp8266作为服务器时的IP地址&#xff0c;可以使用ATCIFSR查询esp8266的ip地址&#xff0c;端口号默认写333。 当esp8266作为服务器的时候&#xff0c;需要完成哪些…...

RAG(Retrieval-Augmented Generation,检索增强生成)流程

目录 一、知识文档的准备二、OCR转换三、分词处理四、创建向量数据库五、初始化语言聊天模型1.prompt2.检索链3.对话 完整代码 知识文档的准备&#xff1a;首先需要准备知识文档&#xff0c;这些文档可以是多种格式&#xff0c;如Word、TXT、PDF等。使用文档加载器或多模态模型…...

【Python学习(六)——While、for、循环控制、指数爆炸】

Python学习&#xff08;六&#xff09;——While、for、循环控制、指数爆炸 本文介绍了While、for、循环控制、指数爆炸&#xff0c;仅作为本人学习时记录&#xff0c;感兴趣的初学者可以一起看看&#xff0c;欢迎评论区讨论&#xff0c;一起加油鸭~~~ 心中默念&#xff1a;Py…...

解释一下:运放的输入失调电流

输入失调电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…...

力扣hot100——二分查找

35. 搜索插入位置 class Solution { public:int searchInsert(vector<int>& a, int x) {if (a[0] > x) return 0;int l 0, r a.size() - 1;while (l < r) {int mid (l r 1) / 2;if (a[mid] < x) l mid;else r mid - 1;}if (a[l] x) return l;else …...

PHP 使用集合 处理复杂数据 提升开发效率

在 PHP 中&#xff0c;集合&#xff08;Collections&#xff09;通常是通过数组或专门的集合类来实现的。 集合&#xff08;Collection&#xff09;是一种高级的数据结构&#xff0c;可以提供比普通数组更强大的操作和功能&#xff0c;特别是当你需要更复杂的数据处理时。 La…...

Unity 对Sprite或者UI使用模板测试扣洞

新建两个材质球&#xff1a; 选择如下材质 设置如下参数&#xff1a; 扣洞图片或者扣洞UI的材质球 Sprite或者UI的材质球 新建一个单独Hole的canvas&#xff0c;将SortOrder设置为0&#xff0c;并将原UI的canvans的SortOrder设置为1 对2DSprite则需要调整下方的参数 hole的O…...

unity学习3:如何从github下载开源的unity项目

目录 1 网上别人提供的一些github的unity项目 2 如何下载github上的开源项目呢&#xff1f; 2.1.0 下载工具 2.1.1 下载方法1 2.1.2 下载方法2&#xff08;适合内部项目&#xff09; 2.1.3 第1个项目 和第4项目 的比较 第1个项目 第2个项目 第3个项目 2.1.4 下载方法…...

PHP后执行php.exe -v命令报错并给出解决方案

文章目录 一、执行php.exe -v命令报错解决方案 一、执行php.exe -v命令报错 -PHP Warning: ‘C:\windows\SYSTEM32\VCRUNTIME140.dll’ 14.38 is not compatible with this PHP build linked with 14.41 in Unknown on line 0 解决方案 当使用PHP8.4.1时遇到VCRUNTIME140.dll…...

CDP集群安全指南-动态数据加密

[〇]关于本文 集群的动态数据加密主要指的是加密通过网络协议传输的数据&#xff0c;防止数据在传输的过程中被窃取。由于大数据涉及的主机及服务众多。你需要更具集群的实际环境来评估需要为哪些环节实施动态加密。 这里介绍一种通过Cloudera Manager 的Auto-TLS功能来为整个…...

【shell编程】报错信息:Undefined Variable(包含6种解决方法)

大家好&#xff0c;我是摇光~ 当Shell脚本报错“Undefined Variable”时&#xff0c;是未定义变量的意思。 以下是对每个可能原因及其对应详细解决方案的详细解释&#xff1a; 原因1&#xff1a;拼写错误 原因&#xff1a; 脚本中变量名的拼写在使用和定义时不一致。例如&…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...