【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的占空比越高,转速越快注意:占空比过低时,电机可能无法启动。
由于我们配置的Counter Period为100-1,因此占空比最高设置为99
正/反方向控制:
- 配置了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);
}