【PWM】直流电机
下载例程代码: 下载代码
请一定按照 例程使用方法 🔗 导入例程,否则下载的可能不是例程而是其他工程。
PWM 简介
PWM 波形
PWM 波形是一种方波信号,是高/低电平不断切换的结果,其波形如图所示,这是 3 种占空比不同的波形:

PWM 的几个关键参数为:
-
频率(Frequency):即高低电平切换的速度,切换的速度越快则频率越高,1000Hz 的 PWM 波意味着 1 秒钟有 1000 个脉冲
-
占空比(Duty Cycle):即每个周期内,高电平所占的宽度
-
例如图中
50% duty cycle,即高/低电平的时间各占 50%; -
图中的
75% duty cycle,高电平占 75%,低电平占 25%; -
图中的
25% duty cycle,高电平占 25%,低电平占 75%;
-
DRV8833 电机驱动模块简介
-
STM32 的信号电平并不足以直接驱动电机,因此需要一个专门的“驱动模块”来满足电机的功率需求,DRV8833 就是这种“驱动模块”。
-
DRV8833 电机驱动模块接受 PWM 控制信号,根据 PWM 占空比的变化输出不同的驱动功率,从而实现对电机的控制。
-
该模块可同时驱动 2 个有刷直流电机或 1 个 4 线步进电机。学习套件附带了一个有刷直流电机,例程将展示如何控制电机的速度和方向。
如何使用例程
连接硬件,下载程序,即可看到效果
硬件连接
-
需要使用:4P 杜邦线、电机驱动模块、马达、四叶螺旋桨
-
将马达的 2P 插头插入驱动模块的 OUT1、OUT2 引脚,正反顺序均可

- 使用 4P 杜邦线将模块与学习板连接。连接时请核对好线序:
| 驱动模块 | 学习板 |
|---|---|
| IN1 | A0 |
| IN2 | A1 |
| VCC | 5V |
| GND | G |

- 将四叶螺旋桨插入马达输出轴
程序效果
-
烧录例程后,按下 KEY1、KEY2,马达将以不同的速度运转,可以感受到风量和声音的明显变化
-
如果发现风扇向反方向吹风,可以参考下面的“代码讲解”,通过程序实现反转

例程讲解
下面介绍了如何自己实现该例程的功能
1、工程配置
- 开启外部晶振:在 Pinout&Configuration -> System Core -> RCC 页面,将 High Speed Clock (HSE) 配置为 Crystal/Ceramic Resonator

- 配置时钟频率:在 Clock Configuration 页面,将 PLL Source 选择为 HSE,将 System Clock Mux 选择为 PLLCLK,然后在 HCLK (MHz) 输入 72 并回车,将 HCLK 频率配置为 72 MHz

-
分配引脚:在 Pinout&Configuration 页面,配置如下引脚
-
将 PA0、PA1 分别配置为 TIM2_CH1、TIM2_CH2
-
将 PB12、PB13 设置为 GPIO_Input,并分别设置 User Label 为 KEY1、KEY2
-
-
配置 GPIO:在 Pinout&Configuration -> GPIO,将 PB13 的 GPIO Pull-up/Pull-down 配置为 Pull-up
-
配置 TIM2:在 Pinout&Configuration -> Timers -> TIM2
-
Configuration -> Mode -> Clock Source 选择 Internal Clock,开启 TIM2 的内部时钟源
-
Configuration -> Mode,将 Channel1、Channel2 分别配置为 PWM Generation CH1、2
-
Configuration -> Parameter Settings -> Counter Settings,将 Prescaler 配置为 72-1,将 Counter Period 配置为 100-1,此时 PWM 频率为 10 kHz
-
2、代码
-
逻辑功能:在 while 循环中检测按键并输出相应的占空比:
- 按下 KEY1,启动 PWM 输出,占空比配置为 99%,风扇高速运转
- 按下 KEY2,启动 PWM 输出,占空比配置为 85%,风扇中速运转
- 没有按键按下,关闭 PWM 输出,风扇停止
-
转速控制:
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 99)设置 PWM 的占空比越高,转速越快
注意占空比过低时,电机可能无法启动。建议先从 99 占空比开始测试。
提示由于我们配置的 Counter Period 为 100-1,因此占空比最高可以设置为 99,而非 100
-
正/反方向控制:
- 配置了 CH1、CH2 两路 PWM 输出,但每次只需要启动 1 路 PWM 输出,这代表了不同的旋转方向。
- 例如,
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1)启动 TIM2_CH1,电机正转;如果启动 CH2,则电机反转 - 当需要转换方向,或者需要停止时,可以调用
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1)停止 PWM 输出
while (1)
{
// KEY1按下:占空比99% 高速正转
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET)
{
// 启动PWM通道1输出(只能同时启动1个通道,两个通道对应正/反转)
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
// 配置通道1的占空比,影响电机转速(占空比过低可能导致电机无法启动)
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 99);
}
// KEY2按下:占空比85% 中速正转
else if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET)
{
// 启动PWM通道1输出(只能同时启动1个通道,两个通道对应正/反转)
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
// 配置通道1的占空比,影响电机转速(占空比过低可能导致电机无法启动)
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 85);
}
else
{
// 停止PWM通道1输出
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);
}
HAL_Delay(100);
}