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
烧录即可