Stm32 使用定时器实现PWM可调脉宽和脉冲的一种简单易行方法

Stm32 使用定时器实现PWM可调脉宽和脉冲的一种简单易行方法

平台:cubeMX

芯片:stm32f103

1.时钟配置 工作频率48M

Stm32 使用定时器实现PWM可调脉宽和脉冲的一种简单易行方法

 

2. 定时器选择 TIM3

Stm32 使用定时器实现PWM可调脉宽和脉冲的一种简单易行方法

3. TIM3 配置

Stm32 使用定时器实现PWM可调脉宽和脉冲的一种简单易行方法

Stm32 使用定时器实现PWM可调脉宽和脉冲的一种简单易行方法

 

4. 程序封装

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == &htim3)
    {
        /* Configure the OPM Mode */
        htim->Instance->CR1 |= TIM_CR1_OPM;
    }
}

/**
  * @brief
  *
  * @param Hz PWM频率
  * @param duty PWM占空比 0~100
  * @param pul PWM脉冲数
  *
  * @retval
  */
void Drv8825_PWM(int Hz, int duty, int pul)
{
    int arr;

    assert_param(duty < 100);

    arr = 1000000 / Hz;
    htim3.Instance->ARR = arr - 1;
    htim3.Instance->CCR1 = arr * (100 - duty) / 100;
    HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, &htim3.Instance->CCR1, pul);
}

 

 

5.使用方式

//频率1k,10%脉宽,10个脉冲。

Drv8825_PWM(1000, 50, 10);//程序不是阻塞!重复调用记得延时

Stm32 使用定时器实现PWM可调脉宽和脉冲的一种简单易行方法

经过测试10k以下频率都是ok,如果要高点,需要在DMA完成中断调用以下语句:

htim->Instance->CR1 |= TIM_CR1_OPM;

HAL_TIM_PWM_PulseFinishedCallback(...)可以去掉。