基于 STM32F103C8T6 · HAL库开发 · PWM调速控制
了解HB-M09电机驱动模块的核心原理与功能特性
1.1 工作原理
HB-M09电机驱动模块采用H桥驱动电路结构,通过PWM(脉冲宽度调制)信号控制直流电机的转速和转向。H桥电路由四个功率开关管组成,通过控制不同开关管的导通与关断,可以改变电机两端的电压方向,从而实现正转、反转和制动控制。
PWM调速的基本原理是:通过调节脉冲信号的占空比(高电平时间与周期的比值),来改变电机两端的平均电压,从而实现转速的连续调节。占空比越高,平均电压越大,电机转速越快。
模块采用两路PWM信号控制方式:一路PWM信号控制电机的正转速度,另一路PWM信号控制电机的反转速度。当两路信号均为高电平时,电机两端电压相等,电机停止转动。
支持0-100%占空比连续调速,转速平滑过渡,适用于各种速度控制场景
支持正转、反转、停止三种状态切换,通过两路PWM信号实现方向控制
内置过流保护电路,有效防止电机堵转或短路时损坏驱动芯片
采用5V标准供电电压,与STM32单片机IO电平兼容,接线简单可靠
| 引脚名称 | 类型 | 功能描述 | STM32连接 |
|---|---|---|---|
| VCC | 电源 | 模块电源输入,5V | 5V |
| GND | 地 | 电源地 | GND |
| PWMA | 输入 | PWM控制信号A(正转控制) | PB0 (TIM3_CH3) |
| PWMB | 输入 | PWM控制信号B(反转控制) | PB1 (TIM3_CH4) |
| OUT1 | 输出 | 电机驱动输出端1 | 电机正极 |
| OUT2 | 输出 | 电机驱动输出端2 | 电机负极 |
多角度展示HB-M09电机驱动模块的外观与尺寸
模块电路原理图与PCB封装设计
深入分析STM32驱动程序的实现细节
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(timHandle->Instance==TIM3) { /* TIM3 GPIO Configuration PB0 ------> TIM3_CH3 PB1 ------> TIM3_CH4 */ __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } }
TIM_HandleTypeDef htim3; void MX_TIM3_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim3.Instance = TIM3; htim3.Init.Prescaler = 71; // 预分频器 72MHz/72 = 1MHz htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 999; // 周期 1MHz/1000 = 1kHz PWM htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(&htim3); sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM模式1 sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 高电平有效 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3); HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4); HAL_TIM_MspPostInit(&htim3); }
while (1) { if(HAL_GetTick() - Time_Now >= 500) // 500ms定时 { period++; // 周期计数器递增 // 反转 30% 速度 if(period == 1) { speed = 30; __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,1000); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,(100-speed)*10); } // 停止 if(period == 3) { __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_3,1000); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,1000); } // ... 更多速度档位 ... // OLED显示方向和速度 OLED_Clear(); if(period < 10) OLED_CenterPrintf(12, "反转"); else OLED_CenterPrintf(12, "正转"); OLED_CenterPrintf(36, "速度:%d%%", speed); OLED_Update(); Time_Now = HAL_GetTick(); } }
| 状态 | PWMA (CH3) 比较值 | PWMB (CH4) 比较值 | 占空比关系 | 电机状态 |
|---|---|---|---|---|
| 正转 (speed%) | (100-speed) × 10 | 1000 | PWMA < PWMB | 正转,速度与speed成正比 |
| 反转 (speed%) | 1000 | (100-speed) × 10 | PWMA > PWMB | 反转,速度与speed成正比 |
| 停止 | 1000 | 1000 | PWMA = PWMB | 电机两端电压相等,停止转动 |
电机驱动控制程序的执行流程
通过交互演示理解电机驱动的工作原理
正转/反转/停止:点击方向按钮切换电机转动状态,观察H桥开关管状态变化(绿色=导通,红色=截止)。
速度调节:拖动滑块调节PWM占空比,观察电机转速、PWM波形和OLED显示的实时变化。
OLED显示逻辑:与源程序保持一致,OLED始终显示方向(正转/反转)和速度百分比,电机停止时仍保留上一次的方向和速度显示。
开始/停止/重置:控制自动演示流程,演示程序将循环展示不同速度和方向的切换效果,与实物程序逻辑完全一致。