【STM32系列】DRV8425步进电机驱动详解
【STM32篇】4988驱动步进电机_hr4988-CSDN博客
在上篇文章中使用了HR4988实现了步进电机的驱动,在实际运用过程,HR4988或者A4988驱动步进电机会存在电机噪音太大的现象。本次将向各位友友介绍一个驱动简单且非常静音的一款步进电机驱动IC。
1.DRV8425简介
DRV8424/25 是适用于工业和消费类应用的步进电机驱动器。该器件由两个 N
沟道功率
MOSFET H
桥驱动器、一个微步进分度器以及集成电流感应功能完全集成。DRV8424
可驱动最高
2.5A
的满量程输出电流
;DRV8425 可驱动最高
2A
的满量程输出电流
(
取决于PCB 设计
)。
这些器件使用能在
智能调优、快速、慢速和混合衰减选项之间进行选择的内部 PWM 电流调节方案。智能调优可通过自动调节实现出色的电流调节性能,并对电机变化和老化效应进行补偿和
减少电机的可闻噪声。
借助简单的 STEP/DIR 接口,可通过外部控制器管理步进电机的方向和步进速率。这款器件可配置为多种步进模式,
从全步进模式到 1/256 微步进模式皆可。该器件通过专用的 nSLEEP 引脚提供低功耗睡眠模式。提供的保护特性包括:
电源欠压、电荷泵故障、过流、短路以及过热保护。故障状态通过 nFAULT 引脚指示。
DRV8425/8424有两种封装,在PCB空间足够的情况下,建议使用
HTSSOP (28)封装。
1.1 引脚配置和功能

1.AOUT1、AOUT2连接电机的A+、A-,BOUT1、BOUT2连接电机的B+、B-;
2.CPH、CPL之间连接一个22nF的陶瓷电容器,这里如果使用了其他容量的电容,可能导致IC无法正常输出,所以在其他配置都没问题时器件无法输出,可能就说电容用错了(亲测如此)。
3.DIR、方向输入内置下拉,可接到MCU引脚上控制。
4.ENABLE引脚低电平禁用输出,高电平启动输出,内部上拉至DVDD。可连接至MCU引脚控制。
5.DVDD逻辑电源电压,典型值5V,可用于其他输入引脚上拉。
6.VREF电流设定基准输入,最大值3.3V。满量程调节电流 (IFS):IFS (A) = VREF (V)/KV (V/A) = VREF (V)/1.32 (V/A)。
7.M0、M1设置步进模式,按照下表在M0、M1引脚上施加相应电压即可配置为需要的步进模式。
M0 | M1 | 步进模式 |
0 | 0 |
100% |
0 |
330k |
71% |
1 | 0 |
非循环 |
Hi-Z | 0 |
1/2 |
0 | 1 |
1/4 |
1 | 1 |
1/8 |
Hi-Z | 1 |
1/16 |
0 | Hi-Z |
1/32 |
Hi-Z | 330kΩ 至 GND |
1/64 |
高阻态 | 高阻态 |
1/128 |
1 | Hi-Z |
1/256 |
电平输入如下图:

8.DECAY0、DECAY1衰减模式设置引脚(根据自己的需求选择不同的衰减模式,这里直接使用智能调优动态)
DECAY0 | DECAY1 | 上升步进 | 下降步进 |
0 | 0 | 智能调优动态衰减 | 智能调优动态衰减 |
0 | 1 | 智能调优纹波控制 | 智能调优纹波控制 |
1 | 0 | 混合衰减:快 30% | 混合衰减:快 30% |
1 | 1 | 慢速衰减 | 混合衰减:快 30% |
高阻态 | 0 | 混合衰减:快 60% | 混合衰减:快 60% |
高阻态 | 1 | 慢速衰减 | 慢速衰减 |
9.STEP步进输入,上升沿前进一步,可接MCU的PWM引脚。软件也主要控制STEP/DIR引脚实现步进电机控制。
10.TOFF设置电流斩波期间的衰减模式关断时间;四电平引脚。还将设置智能调优纹波控制模式中的纹波电流。
TOFF | 特定微步进级别下的电流纹波 |
0 | 19mA + ITRIP 的 1% |
1 | 19mA + ITRIP 的 2% |
Hi-Z | 19mA + ITRIP 的 4% |
330KΩ至GND | 19mA + ITRIP 的 6% |
该纹波控制方法可以更严格地调节电流电平,从而提高电机效率和系统性能。智能调优纹波控制适用于能够承受可变关断时间调节方案的系统,以在电流调节中实现小电流纹波。选择低纹波电流设置可确保 PWM 频率不处于可闻范围之内。不过,较高的纹波电流值会降低 PWM 频率,从而降低开关损耗。
TOFF | 关断时间 |
0 | 7us |
1 | 16us |
Hi-Z | 24us |
330KΩ至GND | 32us |
除智能调优纹波控制模式外,TOFF 引脚将配置所有衰减模式的 PWM 关断时间。
11.nFAULT故障指示,故障时被下拉至低电平,需要外接上拉电阻。(可根据MCU上拉至3.3V)
12.nSLEEP睡眠模式输入,高电平启用器件。低电平脉冲将清除故障。请勿将该引脚接到DVDD,否则将无法退出睡眠模式。
复位脉冲:该脉冲的宽度必须在 20µs 至 40µs 之间。如果 nSLEEP 在 40µs 至 120µs 的时间内保持低电平,则会清除故障,但器件有可能会关断,也有可能不关断。
1.2 器件模式
睡眠模式:nSLEEP=0;
DRV8424/25 器件将通过 nSLEEP 引脚实现状态管理。当 nSLEEP 引脚为低电平时,DRV8424/25 器件将进入低功耗睡眠模式。在睡眠模式下,将会禁用所有内部 MOSFET 和电荷泵。必须在 nSLEEP 引脚触发下降沿之后再过去 tSLEEP 时间后,器件才能进入睡眠模式。如果 nSLEEP 引脚变为高电平,DRV8424/25 器件会自动退出睡眠模式。
禁用模式:nSLEEP=1,ENABLE=0;
ENABLE引脚用于启用或禁用DRV8424/25器件,ENABLE为低电平时,禁止所有输出。
工作模式:nSLEEP=1,ENABLE=Hi-Z/1;
当 nSLEEP 引脚为高电平、ENABLE 引脚为 Hi-Z 或 1 且 VM > UVLO 时,器件将进入运行模式。必须在经过 tWAKE 时间之后,器件才能针对输入做好准备。
1.3 复位脉冲
锁存故障可通过快速 nSLEEP 脉冲清除。该脉冲的宽度必须在 20µs 至 40µs 之间。如果 nSLEEP 在 40µs 至 120µs 的时间内保持低电平,则会清除故障,但器件有可能会关断,也有可能不关断。到检测到nFULT引脚电平为低电平时,可发送复位脉冲清除故障。

nFAULT引脚警告主要分为:(用于保护器件)
VM欠压锁定;
电荷泵欠压;
过流保护;
热关断。
对于DRV8425而言,只能通过nFAULT引脚报警告,需要明确知道错误信息的也可以使用他家的其他串行结构的电机驱动芯片。但相对于4988,DRV8425的价格还是有点小贵的。

2.硬件设计
2.1硬件电路连接

1.电源输入VCC工作电源电源:4.5V至33V。可根据电机规则选择合适的工作电压;
2.步进模式:通过修改R2、R3、R6、R7选择不同的步进模式,此处为1/125步进模式(M0=1,M1=Hi-Z;125个脉冲电机步进1.8°)。 步进细分越大,可闻噪声越小。
3.DECAY0、DECAY1=01,使用智能调优纹波控制,TOFF = 0,电流纹波19mA + ITRIP 的 1%。
4.通过R8、R10分压给VREF,调节输出电流大小。
5.DIR/STEP、ENABLE、nSEELP引脚由单片机控制外接单片机控制。
在不出故障的前提下,使用DIR/STEP引脚控制步进电机,代码与4988几乎相同,但是不能软件改变步进模式。如果需要使用软件改变步进模式,可以选择DRV8434,其功能相似且支持SPI串行通行,可输出具体故障信息(例如电机未接入,IC通过nFULL引脚输出低电平报警,通过SPI可查询故障信息)。对于DRV8434的电机控制也可以直接使用DIR/STEP 引脚控制。
2.2 PCB文件


3.软件设计
在单片机选择上本次使用STM32F103C8T6。引脚连接如下图:

STM32F103 | DRV8425 |
A0 | nSLEEP |
A1 | ENABLE |
A2 | DIR |
A3(TIM2_CH4) | STEP |
A4(这里未接入) | nFAULT |
在软件编写上与A4988的类似,这里使用定时器输出PWM波控制STEP引脚,通过控制PWM波的周期长度控制电机的转动速率,其他引脚都是用通用IO口控制输出高低电平即可,由于电机在一般情况下不会报警告,所以就没有接nFAULT引脚(报警时会被下拉为低电平)。所以我们配置TIM输出PWM波就可以控制电机工作。
DRV8425支持最大500KHZ的脉冲频率,要想电机转速快一点只能通过增大PWM频率或者修改步进模式实现。这里定时器预分频为35,时钟频率一分频,TIM的时钟频率2MHZ;重装载寄存器值400,PWM频率5KHZ(0.0002s);360度需要200个1.8度,转动1.8度需要256个脉冲,电机旋转一周需要51200个脉冲即10.24秒。控制A2的电平高低就可以控制电机转动反向,控制TIM使能或使能就可以控制电机转动和停止,控制TIMx_ARR和TIMx_CCR1就可以控制电机转速。
以下是简单控制电机翻转正反转代码例程:
<motor.c>
#include "motor.h"
/*
引脚连接:
PA0 - NSLEEP 睡眠引脚
PA1 - ENABLE 使能引脚
PA2 - DIR 方向引脚
PA3 - STEP TIM2_CH4 步进引脚
*/
uint16_t motor_count;
uint8_t motor_dir;
void MOTOR_Init(void)
{
//1.引脚初始化
GPIO_InitTypeDef motor_gpio_init;
motor_gpio_init.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2;
motor_gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
motor_gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&motor_gpio_init); //DIR ENABLE 通用推挽输出模式
motor_gpio_init.GPIO_Pin = GPIO_Pin_3;
motor_gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&motor_gpio_init); //STEP 复用推挽输出
//2.定时器初始化配置
TIM_DeInit(TIM2);
TIM_TimeBaseInitTypeDef motor_TimeInit;
motor_TimeInit.TIM_Prescaler = 35; //预分频值
motor_TimeInit.TIM_ClockDivision = TIM_CKD_DIV1;
motor_TimeInit.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
motor_TimeInit.TIM_Period = 400; //重装载值
motor_TimeInit.TIM_RepetitionCounter = 0; //重复计数值
TIM_TimeBaseInit(TIM2,&motor_TimeInit); //基本计数模式
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //配置更新中断
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除更新中断位
TIM_OCInitTypeDef motor_OCInit;
TIM_OCStructInit(&motor_OCInit);
motor_OCInit.TIM_OCMode = TIM_OCMode_PWM1;//小于CCR为有效电平
motor_OCInit.TIM_OCIdleState = TIM_OCIdleState_Set;//空闲极性
motor_OCInit.TIM_OCPolarity = TIM_OCPolarity_Low;//有效电平
motor_OCInit.TIM_OutputState = TIM_OutputState_Enable;
motor_OCInit.TIM_Pulse = 200;
TIM_OC4Init(TIM2,&motor_OCInit); //配置通道4PWM
//失能motor
MOTOR_STOP();
//退出睡眠模式,使能输出
MOTOR_NSLEEP_H();
MOTOR_ENABLE_H();
MOTOR_DIR_CW; //顺时针
MOTOR_START();
}
//中断服务函数
void TIM2_IRQHandler(void)
{
if(RESET != TIM_GetITStatus(TIM2,TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
motor_count++;
if(motor_count == 51200)//旋转一圈 360 / 1.8 * 256 = 51200
{
motor_count = 0;
motor_dir = motor_dir ^1;//翻转方向
MOTOR_DIR(motor_dir);
}
}
}
<motor.h>
#ifndef _MOTOR_H_
#define _MOTOR_H_
#include "stm32f10x.h"
#define MOTOR_NSLEEP_H() GPIO_SetBits(GPIOA,GPIO_Pin_0)
#define MOTOR_NSLEEP_L() GPIO_ResetBits(GPIOA,GPIO_Pin_0)
#define MOTOR_ENABLE_H() GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define MOTOR_ENABLE_L() GPIO_ResetBits(GPIOA,GPIO_Pin_1)
#define MOTOR_DIR_CCW GPIO_SetBits(GPIOA,GPIO_Pin_2) //逆时针
#define MOTOR_DIR_CW GPIO_ResetBits(GPIOA,GPIO_Pin_2) //顺时针
#define MOTOR_DIR(x) GPIO_WriteBit(GPIOA,GPIO_Pin_2,(BitAction )x)
#define MOTOR_STOP() TIM_Cmd(TIM2,DISABLE) //停止转动
#define MOTOR_START() TIM_Cmd(TIM2,ENABLE) //开始转动
#define SET_MOTOR_SPEED(x) {TIM_SetAutoreload(TIM2,x);TIM_SetCompare3(TIM2,x/2)}//设置速度
void MOTOR_Init(void);
#endif
链接:https://pan.baidu.com/s/1dy85ukQaq_6h0CbGaqduNw?pwd=1234
提取码:1234
4.演示
正反转一周视频演示:电机转动一周时间约10s
DRV8425驱动步进电机
作者:这可不是猴