1 系统功能介绍

本设计的题目是 基于 STM32 单片机直流电机控制加减速正反转系统设计。直流电机作为工业控制、机器人、汽车电子及智能设备中应用广泛的执行部件,其转速、转向与启停的精确控制是现代电子控制系统的重要组成部分。

本系统由 STM32F103C8T6 单片机核心板 + L298N 电机驱动模块 + 按键控制电路 + 电源电路 组成。通过按键实现对电机的正转、反转、加速、减速以及停止控制。为了满足不同速度需求,系统设计了 8 个挡位,用户可通过按键在挡位间切换,实现电机的平滑加速与减速,同时具备可靠的正反转控制逻辑。

系统的主要功能总结如下:

  1. 正转控制:用户按下正转按键,电机朝顺时针方向转动。
  2. 反转控制:用户按下反转按键,电机朝逆时针方向转动。
  3. 加速功能:通过加速按键逐步提高电机转速,共设置 8 个速度挡位。
  4. 减速功能:通过减速按键逐步降低转速,最低为停止状态。
  5. 停止功能:通过停止按键,立即停止电机运行。

该系统在嵌入式控制课程设计、智能小车、实验教学以及自动化设备控制中都有较高的应用价值。


2 系统电路设计

电路设计采用模块化思路,主要由 STM32 最小系统、L298N 电机驱动电路、按键输入电路以及电源模块组成。

2.1 STM32 最小系统电路

STM32F103C8T6 单片机作为系统的核心,负责按键扫描、速度逻辑运算、PWM 占空比输出及驱动信号控制。

  • 主频:最高可达 72MHz,保证运算和控制的实时性;
  • 时钟电路:8MHz 外部晶振,内部 PLL 倍频;
  • 复位电路:电容、电阻复位电路,保证上电初始化正确;
  • PWM 输出:STM32 的定时器模块可输出高精度 PWM 信号,用于电机转速控制。

2.2 L298N 电机驱动电路

L298N 是一种双 H 桥电机驱动芯片,能够驱动直流电机的正转和反转。

  • 输入控制:通过 IN1、IN2 控制电机的方向(正转/反转);
  • PWM 输入:通过 ENA 引脚输入 PWM 信号调节电机转速;
  • 输出电流能力:可达 2A,适合小功率直流电机。
  • 保护功能:自带二极管保护电路,防止电机反电动势损坏驱动芯片。

在本设计中,STM32 的 PWM 信号接至 L298N 的 ENA,引脚 IN1、IN2 分别接 GPIO 口,用于正反转逻辑控制。


2.3 按键电路

系统设有五个功能按键:

  1. 正转键:控制电机顺时针旋转;
  2. 反转键:控制电机逆时针旋转;
  3. 加速键:每次按下速度提高一个挡位;
  4. 减速键:每次按下速度降低一个挡位;
  5. 停止键:立即停止电机转动。

按键采用下拉电阻设计,避免悬空误触发,并在软件中进行消抖处理。


2.4 电源电路

电源模块为整个系统提供稳定的电压:

  • 单片机供电:3.3V 稳压电源,采用 AMS1117 稳压芯片;
  • 电机驱动供电:5V~12V,根据电机额定电压选择;
  • 滤波电容:在电源输入端添加电解电容与陶瓷电容,保证电源稳定,减少电机干扰。

3 程序设计

系统软件分为以下几个部分:主程序、按键检测程序、PWM 控制程序、电机方向控制程序以及速度逻辑管理程序。


3.1 主程序框架

#include "stm32f10x.h"
#include "motor.h"
#include "key.h"

int main(void)
{
    Motor_Init();
    Key_Init();

    Motor_Stop(); // 上电默认停止

    while(1)
    {
        Key_Scan();   // 检测按键
        Motor_Update(); // 根据状态更新电机
    }
}

3.2 电机初始化与控制程序

int speedLevel = 0;   // 挡位,范围0~8
int direction = 0;    // 0:停止, 1:正转, -1:反转

void Motor_Init(void)
{
    // GPIO 配置 IN1, IN2
    // PWM 配置 ENA
}

void Motor_SetSpeed(int level)
{
    if(level < 0) level = 0;
    if(level > 8) level = 8;

    int duty = level * 12; // 每档增加12%占空比
    TIM_SetCompare1(TIM2, duty);
    speedLevel = level;
}

void Motor_SetDirection(int dir)
{
    if(dir == 1)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_0);
        GPIO_ResetBits(GPIOA, GPIO_Pin_1);
    }
    else if(dir == -1)
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_0);
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
    }
    else
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1);
    }
    direction = dir;
}

void Motor_Stop(void)
{
    Motor_SetSpeed(0);
    direction = 0;
}

3.3 按键检测程序

void Key_Scan(void)
{
    if(Key_Pressed(KEY_FORWARD))  // 正转
    {
        Motor_SetDirection(1);
    }
    else if(Key_Pressed(KEY_BACKWARD)) // 反转
    {
        Motor_SetDirection(-1);
    }
    else if(Key_Pressed(KEY_ACCEL))    // 加速
    {
        Motor_SetSpeed(speedLevel + 1);
    }
    else if(Key_Pressed(KEY_DECEL))    // 减速
    {
        Motor_SetSpeed(speedLevel - 1);
    }
    else if(Key_Pressed(KEY_STOP))     // 停止
    {
        Motor_Stop();
    }
}

3.4 PWM 输出程序

void PWM_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_TimeBaseStructure.TIM_Period = 100 - 1; 
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    TIM_Cmd(TIM2, ENABLE);
}

3.5 电机状态更新程序

void Motor_Update(void)
{
    if(direction == 0)
    {
        Motor_Stop();
    }
    else
    {
        Motor_SetSpeed(speedLevel);
        Motor_SetDirection(direction);
    }
}

4 总结

本文介绍了一个 基于 STM32 单片机的直流电机控制加减速正反转系统。系统通过 STM32F103C8T6 单片机作为核心,结合 L298N 电机驱动模块与按键输入,实现了电机 正转、反转、加速、减速和停止 控制,且设置了 8 个速度挡位,满足多种应用需求。

电路设计方面:采用模块化结构,STM32 提供逻辑与 PWM 控制,L298N 负责功率驱动,按键作为人机交互,电源模块保证系统稳定。

软件设计方面:程序模块划分清晰,包括主程序、按键扫描、PWM 输出、电机控制与速度逻辑管理。通过 PWM 占空比的逐档增加与减少,实现了电机的平滑加减速。

本系统具有以下特点:

  1. 功能全面:涵盖直流电机的全部基本控制逻辑;
  2. 扩展性强:可扩展为红外遥控、蓝牙控制或自动控制;
  3. 教学价值高:适合作为嵌入式系统课程设计与电机控制实验项目;
  4. 实用性好:能应用于小车驱动、风扇调速、机械臂关节等场景。

通过本设计,充分展示了 STM32 在电机控制中的优势与灵活性,同时为更复杂的电机调速与运动控制系统的开发奠定了基础。

Logo

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

更多推荐