跳到主要内容

【PWM】直流电机

下载例程代码: 下载代码 如何使用例程【点击查看教程】

PWM 简介

PWM 波形

PWM波形是一种方波信号,是高/低电平不断切换的结果,其波形如图所示,这是3种占空比不同的波形:

PWM波形

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杜邦线将模块与学习板连接。连接时请核对好线序
驱动模块学习板
IN1A0
IN2A1
VCC5V
GNDG
模块接线
  • 将四叶螺旋桨插入马达输出轴

程序效果

  • 烧录例程后,按下 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);
    }