STM32指定个数PWM脉冲

STM32指定个数PWM脉冲

使用步进电机驱动器控制步进电机旋转指定角度的时候,可能需要根据需求调整脉冲数量,这里列举两种方式:1)利用定时中断输出脉冲,但是频繁的触发中断会干扰主程序的进程;2)定时器主从模式输出,不占用主程序时钟,但是会占用两个定时器。

1)定时器中断模式

 

按照中断计数方式输出指定数量的脉冲的原理,当达到设定的个数后,就停止PWM输出;示例程序在main.c中定义一个uint16_t类型的全局变量来控制输出的脉冲数:

uint16_t PWM_Num = 10;

在中间空白行编写中断回调处理函数,该函数在stm32f1xx_hal_tim_.c中被定义成弱函数:

/**
  * @brief  PWM Pulse finished callback in non-blocking mode
  * @param  htim TIM handle
  * @retval None
  */
__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
​
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file
   */
}

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
  static uint16_t cnt = 0;
  cnt++;
  if(cnt == PWM_Val)
  {
    cnt = 0;
    HAL_TIM_PWM_Stop_IT(&htim1,TIM_CHANNEL_1);
  }
}

最后在主程序中加上

  HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1);

烧录即可

2)定时器主从模式

主定时器TIM1配置如下

内部时钟,通道2,设置PSC为71,ARR为99,占空比是50%,打开主从模式,触发事件选择OC2REF(因为我这里开启的是定时器通道二)

TIM2配置如下

选择外部触发模式1,触发源选择ITR0

从参考手册中可以找到STM32内部定时器触发连接表

重定义回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == htim2.Instance) 
    {
      HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
    }
}

主函数加入以下代码

    __HAL_TIM_SetAutoreload(&htim2, 20);     //设定定时器2的ARR的值
    HAL_TIM_Base_Start_IT(&htim2);           //开启定时器2
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);//开启定时器1
​

烧录即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值