赞
踩
步进电机是一种特殊的电机,它按照一定步距进行旋转,每个步距都对应一个特定的转角,因此可以精确地控制电机的位置和运动。与直流电机相比,步进电机具有较高的位置精度、较低的噪音、较低的功耗等优点,因此在自动化、机器人、电子设备等领域中得到了广泛应用。
步进电机通常由定子和转子两部分组成。定子包括一个或多个线圈,转子包括一个或多个磁性极对。通过控制定子线圈的电流,可以使磁性极对依次被吸引和排斥,从而实现电机的旋转。步进电机根据线圈数目、旋转角度、旋转精度等特点可以分为不同类型,如单相步进电机、两相步进电机、三相步进电机等。
通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。我们可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时我们可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。一般采用DIP—16 或SOP—16 塑料封装。
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中,可直接驱动继电器等负载。输入5VTTL电平,输出可达500mA/50V。
简单地说,ULN2003其实就是用来放大电流的,增加驱动能力。比如说单片机输出引脚一般输出就几mA,是无法驱动电机、继电器或者电磁阀的,像要让直流电机转需要500mA,而用ULN2003放大后,可以通过单片机的输出引脚直接控制这些设备。
由于单片机的引脚输出电流太低了,无法驱动大部分的设备。而ULN2003只相当于是一个开关,设备(负载)的供电是在外围电路上,而它能够通过微弱的单片机输出电流来控制外围电路的开闭。这某种程度上也可以说是,放大电流,增加驱动能力。
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 驱动器是一款专业的两相混合式数字式步进电机驱动器,可适配国内外各种品牌,电流在4.2A及以下,外径42,57,86mm的四线,六线,八线两相混合式步进电机。适合各种小中型自动化设备和仪器,例如:雕刻机、打标机、切割机、激光照排、绘图仪、数控机床、拿放装置等。在用户期望大电流、小噪声、高细分运行的设备中效果特性。
特点
接口 | 内容 |
---|---|
PUL+ PUL- | 脉冲输入信号。默认脉冲上升沿有效。为了可靠响应脉冲信号,脉冲宽度应大于1.2us。 |
DIR+ DIR- | 方向输入信号,高/低电平信号,为保证电机可靠换向,方向信号应先于脉冲信号至少5us建立。电机的初始运行方向与电机绕组接线有关,互换任一相绕组(如A+、A-交换)可以改变电机初始运行方向。 |
ENA+ ENA- | 使能输入信号(脱机信号),用于使能或禁止驱动器输出。使能时,驱动器将切断电机各相的电流使电机处于自由状态,不响应步进脉冲。当不需用此功能时,使能信号端悬空即可。(使能信号有可能是0也有可能是1) |
A+,A- | 电机A相绕组 |
B+,B- | 电机B相绕组 |
VCC | 直流电源正范围20-50VDC |
GND | 直流电源负 |
拨码可以调节丝杆步进电机旋转一圈所需要的脉冲数
我是采用共阴接法
由于我是用STM32F407ZGT6做的控制器,接下来会用到cube跟keil编写代码
RCC
Timer
GPIO
时钟树
其实只需要在主函数使能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这样才不会产生脉冲。因为步进电机驱动器是要靠脉冲驱动步进电机的,单纯改变比较重无法改变频率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。