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

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

3天内不再提示

步进电机S型曲线加减速的实现

GReq_mcu168 来源:嵌入式技术开发 作者:嵌入式技术开发 2022-07-01 16:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

之前做电机相关的项目比较少,最近有个项目涉及到步进电机的精确控制,参考了一些资料研究了一下S型曲线加减速,这里总结一下分享给大家。

硬件是:STM32+驱动器+步进电机。
STM32定时器输出PWM,控制驱动器来驱动步进电机。单片机只要控制电机方向,以及PWM的频率即可,具体驱动由驱动器实现。 首先说一下什么是S型曲线加速,为什么要S型曲线加速。
S型曲线加速是指步进电机的启动速度按照S型曲线逐渐增加,以达到设定的最大速度。具体的S型曲线方程如下:2cf33e0a-f527-11ec-ba43-dac502259ad0.pngx取值-5~5的曲线图如下:2d043ca0-f527-11ec-ba43-dac502259ad0.png可以看到,刚开始加速和达到最大速度时加速比较缓慢,中间加速比较快。电机的转矩和转速的乘积的k倍等于功率,也就是说,功率一定的时候,转速与转矩成反比关系。所以,转速越低,转矩越大。当电机直接高速启动时,电机可能存在震动、丢步甚至启动不起来的情况。因此需要S型曲线加速,使电机能够缓慢启动。程序实现控制电机的速度,其实就是控制PWM的输出频率。首先需要对S曲线方程进行一些变化,如下:Fcurrent = Fmin + (Fmax-Fmin)/(1+exp( -Flexible(i - num )/num) )
  • Fcurrent为计算出的当前频率。

  • Fmin为加速的起始频率。

  • Fmax为加速的最大频率。

  • -Flexible*(i - num)/num是对S型曲线进行拉伸变化,其中Flexible代表S曲线区间(越大代表压缩的最厉害,中间加速度越大;越小越接近匀加速。理想的S曲线的取值为4-6)

  • i是在循环计算过程中的索引,从0开始

  • num为 加速脉冲数/2 大小

上面计算出的是频率的S曲线,还需要将频率转换成定时器的计数周期,程序如下:

//功能:S加速曲线初始化//参数1 *pbuff          计算出的定时器的周期//参数2 fre_max        最大频率 Hz//参数3 fre_min        最小频率 Hz//参数4 len            加速需要的脉冲数void CurveS_init(uint16_t *pbuff,uint32_t fre_max,uint32_t fre_min,int16_t len){      int16_t i;      uint16_t flexible =4;floatdelt=fre_max-fre_min;floatdeno;      float melo ;floatfre;
       for(i=0; i       {              melo = flexible* (i-len/2) / (len/2);              deno = 1.0f / (1 + expf(-melo));  //              fre = delt * deno + fre_min;              *pbuff++ = (unsigned short)(TIM2_CLOCK_FREQ / fre);       }
}
TIM2_CLOCK_FREQ为定时器的计数频率。 之后要做的就是在加减速过程中,每输出一个PWM脉冲,重新装载一次定时器周期。具体怎样输出指定个数PWM来控制步进电机,可参考之前的文章《STM32定时器产生指定个数脉冲》。在PWM中断中,将计算好的S曲线数组,重新装载到定时器的ARR和CCR寄存器中即可。程序如下:
//PWM回调函数void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim){    Motor.PWMcount++;    SpeedAdjust();//速度调节}
//速度调节函数void SpeedAdjust(void){  switch(Motor.Status)  {    /*加速*/                case SPEED_INCREASE:      if(Motor.Count < Motor.CountMax)      {        __HAL_TIM_SET_AUTORELOAD(&htim2,Period[Motor.Count]);//计算下一个PWM的周期        htim2.Instance->CCR1 = Period[Motor.Count]/2;//占空比50%        Motor.Count++;//加速次数      }      else      {        Motor.Status = SPEED_STABLE;        Motor.Count--;      }break;    /*匀速*/      case SPEED_STABLE:      if(Motor.PWMcount >= (Motor.PWMneed - Motor.Count))      {            Motor.Status = SPEED_DECREASE;        }break;    /*减速*/      case SPEED_DECREASE:      if(Motor.Count >= 0)      {        __HAL_TIM_SET_AUTORELOAD(&htim2,Period[Motor.Count]);//计算下一个PWM的周期        htim2.Instance->CCR1 = Period[Motor.Count]/2;        Motor.Count--;        }      if(Motor.PWMcount >= Motor.PWMneed)      {        HAL_TIM_PWM_Stop_IT(&htim2,TIM_CHANNEL_1);      }      break;    default :      break;  }

其中Motor是自己定义的一个结构体:


typedef struct{  uint8_t Status;   //状态  int32_t Count;     //加减速过程脉冲计数  int32_t CountMax;  //最大加速脉冲数  uint32_t PWMcount;//PWM计数  uint32_t PWMneed; //需要输出的PWM总数}Motor_t;
启动时,初始化参数,启动定时器输出PWM即可:
//PWM--需要输出的脉冲个数void StartPWM(uint32_t PWM){             Motor.PWMcount = 0;       Motor.PWMneed = PWM;       Motor.Count = 0;       Motor.Status = SPEED_INCREASE;       Motor.CountMax = 300;//初始化加速曲线,最小频率100,最大频率10K,加速脉冲数300CurveS_init(Period,10000,100,Motor.CountMax);       __HAL_TIM_SET_AUTORELOAD(&htim2,Period[0]);       htim2.Instance->CCR1 = Period[0];       HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);  //启动定时器PWM输出}
来看一下效果,可以看到,PWM的频率是逐渐增大的。实际测试效果也不错。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    54

    文章

    9128

    浏览量

    156923
  • 步进电机
    +关注

    关注

    153

    文章

    3277

    浏览量

    152925

原文标题:步进电机S型曲线加速的实现

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    24V供电,3A输出,S曲线:TMCM-3351三轴电机控制模块

    TMCM-3351三轴电机控制模块24V供电,3A输出,S曲线如果你正在设计一台需要同时驱动三个步进电机的设备——比如三轴点胶机、半导体检
    的头像 发表于 04-08 18:27 4382次阅读
    24V供电,3A输出,<b class='flag-5'>S</b>形<b class='flag-5'>曲线</b>:TMCM-3351三轴<b class='flag-5'>电机</b>控制模块

    变频器加减速时对容量有哪些影响

    变频器在加减速过程中,对容量的影响主要体现在瞬时过载能力、制动能力以及热积累效应三个方面。简单来说,加减速越频繁、负载惯性越大、加减速时间设定得越短,对变频器的容量要求就越高。
    的头像 发表于 04-05 17:14 1268次阅读
    变频器<b class='flag-5'>加减速</b>时对容量有哪些影响

    变频器在加减速过程中报主回路过电压故障如何处理

    变频器在加减速时报主回路过电压,本质上是因为电机处于“发电”状态,回馈的能量超过了变频器自身的消耗能力,导致直流母线电压飙升。
    的头像 发表于 04-05 07:13 550次阅读
    变频器在<b class='flag-5'>加减速</b>过程中报主回路过电压故障如何处理

    变频调速器的加减速方式

    变频调速器的加减速方式,核心是解决电机自身惯性与快速启停需求之间的矛盾 。设置的目标是在 不引起过流或过压跳闸的前提下,尽可能缩短加减速时间  。 主要包含以下两个方面: 加减速模式(
    的头像 发表于 03-20 07:42 564次阅读
    变频调速器的<b class='flag-5'>加减速</b>方式

    电机加减速曲线控制的选择

    电机加减速曲线的选择,本质上是在 平滑性、响应速度和系统复杂性 之间做权衡。没有一种曲线是万能的,最合适的取决于你的负载特性和性能要求。 下面是三种主流
    的头像 发表于 03-16 16:41 470次阅读
    <b class='flag-5'>电机</b><b class='flag-5'>加减速</b><b class='flag-5'>曲线</b>控制的选择

    齿轮减速电机步进电机的特性有哪些区别

    齿轮减速电机步进电机作为工业自动化领域的两大核心驱动元件,因其不同的结构原理和性能特点,在实际应用中各有侧重。深入理解两者的差异,有助于工程师在选型时更精准地匹配需求。以下从工作原理
    的头像 发表于 03-04 11:01 360次阅读
    齿轮<b class='flag-5'>减速</b><b class='flag-5'>电机</b>与<b class='flag-5'>步进</b><b class='flag-5'>电机</b>的特性有哪些区别

    TMCM-1316:S 加减速 + 256 微步 步进控制更精准

    一款在运动控制细节上表现突出的模块——TMCM-1316StepRocker,看看它是如何通过S加减速曲线与最高256微步细分技术,让步进
    的头像 发表于 02-09 16:45 1142次阅读
    TMCM-1316:<b class='flag-5'>S</b> <b class='flag-5'>型</b><b class='flag-5'>加减速</b> + 256 微步 <b class='flag-5'>步进</b>控制更精准

    TMC4361A:实现步进电机S曲线高速平稳运行!

    效的运动控制的。TMC4361A是一款高度集成的小型运动控制芯片,专为步进电机驱动设计。它不仅支持经典的梯形速度曲线,更内置了S形斜坡和SixPoint斜坡发生器,
    的头像 发表于 02-05 15:24 470次阅读
    TMC4361A:<b class='flag-5'>实现</b><b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>S</b>形<b class='flag-5'>曲线</b>高速平稳运行!

    ‌DRV8711 步进电机控制器技术文档总结

    DRV8711器件是一个步进电机控制器,它使用外部 N 沟道 MOSFET 驱动一个双极步进电机或两个有刷直流电机。集成了微
    的头像 发表于 10-17 15:09 1222次阅读
    ‌DRV8711 <b class='flag-5'>步进</b><b class='flag-5'>电机</b>控制器技术文档总结

    基于L6482的步进电机驱动评估板技术解析

    集成的解决方案,适用于驱动微步进两相双极步进电机。它将用于N沟道MOSFET功率级的双路全桥栅极驱动器与嵌入式非耗散过流保护相结合。得益于新的电流控制,通过自适应衰减模式实现1/16微
    的头像 发表于 10-17 11:44 878次阅读
    基于L6482的<b class='flag-5'>步进</b><b class='flag-5'>电机</b>驱动评估板技术解析

    基于ST EVL6480评估板的步进电机驱动技术解析

    1/128步进分辨率的微步进。数字控制内核可生成用户定义的运动曲线,并可通过专用寄存器轻松设置加速、速度、减速或目标位置。所有命令和数据寄存器均通过标准5Mbit/
    的头像 发表于 10-17 11:41 808次阅读
    基于ST EVL6480评估板的<b class='flag-5'>步进</b><b class='flag-5'>电机</b>驱动技术解析

    基于L6472的步进电机驱动评估板技术解析与应用指南

    集成的解决方案,适用于驱动微步进两相双极步进电机。它将双路低R~dsON~ DMOS全桥与精确的片上电流检测电路相结合,实现非耗散电流控制和过流保护。得益于独特的控制系统,可
    的头像 发表于 10-17 11:30 806次阅读
    基于L6472的<b class='flag-5'>步进</b><b class='flag-5'>电机</b>驱动评估板技术解析与应用指南

    EVL6470步进电机驱动评估板技术解析与应用指南

    集成的解决方案,适用于驱动微步进两相双极步进电机。它将双路低R~dsON~ DMOS全桥与精确的片上电流检测电路相结合,实现非耗散电流控制和过流保护。得益于独特的控制系统,可
    的头像 发表于 10-17 11:25 871次阅读
    EVL6470<b class='flag-5'>步进</b><b class='flag-5'>电机</b>驱动评估板技术解析与应用指南

    只是加减速和转弯,为啥自动驾驶这么难实现

    并不是那么容易?自动驾驶汽车为何发展这么多年,还是没有实现L5?今天智驾最前沿就来和大家聊聊这个话题。 车辆的运行轨迹看似简单,但并不是简单地“往前跑”或“停下来”那么简单。任何一次加减速,都与车辆的质量、轮胎与
    的头像 发表于 06-27 12:20 785次阅读
    只是<b class='flag-5'>加减速</b>和转弯,为啥自动驾驶这么难<b class='flag-5'>实现</b>?

    升降速曲线对直线电机系统性能影响的研究

    Matlab仿真证明二次速度曲线是目前最适用于高速高精直线电机运动控制系统的加/减速曲线,并在带前馈的直线电机伺服实验平台上进行了验证实验。
    发表于 06-17 08:48