打印
[STM32G4]

基于STM32G431的PWM电机控制系统设计

[复制链接]
71|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
帛灿灿|  楼主 | 2025-1-14 07:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电机控制是嵌入式系统的重要应用之一,STMicroelectronics推出的STM32G431系列微控制器以其强大的性能和灵活的外设支持广泛用于电机驱动场景。本文将以STM32G431为核心,讲解如何设计一个基于PWM的直流电机控制系统,包括硬件设计、软件实现及调试建议。
系统功能概述本系统使用STM32G431通过PWM(脉宽调制)信号控制直流电机的转速。用户可通过按键输入调整转速,同时通过UART反馈当前占空比信息。
系统功能模块包括:
  • PWM信号生成:通过STM32的高级定时器生成PWM信号控制电机驱动模块。
  • 按键输入:实现转速增减功能。
  • 串口通信:实时反馈转速占空比。
硬件连接
  • PWM输出:使用STM32G431的TIM1_CH1,连接到电机驱动模块的输入端。
  • 按键输入:两个按键分别连接到PA0和PA1,用于增加和减少占空比。
  • UART通信:使用PA9和PA10作为TX和RX引脚。
软件实现以下是基于STM32CubeMX生成的HAL库的代码实现:
#include "main.h"
#include "stdio.h"

TIM_HandleTypeDef htim1;
UART_HandleTypeDef huart1;

uint32_t duty_cycle = 50; // 初始占空比为50%

// 更新PWM占空比
void Update_PWM_DutyCycle(uint32_t duty) {
    if (duty > 100) duty = 100;
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * 10); // 假设定时器周期为1000
}

// UART发送函数
void UART_SendString(char *str) {
    HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
}

// 按键处理
void Handle_Button_Input(void) {
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
        if (duty_cycle < 100) duty_cycle += 10;
        Update_PWM_DutyCycle(duty_cycle);
        HAL_Delay(200); // 消抖
    }
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET) {
        if (duty_cycle > 0) duty_cycle -= 10;
        Update_PWM_DutyCycle(duty_cycle);
        HAL_Delay(200); // 消抖
    }
}

// 主程序
int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM1_Init();
    MX_USART1_UART_Init();

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 开启PWM输出
    Update_PWM_DutyCycle(duty_cycle);

    char buffer[50];

    while (1) {
        Handle_Button_Input();

        // 通过UART反馈当前占空比
        sprintf(buffer, "Current Duty Cycle: %lu%%\r\n", duty_cycle);
        UART_SendString(buffer);

        HAL_Delay(100);
    }
}

// 时钟配置函数
void SystemClock_Config(void) {
    // 时钟配置代码略
}

// GPIO初始化函数
void MX_GPIO_Init(void) {
    // GPIO引脚配置代码略
}

// 定时器初始化函数
void MX_TIM1_Init(void) {
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};

    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 79; // 假设系统时钟为80MHz
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 1000 - 1; // PWM频率为80kHz
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    HAL_TIM_Base_Init(&htim1);

    HAL_TIM_PWM_Init(&htim1);

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 500; // 初始占空比为50%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
}

// UART初始化函数
void MX_USART1_UART_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart1) != HAL_OK) {
        Error_Handler();
    }
}

// 错误处理函数
void Error_Handler(void) {
    while (1) {
    }
}
调试建议
  • PWM频率选择:根据电机特性调整TIM1的频率,确保信号平滑。
  • 按键消抖:通过延时或中断方式处理按键抖动问题。
  • UART调试:使用串口工具观察占空比反馈是否正常。
总结本文通过STM32G431的TIM1定时器和GPIO外设实现了PWM电机控制系统。STM32G431性能强大,适合需要高精度控制的场景,如机器人和工业自动化设备。





使用特权

评论回复
沙发
公羊子丹| | 2025-1-14 07:40 | 只看该作者
用STM32G431做电机控制太合适了,这个例子很清晰!

使用特权

评论回复
板凳
周半梅| | 2025-1-14 07:40 | 只看该作者
看到PWM和按键结合的实现,学到了不少。

使用特权

评论回复
地板
童雨竹| | 2025-1-14 07:40 | 只看该作者
按键消抖的思路简单又有效,实用性强!

使用特权

评论回复
5
万图| | 2025-1-14 07:40 | 只看该作者
STM32G431的定时器功能真强大,细节讲得很清楚。

使用特权

评论回复
6
Wordsworth| | 2025-1-14 07:41 | 只看该作者
刚好在研究电机控制,这个系统设计思路很受启发。

使用特权

评论回复
7
Bblythe| | 2025-1-14 07:41 | 只看该作者
UART反馈的功能不错,可以实时观察调试状态。

使用特权

评论回复
8
Pulitzer| | 2025-1-14 07:41 | 只看该作者
想试试这个例子,不过想问下楼主驱动模块用的是哪种?

使用特权

评论回复
9
Uriah| | 2025-1-14 07:41 | 只看该作者
duty_cycle的处理逻辑很直观,新手也能轻松理解。

使用特权

评论回复
10
Clyde011| | 2025-1-14 07:42 | 只看该作者
代码结构清晰,学到了如何规范写STM32的代码。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

3835

帖子

0

粉丝