一:驱动原理:
A4988的驱动原理就是每当STEP引脚收到一个脉冲,驱动器就会使步进电机转动一个步距。
各个引脚的作用:(只讲重要的引脚,没讲到的如果简单使用的话可以忽略)
1,DIRECTION引脚的高低电平控制步进电机的转动方向
2,STEP引脚用于接收MCU的脉冲信号
3,MS1~MS3是用于控制步进分辨率的:整步、半步、四分之一步、八步和十六步;通过它们的电平组合来实现,其真值表如下图所示:
4,VDD\GND接控制芯片的电源(stm32为3.3v,stc51为5.0v)
5,VMOT\GND接驱动电机的电源(8~35v)
6,ENABLE使能引脚,悬空或则低电平有效,高电平则停止驱动
7,1A、1B分别接步进电机的A+和A-;2A、2B分别接步进电机的B+、B-
8,SLEEP低电平有效,RESET低电平有效,将两者短接即可
二:线路连接:
在步骤一中的引脚介绍中已经描述了各个引脚怎么连接,概括一下用于控制线的连接情况就是:1A、1B和2A、2B连接步进电机,ENABLE接单片机IO用于控制使能(不控制直接接地也可),DIRECTION引脚接单片机IO用于控制转动方向(必须给高电平或低电平,否则步进电机可能抖动且噪音较大),STEP用于连接单片机IO产生脉冲来控制转动的速度。
尤其需要注意的一点是:A4988模块上面有一个电位器,其用于控制驱动器的电流,有些小步进电机不需要太大的电流来驱动,如果电流较大即可能导致电机损坏或故障;因此最开始应该将电流值设置为最小,然后给驱动模块脉冲,根据电机的实际转动情况来调节电位器,使其能正常工作(不过度发热且力矩正常)。为了确保电位器调节的电流为最小,可以使用电压表测量电位器(就是电位器调节的十字口的中间)和地线之间的电压(如果电流为零则其电压应该为零或则很低,我的电压最小可达0v),小点的电机将前面所述的电压调节到0.3v就非常发烫。如果没有电压表,可以根据我的调节方向做个参考,如下图所示,电位器逆时针旋转电流变小,顺时针调节则是调大。
三:程序编写:
这个程序编写非常简单,如果为了验证步进电机的转动的话,只用编写程序来控制IO产生一个脉冲信号即可(用引脚给高给低,并配合延时函数即可实现简单脉冲的输出);如果要控制步进电机的输出速度,则应该控制脉冲的频率即可实现。
下面是一个51单片机通过演示来控制步进电机的转速代码:
#include <reg51.h>
#include <intrins.h>
sbit STEP_PIN=P1^2;
sbit DIR_PIN=P1^1;
void delay_ms(unsigned int ms) {
//大约1ms的延时
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++) {
}
}
}
void delay_us(unsigned int us) {
unsigned int i;
for (i = 0; i < us; i++) {
_nop_();
}
}
void main()
{
unsigned int delayTime;
int i;
DIR_PIN = 1;
while (1)
{
for (delayTime = 100; delayTime < 1000; delayTime += 100)
{
DIR_PIN = 1; //正转
for(i = 0;i<200;i++)
{
STEP_PIN = 1;
delay_us(30); //速度控制,时间不能太短,否则不转
STEP_PIN = 0;
delay_us(30); //速度控制
//高低电平时间保持一致,否则会产生剧烈的震动
}
}
for (delayTime = 100; delayTime < 1000; delayTime += 100)
{
DIR_PIN = 0; //反转
for (i = 0; i < 200; i++)
{
STEP_PIN = 1;
delay_us(30);//速度控制
STEP_PIN = 0;
delay_ms(30);//速度控制
}
}
}
}
当然为了更精准地控制步进电机,可以使用定时器中断进行控制,可以参考前面“STC89C52输出指定频率PWM波控制SG90”博客。