DRV8833

DRV8833 是一款由德州仪器(Texas Instruments, TI)推出的双通道 H 桥电机驱动器芯片,广泛应用于直流电机、步进电机和其他低电压驱动场景。

H桥控制电路

桥是一个比较简单的电路,通常它会包含四个独立控制的开关元器件(例如 MOSFET),它们通常用于驱动电流较大的负载,比如电机,至于为什么要叫H桥(H-Bridge),因为长得比较像 字母H,具体如下图所示

hqiao

正转

此时假设电机正转,这电流依次经过 Q1 , M , Q4 ,在图中使用黄色线段进行标注,具体如下图所示

zhengzhuan

反转

此时电机反转(与前面介绍的情况相反),这电流依次经过 Q2 , M , Q3 ,在图中使用黄色线段进行标注,具体如下图所示

fanzhuan

特性

双路 H 桥电流控制电机驱动器

  • 可驱动两部直流电机或一部步进电机。
  • 低 MOSFET 导通电阻:高侧 (HS) + 低侧 (LS) 为 360mΩ。

输出电流

  • PWP/RTY 封装:每条 H 桥的 RMS 电流为 1.5A,峰值电流为 2A。
  • PW 封装:每条 H 桥的 RMS 电流为 500mA,峰值电流为 2A。
  • 支持输出并联,PWP 和 RTY 封装可实现 3A RMS 电流和 4A 峰值电流;PW 封装可实现 1A RMS 电流和 4A 峰值电流。

宽电源电压范围:2.7V 至 10.8V。

PWM 绕组电流调节/电流限制

引脚说明

DRV8833 共有三总封装类型:

  • TSSOP (16):5.00mm x 4.40mm
  • HTSSOP (16):5.00mm x 4.40mm
  • WQFN (16):4.00mm x 4.00mm

yjsm

名称 WQFN HTSSOP, TSSOP I/O 描述 外部组件或连接
电源和接地
GND 11 13 设备接地。HTSSOP 包装具有 PowerPAD。 GND 引脚和电源 PowerPAD 都需要连接到地。
VINT 12 14 内部电源旁路 用 2.2µF、6.3V 电容旁路到地。
VM 10 12 设备电源 连接到电机驱动。推荐使用 10µF(最小值)陶瓷旁路电容到 GND。
VCP 9 11 IO 高侧门驱动电压 连接到 0.01µF、16V(最小值)X7R 陶瓷电容到 VM。
控制
AIN1 14 16 I 桥 A 输入 1 逻辑输入控制 AOUT1 的状态。内部下拉电阻。
AIN2 13 15 I 桥 A 输入 2 逻辑输入控制 AOUT2 的状态。内部下拉电阻。
BIN1 7 9 I 桥 B 输入 1 逻辑输入控制 BOUT1 的状态。内部下拉电阻。
BIN2 8 10 I 桥 B 输入 2 逻辑输入控制 BOUT2 的状态。内部下拉电阻。
nSLEEP 15 1 I 睡眠模式 逻辑高使设备进入低功耗睡眠模式,并重置所有内部逻辑。内部下拉电阻。
状态
nFAULT 6 8 OD 故障输出 故障条件下(过温、过流)逻辑低电平输出。
输出
AISEN 1 3 IO 桥 A 地面 / I_SENSE 连接到桥 A 的电流感测电阻,或如果不需要电流控制,则连接到 GND。
BISEN 4 6 IO 桥 B 地面 / I_SENSE 连接到桥 B 的电流感测电阻,或如果不需要电流控制,则连接到 GND。
AOUT1 16 2 O 桥 A 输出 1 连接到电机 A 绕组。
AOUT2 2 4 O 桥 A 输出 2 连接到电机 A 绕组。
BOUT1 5 7 O 桥 B 输出 1 连接到电机 B 绕组。
BOUT2 3 5 O 桥 B 输出 2 连接到电机 B 绕组。

H桥控制逻辑

DRV8833 的每个 H 桥(A 桥和 B 桥)由两个输入引脚(xIN1 和 xIN2)控制,分别对应两个输出引脚(xOUT1 和 xOUT2)。通过输入引脚的不同逻辑组合,可以实现电机的不同工作状态。

xIN1 xIN2 xOUT1 xOUT2 功能描述
0 0 Z Z 滑行/快速衰减(Coast/Fast Decay)
0 1 L H 反转(Reverse)
1 0 H L 正转(Forward)
1 1 L L 刹车/慢速衰减(Brake/Slow Decay)

Z:高阻态(输出断开)。L:低电平。H:高电平。

PWM 控制与衰减模式

当使用 PWM(脉宽调制)控制电机速度时,电机绕组的感性特性会导致电流在 PWM 信号中断后继续流动,这种电流称为续流电流。为了处理续流电流,H 桥可以工作在两种不同的衰减模式下:

快速衰减(Fast Decay)

  • 工作原理:H 桥被禁用,续流电流通过 MOSFET 的体二极管流动。
  • 优点:电流衰减速度快,适合需要快速停止或反转的场景。
  • 控制方式
    • 正转 PWM + 快速衰减:xIN1 = PWM,xIN2 = 0。
    • 反转 PWM + 快速衰减:xIN1 = 0,xIN2 = PWM。

慢速衰减(Slow Decay)

  • 工作原理:电机绕组被短路,续流电流通过 MOSFET 的低阻抗路径流动。
  • 优点:电流衰减平稳,适合需要平滑控制的场景。
  • 控制方式
    • 正转 PWM + 慢速衰减:xIN1 = 1,xIN2 = PWM。
    • 反转 PWM + 慢速衰减:xIN1 = PWM,xIN2 = 1。

PWM 控制逻辑表

xIN1 xIN2 功能描述
PWM 0 正转 PWM + 快速衰减
1 PWM 正转 PWM + 慢速衰减
0 PWM 反转 PWM + 快速衰减
PWM 1 反转 PWM + 慢速衰减

PWM(脉宽调制信号)、1(高电平)、0(低电平)

驱动代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
// drv8833.h
#ifndef __DRV8833_H
#define __DRV8833_H

#include "gd32e23x.h"
#include "systick.h"

#define RCU_AIN1 RCU_GPIOA
#define PORT_AIN1 GPIOA
#define GPIO_AIN1 GPIO_PIN_2
#define AF_AIN1 GPIO_AF_0

#define RCU_AIN2 RCU_GPIOA
#define PORT_AIN2 GPIOA
#define GPIO_AIN2 GPIO_PIN_3
#define AF_AIN2 GPIO_AF_0

#define RCU_BIN1 RCU_GPIOB
#define PORT_BIN1 GPIOB
#define GPIO_BIN1 GPIO_PIN_0
#define AF_BIN1 GPIO_AF_1

#define RCU_BIN2 RCU_GPIOB
#define PORT_BIN2 GPIOB
#define GPIO_BIN2 GPIO_PIN_1
#define AF_BIN2 GPIO_AF_1

#define RCU_AIN1_TIMER RCU_TIMER14
#define BSP_AIN1_TIMER TIMER14 // 定时器
#define BSP_AIN1_CHANNEL TIMER_CH_0 // 定时器通道

#define RCU_AIN2_TIMER RCU_TIMER14
#define BSP_AIN2_TIMER TIMER14 // 定时器
#define BSP_AIN2_CHANNEL TIMER_CH_1 // 定时器通道

#define RCU_BIN1_TIMER RCU_TIMER2
#define BSP_BIN1_TIMER TIMER2 // 定时器
#define BSP_BIN1_CHANNEL TIMER_CH_2 // 定时器通道

#define RCU_BIN2_TIMER RCU_TIMER2
#define BSP_BIN2_TIMER TIMER2 // 定时器
#define BSP_BIN2_CHANNEL TIMER_CH_3 // 定时器通道

#define AIN1_OUT(X) gpio_bit_write(PORT_AIN1, GPIO_AIN1, X?SET:RESET)
#define AIN2_OUT(X) gpio_bit_write(PORT_AIN2, GPIO_AIN2, X?SET:RESET)

#define BIN1_OUT(X) gpio_bit_write(PORT_BIN1, GPIO_BIN1, X?SET:RESET)
#define BIN2_OUT(X) gpio_bit_write(PORT_BIN2, GPIO_BIN2, X?SET:RESET)

void DRV8833_Init(uint16_t pre,uint16_t per);
void AO_Control(uint8_t dir, uint32_t speed);
void BO_Control(uint8_t dir, uint32_t speed);
#endif
============================================================================
//drv8833.c
#include "bsp_drv8833.h"
#include "systick.h"

/******************************************************************
* 函 数 名 称:DRV8833_Init
* 函 数 说 明:PWM配置
* 函 数 形 参: pre定时器时钟预分频值 per周期
* 函 数 返 回:无
* 作 者:LC
* 备 注:PWM频率=200 000 000 /( (pre+1) * (per+1) )
******************************************************************/
void DRV8833_Init(uint16_t pre,uint16_t per){
// 定义定时器结构体
timer_parameter_struct timere_initpara={0};
//定时器比较输出结构体
timer_oc_parameter_struct timer_ocintpara={0};

//定时器时钟
rcu_periph_clock_enable(RCU_AIN1_TIMER); // 开启定时器时钟
rcu_periph_clock_enable(RCU_AIN2_TIMER);
rcu_periph_clock_enable(RCU_BIN1_TIMER);
rcu_periph_clock_enable(RCU_BIN2_TIMER);
//引脚时钟
rcu_periph_clock_enable(RCU_AIN1);
rcu_periph_clock_enable(RCU_AIN2);
rcu_periph_clock_enable(RCU_BIN1);
rcu_periph_clock_enable(RCU_BIN2);

//rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4); // 配置定时器时钟

/* 配置AIN1*/
gpio_mode_set(PORT_AIN1,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_AIN1);
gpio_output_options_set(PORT_AIN1,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_AIN1);
gpio_af_set(PORT_AIN1,AF_AIN1,GPIO_AIN1);
/* 配置AIN2*/
gpio_mode_set(PORT_AIN2,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_AIN2);
gpio_output_options_set(PORT_AIN2,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_AIN2);
gpio_af_set(PORT_AIN2,AF_AIN2,GPIO_AIN2);

/* 配置BIN1*/
gpio_mode_set(PORT_BIN1,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_BIN1);
gpio_output_options_set(PORT_BIN1,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_BIN1);
gpio_af_set(PORT_BIN1,AF_BIN1,GPIO_BIN1);
/* 配置BIN2*/
gpio_mode_set(PORT_BIN2,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_BIN2);
gpio_output_options_set(PORT_BIN2,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_BIN2);
gpio_af_set(PORT_BIN2,AF_BIN2,GPIO_BIN2);

/* 配置定时器参数 */
timer_deinit(BSP_AIN1_TIMER);
timer_deinit(BSP_AIN2_TIMER);
timer_deinit(BSP_BIN1_TIMER);
timer_deinit(BSP_BIN2_TIMER);

// 复位定时器
timere_initpara.prescaler = pre-1; // 时钟预分频值
timere_initpara.alignedmode = TIMER_COUNTER_EDGE; // 边缘对齐
timere_initpara.counterdirection = TIMER_COUNTER_UP; // 向上计数
timere_initpara.period = per-1; // 周期
timere_initpara.clockdivision = TIMER_CKDIV_DIV1; // 分频因子
timere_initpara.repetitioncounter = 0; // 重复计数器 0-255

timer_init(BSP_AIN1_TIMER,&timere_initpara); // 初始化定时器
timer_init(BSP_AIN2_TIMER,&timere_initpara); // 初始化定时器
timer_init(BSP_BIN1_TIMER,&timere_initpara); // 初始化定时器
timer_init(BSP_BIN2_TIMER,&timere_initpara); // 初始化定时器

/* 配置输出结构体 */
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; // 有效电平的极性
timer_ocintpara.outputstate = TIMER_CCX_ENABLE; // 配置比较输出模式状态 也就是使能PWM输出到端口
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; // 通道互补输出极性为高电平
timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE; // 通道互补输出状态失能
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; // 信道输出的空闲状态为低
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;// 信道互补输出的空闲状态为低

/* 配置定时器输出功能 */
timer_channel_output_config(BSP_AIN1_TIMER,BSP_AIN1_CHANNEL,&timer_ocintpara);
timer_channel_output_config(BSP_AIN2_TIMER,BSP_AIN2_CHANNEL,&timer_ocintpara);
timer_channel_output_config(BSP_BIN1_TIMER,BSP_BIN1_CHANNEL,&timer_ocintpara);
timer_channel_output_config(BSP_BIN2_TIMER,BSP_BIN2_CHANNEL,&timer_ocintpara);

/* 配置占空比 范围 0 ~ (per-1) */
timer_channel_output_pulse_value_config(BSP_AIN1_TIMER,BSP_AIN1_CHANNEL,1000);
timer_channel_output_pulse_value_config(BSP_AIN2_TIMER,BSP_AIN2_CHANNEL,1000);
timer_channel_output_pulse_value_config(BSP_BIN1_TIMER,BSP_BIN1_CHANNEL,1000);
timer_channel_output_pulse_value_config(BSP_BIN2_TIMER,BSP_BIN2_CHANNEL,1000);

// 配置定时器通道输出比较模式
timer_channel_output_mode_config(BSP_AIN1_TIMER,BSP_AIN1_CHANNEL,TIMER_OC_MODE_PWM0); // 配置定时器通道输出比较模式
timer_channel_output_mode_config(BSP_AIN2_TIMER,BSP_AIN2_CHANNEL,TIMER_OC_MODE_PWM0); // 配置定时器通道输出比较模式
timer_channel_output_mode_config(BSP_BIN1_TIMER,BSP_BIN1_CHANNEL,TIMER_OC_MODE_PWM0); // 配置定时器通道输出比较模式
timer_channel_output_mode_config(BSP_BIN2_TIMER,BSP_BIN2_CHANNEL,TIMER_OC_MODE_PWM0);
// 配置定时器通道输出影子寄存器
timer_channel_output_shadow_config(BSP_AIN1_TIMER,BSP_AIN1_CHANNEL,TIMER_OC_SHADOW_DISABLE);
// 配置定时器通道输出影子寄存器
timer_channel_output_shadow_config(BSP_AIN2_TIMER,BSP_AIN2_CHANNEL,TIMER_OC_SHADOW_DISABLE);
// 配置定时器通道输出影子寄存器
timer_channel_output_shadow_config(BSP_BIN1_TIMER,BSP_BIN1_CHANNEL,TIMER_OC_SHADOW_DISABLE);
// 配置定时器通道输出影子寄存器
timer_channel_output_shadow_config(BSP_BIN2_TIMER,BSP_BIN2_CHANNEL,TIMER_OC_SHADOW_DISABLE);

/* 只有高级定时器使用 */
timer_auto_reload_shadow_enable(BSP_AIN1_TIMER);
timer_auto_reload_shadow_enable(BSP_AIN2_TIMER);
timer_auto_reload_shadow_enable(BSP_BIN1_TIMER);
timer_auto_reload_shadow_enable(BSP_BIN2_TIMER);

timer_primary_output_config(BSP_AIN1_TIMER, ENABLE);
timer_primary_output_config(BSP_AIN2_TIMER, ENABLE);
timer_primary_output_config(BSP_BIN1_TIMER, ENABLE);
timer_primary_output_config(BSP_BIN2_TIMER, ENABLE);

/* 使能定时器 */
timer_enable(BSP_AIN1_TIMER);
timer_enable(BSP_AIN2_TIMER);
timer_enable(BSP_BIN1_TIMER);
timer_enable(BSP_BIN2_TIMER);
}

/******************************************************************
* 函 数 名 称:AO_Control
* 函 数 说 明:A端口电机控制
* 函 数 形 参:dir旋转方向 1正转0反转 speed旋转速度,范围(0 ~ per-1)
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void AO_Control(uint8_t dir, uint32_t speed){
if( dir == 1 ){
//AO1输出
timer_channel_output_pulse_value_config(BSP_AIN1_TIMER,BSP_AIN1_CHANNEL, 0 );
//AO2输出
timer_channel_output_pulse_value_config(BSP_AIN2_TIMER,BSP_AIN2_CHANNEL, speed );
}
else{
//AO1输出
timer_channel_output_pulse_value_config(BSP_AIN1_TIMER,BSP_AIN1_CHANNEL, speed );
//AO2输出
timer_channel_output_pulse_value_config(BSP_AIN2_TIMER,BSP_AIN2_CHANNEL, 0 );
}
}

/******************************************************************
* 函 数 名 称:B0_Control
* 函 数 说 明:B端口电机控制
* 函 数 形 参:dir旋转方向 1正转0反转 speed旋转速度,范围(0 ~ per-1)
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void BO_Control(uint8_t dir, uint32_t speed){
if( dir == 1 ){
//BO1输出
timer_channel_output_pulse_value_config(BSP_BIN1_TIMER,BSP_BIN1_CHANNEL, 0 );
//BO2输出
timer_channel_output_pulse_value_config(BSP_BIN2_TIMER,BSP_BIN2_CHANNEL, speed );
}
else{
//BO1输出
timer_channel_output_pulse_value_config(BSP_BIN1_TIMER,BSP_BIN1_CHANNEL, speed );
//BO2输出
timer_channel_output_pulse_value_config(BSP_BIN2_TIMER,BSP_BIN2_CHANNEL, 0 );
}
}
===========================================================================
// main.c
#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "bsp_usart.h"
#include "bsp_drv8833.h"

int main(void){
int i = 0;

systick_config(); // 滴答定时器初始化
usart_gpio_config(9600U); // 串口0初始化

DRV8833_Init(10,8000);

while(1){
i += 100;
if( i > 8000 ) i = 0;

AO_Control(0,i);//A端电机反转
BO_Control(1,i);//B端电机正转
delay_1ms(50);
}
}