STM32第十一课:STM32-基于尺度库的42步进电机的简朴I/O控制(附电机教程,看到即赚到)

[复制链接]
发表于 2026-4-8 07:24:42 | 显示全部楼层 |阅读模式
一:步进电机简介

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

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

  1. #include "Motor.h"
  2. #include "Delay.h"
  3. #include "led.h"
  4. #define TotalNulses 1600    //设置步进电机为8细分,脉冲总数为1600脉冲
  5. // Motor 配置
  6. void Motor_Init(void)
  7. {          
  8.     //首先打开准备输出引脚的时钟
  9.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
  10.     //紧接着初始化对应的GPIO端口,进行相应的参数配置
  11.     GPIO_InitTypeDef GPIO_InitStructure;    //创建GPIO_InitStructure结构体
  12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   //设置引脚模式为输出模式
  13.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //设置为推挽输出
  14.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;  //设置引脚为PB3和PB4引脚
  15.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;  //设置为下拉输出
  16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //设置为输出速度为50MHz
  17.     GPIO_Init(GPIOB,&GPIO_InitStructure);
  18.     GPIO_SetBits(GPIOB,GPIO_Pin_3 | GPIO_Pin_4);    //设置引脚的初始状态为高电位状态
  19. }
  20. void Motor_Start(void)
  21. {
  22.     LED_BLUE_OFF;   //宏定义,蓝灯打开
  23.     LED_RED_ON;     //宏定义,红灯熄灭
  24.     Delay_ms(1000);
  25.     GPIO_SetBits(GPIOB,GPIO_Pin_4);
  26.     for(int i= 0; i < TotalNulses*2; i++)   //模拟PWM控制步进电机
  27.     {
  28.         GPIO_SetBits(GPIOB,GPIO_Pin_3);
  29.         Delay_us(500);  //可以修改延时函数里面的参数,更改步进电机旋转的速度。本质上是模拟改变了PWM的频率,进而改变了速度
  30.         GPIO_ResetBits(GPIOB,GPIO_Pin_3);
  31.         Delay_us(500);
  32.     }
  33.     LED_BLUE_ON;
  34.     LED_RED_OFF;
  35.     Delay_ms(1000);
  36.     GPIO_ResetBits(GPIOB,GPIO_Pin_4);   //置PB4为低电位,改变旋转方向
  37.     for(int i= 0; i < TotalNulses*2; i++)   //跟上文一样,不过是改变了步进电机旋转的方向
  38.     {
  39.         GPIO_SetBits(GPIOB,GPIO_Pin_3);
  40.         Delay_us(500);
  41.         GPIO_ResetBits(GPIOB,GPIO_Pin_3);
  42.         Delay_us(500);
  43.     }
  44. }
复制代码
         这段代码重要设置了控制步进电机脉冲和方向的两个端口引脚,然后自界说了一个电机控制函数,在函数内里模拟了PWM波形举行步进电机的控制。
Main.c

  1. #include "stm32f4xx.h"
  2. #include "led.h"
  3. #include "Delay.h"
  4. #include "usart.h"
  5. #include "Motor.h"
  6. #include "stm32f4xx_tim.h"
  7. uint16_t speed=500;
  8. // 程序入口主函数
  9. int main(void)
  10. {
  11.    
  12.     USART1_Init(115200);                                           // 初始化USART1; 注意, 在bsp_USART.c文件底部,printf已重定向到usart1, 可用于与电脑上位机通信;
  13.     Led_Init();                                                    // LED 初始化
  14.    
  15.     Motor_Init();                                                    // 配置TIM
  16.    
  17.    
  18.     while (1)                                        // while函数死循环;作用:不能让main函数运行结束,否则会产生硬件错误
  19.     {
  20.        Motor_Start();
  21.     }
  22. }
  23. // 每个代码文件的末尾,注意要加两个空行
复制代码
        另有其他比方通讯USART,LED模块在mian函数内里运行,移植时大概会出现灯不亮等环境,只必要简朴的修改参数就可以了。至于工程源码各人可以到文章末端举行下载。
五:实操结果展示


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

         文件源码分享:02-1 Simple IO Port Control Of Stepper Motor.zip - 蓝奏云
        关于后续的PWM控制,将会在反面举行讲授。看在码字不易,用的不是某盘的份上,uu们可以点个赞嘛!谢谢。
        与君共勉 დ,关注我,连续更新中~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表