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

2023-10-29

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

硬件是:STM32+驱动器+步进电机。

STM32定时器输出PWM,控制驱动器来驱动步进电机。单片机只要控制电机方向,以及PWM的频率即可,具体驱动由驱动器实现。

首先说一下什么是S型曲线加速,为什么要S型曲线加速。

S型曲线加速是指步进电机的启动速度按照S型曲线逐渐增加,以达到设定的最大速度。具体的S型曲线方程如下:

x取值-5~5的曲线图如下:

可以看到,刚开始加速和达到最大速度时加速比较缓慢,中间加速比较快。

电机的转矩和转速的乘积的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;
      float delt = fre_max-fre_min;
      float deno ;
      float melo ;
      float fre;


       for(i=0; i<len; 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,加速脉冲数300
       CurveS_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的频率是逐渐增大的。实际测试效果也不错。

推荐阅读:

STM32F4通过U盘升级程序

STM32CubeMX系列教程

STM32定时器应用合集

欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

步进电机S型曲线加速的实现 的相关文章

随机推荐

  • vue-awesome-swiper 配置分页不显示

    使用 vue awesome swiper 的时候遇到一个问题 明明配置了分页 在页面上却没有展示出小圆点 数据量也是足够分页的 安装的 vue awesome swiper 是 4 1 1 版本的 这是 html 的代码片段
  • Android 蓝牙笔记-底层RFKILL驱动

    概念 RFKill 就是RF 射频 设备的开关 有类似一键关闭所有射频外设的功能 比如当我们在飞机上飞行开启飞行模式时候 所有这些RF相关的设备都需要关闭 linux的rfkill子系统提供了用于禁用系统中任何无线电发射器的通用接口 发射设
  • AD20-封装的创作及添加

    原理图你是可以画的大一点 丑一点 但是封装库一定要按一比一的比例去画 否者是会影响后期的制作 也有可能是不能做出来的 画原理图是在 这个文件中进行 Ctrl m 是测量中心距离 先选中一个中心 在选中另一个中心 gg 按两次 是设置栅格的长
  • 浅谈数组与链表的区别

    1 区别 1 数组元素地址需要连续内存空间 链表节点地址不需要连续内存空间 2 数组在最初就确定了成员数量 后期无法修改 链表的节点个数可动态增减 3 数组元素只能是同1种数据类型 链表节点可携带多种数据类型 4 数组从栈中分配空间 链表从
  • java元注解

    java元注解 本文涉及以下这些内容 如果不清楚的话 可以看一下 相信会对你有些许帮助 1 使用IntelliJ IDEA 2018查看字节码 2 使用IntelliJ IDEA 2018生成帮助文档 本文主要针对于java8 java8定
  • 第十四届蓝桥杯B组第一期模拟题

    1 十进制整数 2 在十进制中是 1 位数 在二进制中对应 10 是 2 位数 十进制整数 22 在十进制中是 2 位数 在二进制中对应 10110 是 5 位数 请问十进制整数 2022 在二进制中是几位数 include
  • Python响应式类库RxPy简介

    RxPy是非常流行的响应式框架Reactive X的Python版本 其实这些版本都是一样的 只不过是各个语言的实现不同而已 因此 如果学会了其中一种 那么使用其他的响应式版本也是轻而易举的 之前我就听说过这个框架 最近决定好好研究一下 基
  • Jmeter(三十六) - 从入门到精通进阶篇 - 设置负载阶梯式压测场景(详解教程)

    1 简介 在性能测试中 有时需要模拟一种实际生产中经常出现的情况 即 从某个值开始不断增加压力 直至达到某个值 然后持续运行一段时间 然后继续加压达到某个值持续运行 如此循环直到达到预期的峰值 运行一段时间 在jmeter中 有这样一个插件
  • SASS 中的占位符%,@extend,@mixin(@include)的使用场景

    SASS在线编译网站 https www sassmeister com 占位符 被声明为占位符的CSS类 不会出现在最终生成的CSS中 SASS代码 log display block color black log debug exte
  • SQL删除重复数据,保留ID最大的一条

    在数据库中可能会存在重复数据 需要删除并且保留其中一条 这里我们保留其中id最大的一条 DELETE FROM T Dat BankData WHERE BankCode IN SELECT BankCode FROM T Dat Bank
  • Idea在plugin的marketplace中一直查不到东西&安装插件

    1 问题出现 我在Intellij IDEA 2018中搜索安装我们想要的插件时 有时候发现打开Setting gt Plugins Marketplace搜索插件页面加载不出来 而且搜索插件也搜索不出来 2 原因分析 IDEA的模块系统加
  • 解决 Access denied for user'root'@'IP地址'

    解决mysql Access denied for user root IP地址 问题 在MYSQL 中 用远程软件登陆服务器 有时出现 Access denied for user root localhost www 2cto com
  • jQuery 入门教程(29): jQuery UI Datepicker 示例(二)

    显示月份和年份选择下拉框 changeMonth 和changeYear 选择可以打开和关闭月份和年份下拉选择框 1 2
  • 数码管原理

    今天有师弟问我数码管的问题 我想起我刚学单片机的时候 好像也在数码管的地方迷糊了一段时间 就简单写写数码管的原理 首先 什么是数码管 百度百科解答 数码管 也称作辉光管 是一种可以显示数字和其他信息的电子设备 玻璃管中包括一个金属丝网制成的
  • 多处理器的基本概念

    SISD 单指令流单数据流 特性 各指令序列只能并发 不能并行 每条指令处理一两个数据 不是 数据级并行技术 硬件组成 一个处理器 一个主存储器 若采用指令流水线 需设置多个功能部件 采用多模块交叉存储器 SIMD 单指令流多数据流 特性
  • 使用较广泛的安全测试工具有哪些?

    使用较广泛的安全测试工具有哪些 安全测试是一个非常复杂的过程 安全测试所使用到的工具也非常多 而且种类不一 如漏洞扫描工具 端口扫描工具 抓包工具 渗透工具等 一 Web漏洞扫描工具 AppScan AppScan是IBM公司开发的一款We
  • mysql未开启binlog恢复数据_MYSQL bin_log 开启及数据恢复

    参考博客 A https www jianshu com p 55b0d52edca2 B https www cnblogs com martinzhang p 3454358 html C https www cnblogs com x
  • C语言-从txt文件中读取数据,忽略换行及回车

    long file size char filename FILE fp fopen filename r if fp return 1 fseek fp 0L SEEK END long size ftell fp fclose fp r
  • Mysql安装,控制台安装

    控制台安装要比exe方式安装简单很多 下载mysql 官网地址 mysql 解压下载的文件后 在生成的主目录里面创建一个my ini文件 文件内容如下 mysqld 端口号 port 3306 mysql安装目录 basedir C Pro
  • 步进电机S型曲线加速的实现

    之前做电机相关的项目比较少 最近有个项目涉及到步进电机的精确控制 参考了一些资料研究了一下S型曲线加减速 这里总结一下分享给大家 硬件是 STM32 驱动器 步进电机 STM32定时器输出PWM 控制驱动器来驱动步进电机 单片机只要控制电机