找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3828|回复: 2
收起左侧

基于STM32F4的S曲线加减速的实现程序

[复制链接]
ID:724859 发表于 2020-4-8 15:58 | 显示全部楼层 |阅读模式
  1. /**
  2.   * 函数功能: 主函数.
  3.   * 输入参数: 无
  4.   * 返 回 值: 无
  5.   * 说    明: 无
  6.   */
  7. int main(void)
  8. {
  9.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  10.   HAL_Init();
  11.   /* 配置系统时钟 */
  12.   SystemClock_Config();
  13.   /* 配置GPIO作为按键使用 */
  14.   KEY_GPIO_Init();
  15.   /* 配置串口输出 */
  16.   USARTx_Init();
  17.   /* 无限循环 */
  18.   while (1)
  19.   {
  20.     if(KEY1_StateRead() == KEY_DOWN)
  21.     {
  22.       /* 计算S型加减速曲线的加速段速度值*/
  23.       CalcSpeed(0,10,4);    // 从0加速到10r/min,加速时间是4s
  24.     }
  25.   }
  26. }

  27. /**
  28.   * 函数功能:速度表计算函数
  29.   * 输入参数:V0      初速度,单位:转/min
  30.   *          Vt      末速度,单位:转/min
  31.   *          Time    加速时间 单位: s
  32.   * 返 回 值:无
  33.   * 说    明: 根据速度曲线和加速时间,将数据密集化,即计算每一步的速度值
  34. */
  35. void CalcSpeed(int Vo, int Vt, float Time)
  36. {
  37.   int32_t i = 0;
  38.   
  39.   int32_t Vm =0;      // 中间点速度
  40.   float Jerk = 0;   // 加加速度
  41.   float Tn = 0;     // 时间间隔
  42.   float DeltaV = 0; // 速度的增量dv  
  43.   float TimeDel = 0;

  44.   /* 这里采用的数学模型是匀变速直线运动
  45.    * 加速段的曲线有两部分组成,第一是加速度递增的加加速段,
  46.    * 第二是加速度递减的减加速段,两段曲线可以视为关于中心对称(中心是中点速度).这两段曲线所用时间相等
  47.    * 所以中点速度 Vm = (Vt + Vo)/2;
  48.    * 加加速段:
  49.    *     加加速段的加速度曲线是一条过原点的递增的直线,对加速度积分得到的就是速度的增加量
  50.    *     所以有:Vm - Vo = 1/2 * Jerk * t^2,得到加加速度Jerk.
  51.    *     最后得到位移方程 S = 1/6 Jerk * t^3
  52.    *  :分析过程请结合工程文件夹下得曲线图理解.
  53.    *     由于S型曲线是V-t曲线,所以这里对时间进行等分,然后根据每一份的时间计算出速度表
  54.    */
  55.   Speed.Vo = ROUNDPS_2_STEPPS(Vo);    // 起速:Step/s
  56.   Speed.Vt = ROUNDPS_2_STEPPS(Vt);    // 末速:Step/s
  57.   Time = ACCEL_TIME(Time);                                // 得到加加速段的时间
  58.   Vm =  MIDDLEVELOCITY( Speed.Vo , Speed.Vt );            // 计算中点速度
  59.   Jerk = ACCELL_INCREASE( Speed.Vo, Vm, Time );           // 根据中点速度计算加加速度
  60.   Speed.AcceleratingStep  = (int32_t)ACCEL_DISPLACEMENT(Jerk,Time);// 加加速需要的步数
  61.   
  62.   /* 申请内存空间存放速度表 */
  63.   Speed.AcceleratingStep  = abs(Speed.AcceleratingStep ); // 减速计算的时候防止出现负数
  64.   if( Speed.AcceleratingStep  % 2 != 0)     // 由于浮点型数据转换成整形数据带来了误差,所以这里加1
  65.     Speed.AcceleratingStep  += 1;
  66.   Speed.AccelStep = Speed.AcceleratingStep * 2;           // 加速段的步数
  67.   Speed.VelocityTab = (float*)(malloc( Speed.AccelStep * sizeof(float) + 1 ));//申请内存
  68.   if(Speed.VelocityTab == NULL)
  69.   {
  70.     printf("内存不足!请修改曲线参数!\n");
  71.     return ;
  72.   }
  73.   
  74.   /* 目标的速度曲线是对时间的方程,所以这里对时间等分成Speed.S份,根据时间,计算出对应的速度 */
  75.   TimeDel = Time / Speed.AcceleratingStep;
  76.   for(i = 0; i <= Speed.AcceleratingStep; i++)
  77.   {
  78.     Tn = i * TimeDel;                       // 计算第n个时刻t
  79.     DeltaV = 0.5 * Jerk * pow(Tn,2);        // dv = 1/2 * Jerk * t^2;
  80.     Speed.VelocityTab[i] = Speed.Vo + DeltaV;  // 得到每一时刻对应的速度 // 加加速过程与减加速是中心对称,可以直接求出后半段速度
  81.     Speed.VelocityTab [ Speed.AccelStep - i] = Speed.Vt - DeltaV ;        // 减加速过程对称点的速度
  82.   }
  83.   
  84.   /* 串口打印输出速度表 */
  85.   for(i = 0; i <= Speed.AccelStep ; i++)
  86.   {
  87.     printf("VelocityTab[%d] = %.3f\n",i,Speed.VelocityTab[i]);
  88.   }
  89.   free((void*)Speed.VelocityTab);
  90.   Speed.VelocityTab = NULL;
  91. }

  92. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码


YSF4_HAL_MOTOR-134. 57&amp;42步进电机S型加减速速度计算.7z

2.88 MB, 下载次数: 98, 下载积分: 黑币 -5

回复

使用道具 举报

ID:25103 发表于 2020-6-17 14:30 | 显示全部楼层
谢谢楼主分享!!!
回复

使用道具 举报

ID:307544 发表于 2020-6-18 08:22 | 显示全部楼层
正在找步进电机控制资料,谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表