基于STM32步进电机学习笔记

一、步进电机简介

步进电机是一种特殊的电机,它按照一定步距进行旋转,每个步距都对应一个特定的转角,因此可以精确地控制电机的位置和运动。与直流电机相比,步进电机具有较高的位置精度、较低的噪音、较低的功耗等优点,因此在自动化、机器人、电子设备等领域中得到了广泛应用。
步进电机通常由定子和转子两部分组成。定子包括一个或多个线圈,转子包括一个或多个磁性极对。通过控制定子线圈的电流,可以使磁性极对依次被吸引和排斥,从而实现电机的旋转。步进电机根据线圈数目、旋转角度、旋转精度等特点可以分为不同类型,如单相步进电机、两相步进电机、三相步进电机等。
通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时我们可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

二、关于ULN2003与28BYJ-48

1.ULN2003

请添加图片描述

(1)ULN2003的基本介绍

ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。一般采用DIP—16 或SOP—16 塑料封装。

  • ULN2003的主要特点:
    ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
    ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。

(2)ULN2003的作用

ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。
简单地说,ULN2003其实就是用来放大电流的,增加驱动能力。比如说单片机输出引脚一般输出就几mA,是无法驱动电机、继电器或者电磁阀的,像要让直流电机转需要500mA,而用ULN2003放大后,可以通过单片机的输出引脚直接控制这些设备。
由于单片机的引脚输出电流太低了,无法驱动大部分的设备。而ULN2003只相当于是一个开关,设备(负载)的供电是在外围电路上,而它能够通过微弱的单片机输出电流来控制外围电路的开闭。这某种程度上也可以说是,放大电流,增加驱动能力。

2.28BYJ-48

28BYJ-48是一款常用的步进电机,具有低成本、低功耗、低噪音等优点,广泛应用于机器人、自动化控制、航模等领域。采用四相五线式驱动,也就是用ULN2003进行驱动。
四相:指的是电机有四个定子绕组(即是A相,B相,C相,D相)
五线:指的是四个输入高低电平的线,一个共地的线
四拍:指的是通电次序依次是A-B-C-D-A
双四拍:指的是通电次序依次是AB-BC-CD-DA-AB
八拍:指的是通电次序依次是A-AB-B-BC-C-CD-D-DA-A

  • 四拍
    在这里插入图片描述
  • 八拍
    在这里插入图片描述
    四拍的代码
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while (1)
  {
	HAL_GPIO_WritePin(GPIOF,IN1_Pin,1);
	HAL_GPIO_WritePin(GPIOF,IN2_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN3_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN4_Pin,0);
	HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOF,IN1_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN2_Pin,1);
	HAL_GPIO_WritePin(GPIOF,IN3_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN4_Pin,0);
	HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOF,IN1_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN2_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN3_Pin,1);
	HAL_GPIO_WritePin(GPIOF,IN4_Pin,0);
	HAL_Delay(1);
	HAL_GPIO_WritePin(GPIOF,IN1_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN2_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN3_Pin,0);
	HAL_GPIO_WritePin(GPIOF,IN4_Pin,1);
	HAL_Delay(1);	  
  }
}

好了入门之后我们来学习丝杆步进电机吧

三、丝杆步进电机与DM542

1.丝杆步进电机

这个图画的好看
在这里插入图片描述
可以看到定子的绕线中间有连接在一起

2.DM542

在这里插入图片描述

概述

DM542 驱动器是一款专业的两相混合式数字式步进电机驱动器,可适配国内外各种品牌,电流在4.2A及以下,外径42,57,86mm的四线,六线,八线两相混合式步进电机。适合各种小中型自动化设备和仪器,例如:雕刻机、打标机、切割机、激光照排、绘图仪、数控机床、拿放装置等。在用户期望大电流、小噪声、高细分运行的设备中效果特性。
特点

  • 信号输入:单端,脉冲/方向
  • 细分可选:2/4/8/16/32/64/128/5/10/20/25/40/50/100/125细分
  • 输出电流:1.0A-4.2A
  • 输入电压:20-50VDC
  • 可驱动4,6,8线两相、四相步进电机
  • 光耦隔离信号输入,抗干扰能力强
  • 具有过热、过流、欠压锁定、输入电压防反接保护等功能
  • 大体积散热片,有效散热,安装方便
  • 外部信号3.3-24V通用,无需串联电阻

接口

接口内容
PUL+ PUL-脉冲输入信号。默认脉冲上升沿有效。为了可靠响应脉冲信号,脉冲宽度应大于1.2us。
DIR+ DIR-方向输入信号,高/低电平信号,为保证电机可靠换向,方向信号应先于脉冲信号至少5us建立。电机的初始运行方向与电机绕组接线有关,互换任一相绕组(如A+、A-交换)可以改变电机初始运行方向。
ENA+ ENA-使能输入信号(脱机信号),用于使能或禁止驱动器输出。使能时,驱动器将切断电机各相的电流使电机处于自由状态,不响应步进脉冲。当不需用此功能时,使能信号端悬空即可。(使能信号有可能是0也有可能是1)
A+,A-电机A相绕组
B+,B-电机B相绕组
VCC直流电源正范围20-50VDC
GND直流电源负

拨码可以调节丝杆步进电机旋转一圈所需要的脉冲数

1.硬件接线

请添加图片描述
我是采用共阴接法

  • 输出A+A-B+B-都接在电机上,电源的VCC和GND全都接上
  • 上方端子ENA-、DIR-和PUL-全都需要与单片机/控制器共地
  • 方向信号即是由单片机/控制器给1/0控制正转/反转
  • 使能信号ENA+接单片机/控制器VCC(有可能是GND这要看驱动器型号),驱动器我认为可以一直使能,如果想要让电机停下的话就把比较值设置为0即可
  • 脉冲信号我接了定时器输出的PWM波

2.软件代码

由于我是用STM32F407ZGT6做的控制器,接下来会用到cube跟keil编写代码

cube

RCC
在这里插入图片描述Timer
在这里插入图片描述
GPIO
在这里插入图片描述
时钟树
在这里插入图片描述

keil

其实只需要在主函数使能PWM输出,设置比较值就能驱动电机了

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_3);
 __HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_3, 500);  
  /* USER CODE END 2 */
  
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_RESET);
	  HAL_Delay(2000);
	  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0, GPIO_PIN_SET);
	  HAL_Delay(2000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

四、丝杆步进电机滑块的位置环

通过单电激光测距模块可以测量步进电机底盘到步进电机滑块的距离,由此我们可以实现滑块的位置闭环控制,现在很多的步进电机闭环控制都是使用编码器进行控制的,普通编码器本身存在误差在低速情况下不好控制。用激光测距模块误差为0.2mm,只是成本较高。
由于控制电机正反转也需要通过DIR+给1/0,所以需要有一个判断方向的函数

void Diretion_distion(double Targetdistance)
{
	static Targetdistance_old;
	if(Targetdistance>Targetdistance_old)HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0;1);
	else if(Targetdistance<Targetdistance_old)HAL_GPIO_WritePin(GPIOF,GPIO_PIN_0;0);
	Targetdistance_old=Targetdistance;
}

由此步进电机就实现了位置环

补充

:如果二相步进电机的A+A-B+B-我不知道哪根对应哪根,要如何测出来?
:使用万用表进行测试:将万用表的电阻档位调至正常范围,将一根测试引线接到其中一个电机端子上,另一根测试引线分别接触另外三个端子,若显示电阻值,则说明连接正确,反之则说明连接错误。重复以上步骤,直到确定每个端子的对应关系。(为什么会这么抽象的问题呢?因为nikolkr之前做项目的时候嫌那四根线太短把之前的线拆掉了换上四根更长的线,后面那四根由于长的太像了然后标签纸还掉了,就不知道哪一个是A相哪一根是B相了)

:步进电机每给一个脉冲就是转动固定的角度,其实是很适合做开环控制的,为什么还要使用激光测距模块做位置环呢?
:由于我们购入的步进电机是没有带编码器的步进电机,所以如果没有激光测距模块测量距离的话就无法做到真正的闭环控制。而我发现电机在经过一段时间的往复运动过后就会产生丢步,所以有必要使用激光测距模块做位置环。

:为什么没有使用PID算法让步进电机的滑块更快速的到达目标位置呢?
:其实使用PID理论上是完全可行的,看上去的效果就是距离目标速度越近滑块的速度就越慢。如果想做的话其实可以调节定时器输出PWM的预分频系数或者是向上溢出值,这样就可以调节输出脉冲的频率了。要注意的是调节比较值是没有办法调节步进电机的转速的,除非把比较值置0这样才不会产生脉冲。因为步进电机驱动器是要靠脉冲驱动步进电机的,单纯改变比较重无法改变频率。

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值