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

[复制链接]
2222|14
 楼主| 帛灿灿 发表于 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库的代码实现:
  1. #include "main.h"
  2. #include "stdio.h"

  3. TIM_HandleTypeDef htim1;
  4. UART_HandleTypeDef huart1;

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

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

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

  15. // 按键处理
  16. void Handle_Button_Input(void) {
  17.     if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
  18.         if (duty_cycle < 100) duty_cycle += 10;
  19.         Update_PWM_DutyCycle(duty_cycle);
  20.         HAL_Delay(200); // 消抖
  21.     }
  22.     if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET) {
  23.         if (duty_cycle > 0) duty_cycle -= 10;
  24.         Update_PWM_DutyCycle(duty_cycle);
  25.         HAL_Delay(200); // 消抖
  26.     }
  27. }

  28. // 主程序
  29. int main(void) {
  30.     HAL_Init();
  31.     SystemClock_Config();
  32.     MX_GPIO_Init();
  33.     MX_TIM1_Init();
  34.     MX_USART1_UART_Init();

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

  37.     char buffer[50];

  38.     while (1) {
  39.         Handle_Button_Input();

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

  43.         HAL_Delay(100);
  44.     }
  45. }

  46. // 时钟配置函数
  47. void SystemClock_Config(void) {
  48.     // 时钟配置代码略
  49. }

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

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

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

  66.     HAL_TIM_PWM_Init(&htim1);

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

  73. // UART初始化函数
  74. void MX_USART1_UART_Init(void) {
  75.     huart1.Instance = USART1;
  76.     huart1.Init.BaudRate = 115200;
  77.     huart1.Init.WordLength = UART_WORDLENGTH_8B;
  78.     huart1.Init.StopBits = UART_STOPBITS_1;
  79.     huart1.Init.Parity = UART_PARITY_NONE;
  80.     huart1.Init.Mode = UART_MODE_TX_RX;
  81.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  82.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  83.     if (HAL_UART_Init(&huart1) != HAL_OK) {
  84.         Error_Handler();
  85.     }
  86. }

  87. // 错误处理函数
  88. void Error_Handler(void) {
  89.     while (1) {
  90.     }
  91. }
调试建议
  • 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 | 显示全部楼层
按键消抖的思路简单又有效,实用性强!
万图 发表于 2025-1-14 07:40 | 显示全部楼层
STM32G431的定时器功能真强大,细节讲得很清楚。
Wordsworth 发表于 2025-1-14 07:41 | 显示全部楼层
刚好在研究电机控制,这个系统设计思路很受启发。
Bblythe 发表于 2025-1-14 07:41 | 显示全部楼层
UART反馈的功能不错,可以实时观察调试状态。
Pulitzer 发表于 2025-1-14 07:41 | 显示全部楼层
想试试这个例子,不过想问下楼主驱动模块用的是哪种?
Uriah 发表于 2025-1-14 07:41 | 显示全部楼层
duty_cycle的处理逻辑很直观,新手也能轻松理解。
Clyde011 发表于 2025-1-14 07:42 | 显示全部楼层
代码结构清晰,学到了如何规范写STM32的代码。
哈根达斯uz 发表于 2025-1-15 21:57 来自手机 | 显示全部楼层
PWM的直流电机控制系统,包括硬件设计、软件实现及调试建议
Amazingxixixi 发表于 2025-1-21 17:27 | 显示全部楼层
学习一下啊,还有好多需要学习的。
SophiaOP 发表于 2025-1-22 21:21 来自手机 | 显示全部楼层
pwm确实是常用啊
花间一壶酒sd 发表于 2025-1-31 23:39 | 显示全部楼层
系统通过 UART 输出占空比信息,可以实时监控电机的状态
您需要登录后才可以回帖 登录 | 注册

本版积分规则

166

主题

6196

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部