基于STM32和L298N的电机驱动系统设计与实现

目录

  1. L298N电机驱动板详解

    • 1.1 L298N基本特性与参数
    • 1.2 引脚功能说明
    • 1.3 典型应用电路
  2. 硬件连接方案

    • 2.1 STM32与L298N的连接方法
    • 2.2 电源系统设计
    • 2.3 保护电路实现
  3. 软件驱动开发

    • 3.1 GPIO初始化配置
    • 3.2 PWM信号生成
    • 3.3 电机控制逻辑
  4. 核心代码实现

    • 4.1 电机驱动初始化
    • 4.2 速度控制函数
    • 4.3 方向控制实现
  5. 调试与优化技巧

  6. 实际应用案例

  7. 总结与展望

1. L298N电机驱动板详解

1.1 L298N基本特性与参数

L298N是ST公司生产的一款双H桥电机驱动芯片,主要特性:

  • 工作电压:+5V~+35V
  • 逻辑电压:+5V~+7V
  • 最大输出电流:2A(单桥)
  • 峰值电流:3A
  • 内置续流二极管
  • 低饱和电压
  • 过热保护

1.2 引脚功能说明

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/15a7fb82cf6e4975a5d4702c41787f58.png

关键引脚:

  • 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的连接方法

实际连接示例:

  1. 电机电源:

    • 12V锂电池正极接L298N VCC
    • 负极接GND
  2. 控制信号:

    • PB5 → IN1(电机A方向)
    • PB6 → IN2(电机A方向)
    • PB7 → IN3(电机B方向)
    • PB8 → IN4(电机B方向)
    • TIM3_CH1 → ENA(电机A PWM)
    • TIM3_CH2 → ENB(电机B PWM)
  3. 使能跳线:

    • 移除ENA/ENB跳线帽以启用PWM控制

2.2 电源系统设计

推荐方案:

锂电池组
  │
  ├─ 12V ─── L298N VCC
  │
  ├─ 5V稳压 ─── STM32 VDD
  │
  └─ 共地连接

注意事项:

  • 电机电源与逻辑电源共地
  • 大容量滤波电容(1000μF以上)
  • 电压检测电路(可选)

2.3 保护电路实现

必需的保护措施:

  1. 续流二极管:
    • L298N内置,无需外接
  2. 电流检测:
    • 0.1Ω采样电阻+运放
  3. 过温保护:
    • 散热片安装
  4. 电源反接保护:
    • 串联二极管

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. 调试与优化技巧

常见问题解决方案:

  1. 电机不转

    • 检查使能信号
    • 测量PWM输出
    • 确认电源电压
  2. 电机转动方向相反

    • 交换电机接线
    • 修改IN1/IN2控制逻辑
  3. 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调速实现方法
  • 完整的软件驱动实现

进一步改进方向:

  1. 增加编码器反馈实现闭环控制
  2. 开发PID调速算法
  3. 添加蓝牙/WiFi远程控制
  4. 实现运动轨迹规划

本设计方案已在实际项目中验证可靠性,读者可根据具体需求进行调整和扩展。希望本文能为电机控制领域的开发者提供有价值的参考。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐