基于STM32和L298N的电机驱动系统设计与实现
L298N驱动原理与使用要点硬件连接方案与保护措施PWM调速实现方法完整的软件驱动实现增加编码器反馈实现闭环控制开发PID调速算法添加蓝牙/WiFi远程控制实现运动轨迹规划本设计方案已在实际项目中验证可靠性,读者可根据具体需求进行调整和扩展。希望本文能为电机控制领域的开发者提供有价值的参考。
·
基于STM32和L298N的电机驱动系统设计与实现
目录
-
L298N电机驱动板详解
- 1.1 L298N基本特性与参数
- 1.2 引脚功能说明
- 1.3 典型应用电路
-
硬件连接方案
- 2.1 STM32与L298N的连接方法
- 2.2 电源系统设计
- 2.3 保护电路实现
-
软件驱动开发
- 3.1 GPIO初始化配置
- 3.2 PWM信号生成
- 3.3 电机控制逻辑
-
核心代码实现
- 4.1 电机驱动初始化
- 4.2 速度控制函数
- 4.3 方向控制实现
-
调试与优化技巧
-
实际应用案例
-
总结与展望
1. L298N电机驱动板详解
1.1 L298N基本特性与参数
L298N是ST公司生产的一款双H桥电机驱动芯片,主要特性:
- 工作电压:+5V~+35V
- 逻辑电压:+5V~+7V
- 最大输出电流:2A(单桥)
- 峰值电流:3A
- 内置续流二极管
- 低饱和电压
- 过热保护
1.2 引脚功能说明

关键引脚:
- VCC:电机电源(5-35V)
- GND:电源地
- +5V:逻辑电源输出/输入
- ENA/ENB:PWM使能端
- IN1-IN4:逻辑控制输入端
- OUT1-OUT4:电机输出端
1.3 典型应用电路
+12V ────┐
│
├─ L298N VCC
│
GND ────┘
+5V ────┬─ L298N +5V
│
├─ STM32 VDD
│
GND ────┘
STM32 PB5 ─── IN1
STM32 PB6 ─── IN2
STM32 PB7 ─── IN3
STM32 PB8 ─── IN4
STM32 TIM3_CH1 ── ENA
STM32 TIM3_CH2 ── ENB
2. 硬件连接方案
2.1 STM32与L298N的连接方法
实际连接示例:
-
电机电源:
- 12V锂电池正极接L298N VCC
- 负极接GND
-
控制信号:
- PB5 → IN1(电机A方向)
- PB6 → IN2(电机A方向)
- PB7 → IN3(电机B方向)
- PB8 → IN4(电机B方向)
- TIM3_CH1 → ENA(电机A PWM)
- TIM3_CH2 → ENB(电机B PWM)
-
使能跳线:
- 移除ENA/ENB跳线帽以启用PWM控制
2.2 电源系统设计
推荐方案:
锂电池组
│
├─ 12V ─── L298N VCC
│
├─ 5V稳压 ─── STM32 VDD
│
└─ 共地连接
注意事项:
- 电机电源与逻辑电源共地
- 大容量滤波电容(1000μF以上)
- 电压检测电路(可选)
2.3 保护电路实现
必需的保护措施:
- 续流二极管:
- L298N内置,无需外接
- 电流检测:
- 0.1Ω采样电阻+运放
- 过温保护:
- 散热片安装
- 电源反接保护:
- 串联二极管
3. 软件驱动开发
3.1 GPIO初始化配置
关键代码:
void MOTOR_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置PB5-PB8为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
3.2 PWM信号生成
TIM3配置:
void TIM3_PWM_Init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 时基配置
TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// PWM模式配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// 通道1配置(PA6)
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
// 通道2配置(PA7)
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
3.3 电机控制逻辑
控制真值表:
| ENA | IN1 | IN2 | 电机A状态 |
|---|---|---|---|
| 1 | 1 | 0 | 正转 |
| 1 | 0 | 1 | 反转 |
| 1 | 1 | 1 | 刹车停止 |
| 1 | 0 | 0 | 自由停止 |
| 0 | X | X | 停止 |
4. 核心代码实现
4.1 电机驱动初始化
完整初始化流程:
void Motor_Init(void)
{
// 1. GPIO初始化
MOTOR_GPIO_Init();
// 2. 定时器PWM初始化
// 72MHz/(7199+1)/(0+1)=10kHz PWM频率
TIM3_PWM_Init(7199, 0);
// 3. 初始状态设置
GPIO_SetBits(GPIOB, GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);
TIM_SetCompare1(TIM3, 0);
TIM_SetCompare2(TIM3, 0);
}
4.2 速度控制函数
改进版速度控制:
void Set_Motor_Speed(int motor, int speed)
{
speed = constrain(speed, -7200, 7200); // 限幅
if(motor == MOTOR_A) {
if(speed > 0) { // 正转
GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET);
TIM_SetCompare1(TIM3, speed);
}
else if(speed < 0) { // 反转
GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET);
TIM_SetCompare1(TIM3, -speed);
}
else { // 停止
GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET);
TIM_SetCompare1(TIM3, 0);
}
}
// 电机B控制类似...
}
4.3 方向控制实现
运动控制函数示例:
typedef enum {
STOP,
FORWARD,
BACKWARD,
TURN_LEFT,
TURN_RIGHT
} MotionState;
void Car_Motion_Control(MotionState state, int speed)
{
switch(state) {
case FORWARD:
Set_Motor_Speed(MOTOR_A, speed);
Set_Motor_Speed(MOTOR_B, speed);
break;
case BACKWARD:
Set_Motor_Speed(MOTOR_A, -speed);
Set_Motor_Speed(MOTOR_B, -speed);
break;
case TURN_LEFT:
Set_Motor_Speed(MOTOR_A, -speed/2);
Set_Motor_Speed(MOTOR_B, speed/2);
break;
// 其他状态...
}
}
5. 调试与优化技巧
常见问题解决方案:
-
电机不转:
- 检查使能信号
- 测量PWM输出
- 确认电源电压
-
电机转动方向相反:
- 交换电机接线
- 修改IN1/IN2控制逻辑
-
PWM控制不灵敏:
- 调整PWM频率(建议8-12kHz)
- 检查地线连接
性能优化建议:
- 增加加速度控制
- 实现闭环速度反馈
- 添加电流限制保护
- 优化PWM分辨率
6. 实际应用案例
智能小车运动控制示例:
void Car_Control_Demo(void)
{
// 前进2秒
Car_Motion_Control(FORWARD, 5000);
Delay_ms(2000);
// 右转1秒
Car_Motion_Control(TURN_RIGHT, 3000);
Delay_ms(1000);
// 后退1秒
Car_Motion_Control(BACKWARD, 4000);
Delay_ms(1000);
// 停止
Car_Motion_Control(STOP, 0);
}
7. 总结与展望
本文详细介绍了基于STM32和L298N的电机驱动系统设计,重点包括:
- L298N驱动原理与使用要点
- 硬件连接方案与保护措施
- PWM调速实现方法
- 完整的软件驱动实现
进一步改进方向:
- 增加编码器反馈实现闭环控制
- 开发PID调速算法
- 添加蓝牙/WiFi远程控制
- 实现运动轨迹规划
本设计方案已在实际项目中验证可靠性,读者可根据具体需求进行调整和扩展。希望本文能为电机控制领域的开发者提供有价值的参考。
更多推荐



所有评论(0)