0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

低压步进器电机驱动器STSPIN220开发(2)----定时器中断产生指定数量脉冲

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2026-05-25 16:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成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
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32F103定时器PWM驱动步进电机加减速

    之前学习了定时器的一些基本知识,实现了1ms的定时,本次学习定时器的PWM功能,用定时器产生的PWM波作为
    的头像 发表于 02-28 14:25 10.9w次阅读
    STM32F103<b class='flag-5'>定时器</b>PWM<b class='flag-5'>驱动</b><b class='flag-5'>步进</b><b class='flag-5'>电机</b>加减速

    基于STM32CUBEMX驱动低压步进电机驱动器STSPIN220(1)----套件概述

    STM32C011F4Px_STSPIN220 是一款基于 STM32C011F4Px 的低压步进电机驱动套件。其中,
    的头像 发表于 12-01 15:16 1960次阅读
    基于STM32CUBEMX<b class='flag-5'>驱动</b><b class='flag-5'>低压</b><b class='flag-5'>步进</b><b class='flag-5'>器</b><b class='flag-5'>电机</b><b class='flag-5'>驱动器</b><b class='flag-5'>STSPIN220</b>(1)----套件概述

    基于STM32CUBEMX驱动低压步进电机驱动器STSPIN220(2)----驱动STSPIN220

    本文档的目标是提供关于使用STM32CubeMX驱动低压步进电机驱动器STSPIN220的详尽信
    的头像 发表于 12-01 15:25 3589次阅读
    基于STM32CUBEMX<b class='flag-5'>驱动</b><b class='flag-5'>低压</b><b class='flag-5'>步进</b><b class='flag-5'>器</b><b class='flag-5'>电机</b><b class='flag-5'>驱动器</b><b class='flag-5'>STSPIN220</b>(<b class='flag-5'>2</b>)----<b class='flag-5'>驱动</b><b class='flag-5'>STSPIN220</b>

    基于STM32CUBEMX驱动低压步进电机驱动器STSPIN220(3)----定时器中断产生指定数量脉冲

    步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量脉冲。这就需要使用定时器功能来生成PWM
    的头像 发表于 12-01 15:26 3954次阅读
    基于STM32CUBEMX<b class='flag-5'>驱动</b><b class='flag-5'>低压</b><b class='flag-5'>步进</b><b class='flag-5'>器</b><b class='flag-5'>电机</b><b class='flag-5'>驱动器</b><b class='flag-5'>STSPIN220</b>(3)----<b class='flag-5'>定时器</b><b class='flag-5'>中断</b><b class='flag-5'>产生</b><b class='flag-5'>指定数量</b><b class='flag-5'>脉冲</b>

    定时器级联-频率 脉冲可控,驱动步进电机

    定时器级联-频率 脉冲可控,驱动步进电机
    发表于 07-16 11:17

    stm32用定时器通过驱动器控制多个步进电机 精选资料下载

    摘要如果使用驱动器如TB6600、DM542等驱动步进电机,需要通过PWM控制。每个PWM脉冲驱动
    发表于 07-08 10:04

    LL库如何实现STM32使用定时器主从模式输出指定数量脉冲

    LL库如何实现STM32使用定时器主从模式输出指定数量脉冲
    发表于 12-21 07:25

    怎样使用定时器输出指定个数的PWM脉冲

    步进电机控制时,经常会遇到需要输出指定个数的脉冲来实现精确控制。本篇文章将介绍怎样使用定时器输出指定
    发表于 01-06 06:19

    定时器作为PWM输出时,是否支持输出指定数量的PWM功能?

    1.定时器作为PWM输出时,是否支持输出指定数量的PWM功能,例如输出200个PWM脉冲后自动停止输出或者输出占空比为0的脉冲2.手册中介
    发表于 05-26 06:16

    STSPIN220芯片的双极步进电机的输出端是否需要反激二极管呢?

    使用STSPIN220芯片的双极步进电机的输出端是否需要反激二极管?
    发表于 01-04 07:27

    有没有办法让STSPIN220与小型电机一起工作?

    用普通步进驱动器(非 st 部分)进行测试并且很好 - 电流过高,电压过高,但工作正常。我认为具有 1/256 微步的 STSPIN220 可以提高精度并专为低电压电池操作而设计。然而,在 1/256
    发表于 01-09 07:24

    基于HAL库定时器中断的闭环步进电机驱动与精准控制脉冲

    STM32控制步进电机:基于HAL库定时器中断的闭环步进电机
    发表于 03-16 09:28 5次下载
    基于HAL库<b class='flag-5'>定时器</b><b class='flag-5'>中断</b>的闭环<b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>驱动</b>与精准控制<b class='flag-5'>脉冲</b>数

    基于定时器中断的ULN2003驱动器/步进电机驱动程序

    STM32控制步进电机:基于定时器中断的ULN2003驱动器/步进
    发表于 03-16 09:28 10次下载
    基于<b class='flag-5'>定时器</b><b class='flag-5'>中断</b>的ULN2003<b class='flag-5'>驱动器</b>/<b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>驱动</b>程序

    用STM32定时器中断产生PWM控制步进电机

    电机可以使用PWM、定时器中断、延时,这里用的就是定时器中断来让它转动。 一、硬件部分 1.使用的硬件 板子用的是正点原子的STM32F10
    发表于 03-23 09:56 3次下载
    用STM32<b class='flag-5'>定时器</b><b class='flag-5'>中断</b><b class='flag-5'>产生</b>PWM控制<b class='flag-5'>步进</b><b class='flag-5'>电机</b>

    低压步进电机驱动器STSPIN220开发(1)----驱动STSPIN220

    ,并且可以强制进入零消耗状态,从而显著延长电池寿命。 本文档的目标是提供关于使用STM32CubeMX驱动低压步进电机驱动器
    的头像 发表于 05-25 16:29 226次阅读
    <b class='flag-5'>低压</b><b class='flag-5'>步进</b><b class='flag-5'>器</b><b class='flag-5'>电机</b><b class='flag-5'>驱动器</b><b class='flag-5'>STSPIN220</b><b class='flag-5'>开发</b>(1)----<b class='flag-5'>驱动</b><b class='flag-5'>STSPIN220</b>