概述
在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。本文将详细介绍如何利用STM32CUBEMX配置定时器以输出指定数量的PWM脉冲。 定时器是STM32微控制器的一个重要功能模块,可用于生成各种定时和计数操作。通过合理配置定时器的参数和模式,我们可以实现精确的脉冲输出。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。 
样品申请
[https://www.wjx.top/vm/PpC1kRR.aspx]
视频教学
[https://www.bilibili.com/video/BV1pw8gzoEU9/])
代码下载
[https://download.csdn.net/download/qq_24312945/91621945]
硬件准备
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。 主控为STM32H503CBT6,驱动器为STSPIN220

参考程序
[https://github.com/CoreMaker-lab/STSPIN220]
[https://gitee.com/CoreMaker/STSPIN220]
定时器中断配置
当PWM脉冲完成时,我们需要触发一个回调函数。HAL_TIM_PWM_PulseFinishedCallback函数是用于在非阻塞模式下处理PWM脉冲完成的回调函数。

为了触发HAL_TIM_PWM_PulseFinishedCallback回调函数,需要启用Capture Compare Interrupt中断。

产生固定数量的PWM
首先,可以定义一个全局变量,该变量用于控制输出脉冲的个数。通过操作该变量,我们可以在程序中灵活地控制所需的脉冲数量。
/* USER CODE BEGIN 0 */
// 初始化 MODE3 引脚(即 STCK),用作步进脉冲输出
void MX_GPIO_Init_mode3(void);
uint16_t STSPIN220_PwmNum; // 控制电机旋转步数(PWM脉冲数量)
uint8_t STSPIN220_flag = 0; // PWM计数完成标志
uint8_t STSPIN220_Dir_flag = 0; // 电机方向标志:0反向,1正向
/* USER CODE END 0 */
首先,使用MX_TIM1_Init()初始化定时器1。 接下来,当需要输出脉冲时,将所需的脉冲数量赋值给变量STSPIN220_PwmNum。 最后,使用HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1)启动定时器1的PWM中断输出。
STSPIN220_PwmNum = 20;
MX_TIM1_Init(); // 初始化 TIM1 定时器用于输出 PWM 步进脉冲
HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1); // 启动 TIM1 通道1,PWM带中断

HAL_TIM_PWM_PulseFinishedCallback回调函数的实现部分。 在函数内部,如果STSPIN220_PwmNum的值为0,即已经输出了所需的脉冲个数,那么通过调HAL_TIM_PWM_Stop_IT(&htim1, TIM_CHANNEL_1)停止定时器1的PWM中断输出,以达到停止脉冲输出的目的。 其次对全局变量STSPIN220_PwmNum进行递减操作,表示完成了一个脉冲的输出就进行减1。接着,通过条件判断if (STSPIN220_PwmNum == 0),检查是否已经输出了指定数量的脉冲。 这段代码的作用是在每次PWM波形周期完成时,更新全局变量STSPIN220_PwmNum的值,并在达到指定的脉冲数量后停止PWM中断输出。通过这种方式,可以实现精确控制输出脉冲个数的功能。
/* USER CODE BEGIN 4 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(STSPIN220_PwmNum==0)
{
HAL_TIM_PWM_Stop_IT(&htim1,TIM_CHANNEL_1);
STSPIN220_flag=1;//电机完成步数标志位
}
STSPIN220_PwmNum--;
}
/* USER CODE END 4 */
产生波形如下所示,可以看到有20个脉冲。

电机设置
这里使用的电机为步进角为18°,1:50的减速比,在这种情况下,如果步进电机的步进角为18°,减速比为1:50,那么旋转一周所需的脉冲数量可以计算为: 旋转一周所需脉冲 = (360 / 步进角) * 减速比 * 细分数 其中,步进角以度为单位,减速比是相对于电机输出轴和实际应用中的旋转轴之间的比率,细分数表示步进电机驱动器将一个步进角分割成多少个微步。 根据这个公式来计算出所需的脉冲数量,从而实现旋转一周的控制。

STSPIN220初始化
STSPIN220修改后初始化如下所示。
/* USER CODE BEGIN 2 */
MX_GPIO_Init_mode3(); // 初始化 STCK 引脚为推挽输出
HAL_Delay(100);
STSPIN220_SetStepMode(0); // 设置为全步进模式(MODE1~4 = 0)
STSPIN220_enable(0); // 禁用驱动器(EN 引脚拉低)
STSPIN220_Stby(1); // 进入低功耗待机模式(STBY 引脚拉低)
HAL_Delay(100);
STSPIN220_SetStepMode(2); // 设置为 1/2 步进模式
STSPIN220_Stby(0); // 退出低功耗待机,步进模式正式生效
HAL_Delay(100); // 等待电平稳定
STSPIN220_setDirection(0); // 设置电机方向为反向(MODE4 拉低)
HAL_Delay(100); // 等待方向稳定
STSPIN220_enable(1); // 启用驱动器(EN 引脚拉高)
HAL_Delay(100);
// 设置脉冲数:一圈360°,步进角为18°,1:50的减速比,细分数2
// 因此需要的脉冲数为 (360/18) * 50 * 2 = 2000
STSPIN220_PwmNum = 2000 ;
MX_TIM1_Init(); // 初始化 TIM1 定时器用于输出 PWM 步进脉冲
HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1); // 启动 TIM1 通道1,PWM带中断
/* USER CODE END 2 */
主程序
实现电机循环正转1圈反转1圈代码如下所示。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(STSPIN220_flag)
{
HAL_Delay(1000);
// STSPIN220_Stby(1);//低功耗模式 1开启低功耗0关闭低功耗
STSPIN220_flag=0;
if(STSPIN220_Dir_flag==0)
{
STSPIN220_Dir_flag=1;
STSPIN220_setDirection(1);//0反1正
HAL_Delay(100);
STSPIN220_PwmNum = 2000;//步进角为18°,1:50的减速比,细分2则需要走(360/18)*50*2为一圈
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_1);
}
else
{
STSPIN220_Dir_flag=0;
STSPIN220_setDirection(0);//0反1正
HAL_Delay(100);
STSPIN220_PwmNum = 2000;//步进角为18°,1:50的减速比,细分2则需要走(360/18)*50*2为一圈
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_1);
}
}
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
审核编辑 黄宇
-
驱动器
+关注
关注
54文章
9130浏览量
156929 -
电机
+关注
关注
145文章
9752浏览量
155030
发布评论请先 登录
基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(1)----套件概述
基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(2)----驱动STSPIN220
基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(3)----定时器中断产生指定数量脉冲
定时器作为PWM输出时,是否支持输出指定数量的PWM功能?
有没有办法让STSPIN220与小型电机一起工作?
用STM32定时器中断产生PWM控制步进电机
低压步进器电机驱动器STSPIN220开发(1)----驱动STSPIN220
低压步进器电机驱动器STSPIN220开发(2)----定时器中断产生指定数量脉冲
评论