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

,关注我,持续更新中~

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

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

相关文章

WPS-JS宏快速上手

WPS JS宏注意事项 代码后面可以不写分号“ ; ”&#xff1b; 缩进对程序的运行影响不大&#xff0c;但为了易读&#xff08;防止自己以后看不懂&#xff09;&#xff0c;还是乖乖写好&#xff1b; 代码是逐行运行的&#xff0c;意味着下面一行代码错了&#xff0c;前面的代码…

Conda 安装 Jupyter Notebook

文章目录 1. 安装 Conda下载与安装步骤&#xff1a; 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能&#xff08;可选&#xff09;6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具&#xff0c;尤其适合数据科学、机器…

【CVPR 2024】【遥感目标检测】Poly Kernel Inception Network for Remote Sensing Detection

0.论文摘要 摘要 遥感图像&#xff08;RSIs&#xff09;中的目标检测经常面临几个日益增加的挑战&#xff0c;包括目标尺度的巨大变化和不同范围的背景。现有方法试图通过大核卷积或扩张卷积来扩展主干的空间感受野来解决这些挑战。然而&#xff0c;前者通常会引入相当大的背…

C++语言编程————C++的输入与输出

1.面向过程的程序设计和算法 在面向过程的程序设计中&#xff0c;程序设计者必须指定计算机执行的具体步骤&#xff0c;程序设计者不仅要考虑程序要“做什么”&#xff0c;还要解决“怎么做”的问题&#xff0c;根据程序要“做什么”的要求&#xff0c;写出一个个语句&#xff…

Fabric链码部署测试

参考链接&#xff1a;运行 Fabric 应用程序 — Hyperledger Fabric Docs 主文档 (hyperledger-fabric.readthedocs.io) &#xff08;2&#xff09;fabric2.4.3部署运行自己的链码 - 知乎 (zhihu.com) Fabric2.0测试网络部署链码 - 辉哥哥~ - 博客园 (cnblogs.com) 1.启动测试…

《米塔》为什么能突破160万销量?

1、跟完蛋美女有一定的类似之处&#xff0c;都是针对用户需求打造的商品&#xff0c;所以取得良好的销量不意外。 偏宅的玩家有陪伴、被重视、被爱的需求&#xff0c; 而厂商很懂&#xff0c;无论真人还是二次元都只是手段。 完蛋也是突破百万销量&#xff0c;成为黑马。 2、…

ESP32自动下载电路分享

下面是一个ESP32系列或者ESP8266等电路的一个自动下载电路 在ESP32等模块需要烧写程序的时候&#xff0c;需要通过将EN引脚更改为低电平并将IO0引脚设置为低电平来切换到烧写模式。 有时候也会采用先将IO接到一个按键上&#xff0c;按住按键拉低IO0的同时重新上电的方式进入烧写…

Backend - C# 的日志 NLog日志

目录 一、注入依赖和使用 logger 二、配置记录文件 1.安装插件 NLog 2.创建 nlog.config 配置文件 3. Programs配置日志信息 4. 设置 appsettings.json 的 LogLevel 5. 日志设定文件和日志级别的优先级 &#xff08;1&#xff09;常见的日志级别优先级 &#xff08;2&…

java项目之社区医院信息平台源码(springboot+mysql)

项目简介 社区医院信息平台实现了以下功能&#xff1a; 社区医院信息平台的主要使用者分为管理员可以查看对护士信息进行添加&#xff0c;修改&#xff0c;删除以及查询操作&#xff1b;管理员可以对医生信息进行添加&#xff0c;修改&#xff0c;删除以及查询操作&#xff1…

《普通逻辑》学习记录——命题的判定与自然推理

目录 一、真值 1.1、真值联结词 1.2、真值联结词与逻辑联结词的区别 1.3、真值形式 1.3.1、真值符号的优先级和结合性规则 1.4、真值规则 1.4.1、条件式&#xff08;蕴含式&#xff09; P → Q 的真值规则 1.4.2、双条件式&#xff08;等值式&#xff09; P ↔ Q 的真值规则 1.…

Pycharm连接远程解释器

这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径&#xff0c;并设置同步映射&#xff08;1&#xff09;配置服务器的系统环境&#xff08;2&#xff09;配置服务器的conda环境 4 进入到程序入口&#xff08;main.py&#…

无刷直流电机(BLDC)六步换向法

文章目录 1、三相BLDCM 基本结构2、三相BLDCM 数学模型3、有霍尔位置传感器直流无刷电机工作原理4、无位置传感器直流无刷电机工作原理5、速度检测6、六步换向双闭环模型仿真6.1 模型总览6.2 系统及参数设置6.3 六步换向模块6.4 仿真效果 7、六步换向速度闭环PWM控制参考 1、三…

Windows11安装Oracle11g以及plsqldev工具连接配置

文章目录 一、安装Oracle数据库软件二、配置数据库三、配置监听&#xff08;listener.ora&#xff09;四、本地网络服务名配置&#xff08;tnsnames.ora&#xff09;五、网络服务名配置以及监听文件路径六、plsqldev工具连接Oracle配置 一、安装Oracle数据库软件 点击“setup.…

IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案

IEEE PDF eXpress遇到Font TimesNewRomanPSMT is not embedded的解决方案 问题描述 在IEEE PDF eXpress上上传论文后&#xff0c;出现Font XXX is not embedded的问题。 该问题是指你所插入的图片等&#xff0c;没有将对应的字体嵌入进去。 解决方案 以下以Origin Lab图片…

9.系统学习-卷积神经网络

9.系统学习-卷积神经网络 简介输入层卷积层感受野池化层全连接层代码实现 简介 卷积神经网络是一种用来处理局部和整体相关性的计算网络结构&#xff0c;被应用在图像识别、自然语言处理甚至是语音识别领域&#xff0c;因为图像数据具有显著的局部与整体关系&#xff0c;其在图…

ESP32-C3环境搭建

参考第二讲 ubuntu下的ESP-IDF开发环境搭建_哔哩哔哩_bilibili 宸芯IOT中的资料搭建 因为我买的板子是ESP32C3&#xff0c;所以没有完全按照教程去设置环境&#xff0c;但是也成功。 一、下载ubuntu系统以及esp-idf https://cn.ubuntu.com/download/server/step1 在以上链接…

解决npm报错:sill idealTree buildDeps

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 报错信息 使用 npm 安装依赖时报错&#xff1a;sill idealTree buildDeps 解决方案 请按照以下步骤进行相关操作&#xff1a; 1、删除 C:\Users{账户}\ 文件夹中的 .npm…

【NX入门篇】

NX入门篇 一、UG NX 由来二、软件如何启动&#xff08;UG NX 12.0&#xff09;三、使用步骤四、常用命令 一、UG NX 由来 UG NX由来&#xff1a; 1969 年&#xff1a;UG 的开发始于美国麦道航空公司&#xff0c;基于 C 语言开发实现&#xff1b;1976 年&#xff1a;UG问世&am…

如何在 VSCode 中配置 C++ 开发环境:详细教程

如何在 VSCode 中配置 C 开发环境&#xff1a;详细教程 在软件开发的过程中&#xff0c;选择一个合适的开发环境是非常重要的。Visual Studio Code&#xff08;VSCode&#xff09;作为一款轻量级的代码编辑器&#xff0c;凭借其强大的扩展性和灵活性&#xff0c;受到许多开发者…

超越YOLO11!DEIM:先进的实时DETR目标检测

DEIM: DETR with Improved Matching for Fast Convergence arXiv: https://arxiv.org/abs/2412.04234 Project webpage&#xff1a;https://www.shihuahuang.cn/DEIM/ GitHub&#xff1a;https://github.com/ShihuaHuang95/DEIM 1 背景&#xff1a;DETR目标检测框架 目标检…