找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4669|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于STM32F4的S曲線加減速的實(shí)現(xiàn)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:724859 發(fā)表于 2020-4-8 15:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. /**
  2.   * 函數(shù)功能: 主函數(shù).
  3.   * 輸入?yún)?shù): 無(wú)
  4.   * 返 回 值: 無(wú)
  5.   * 說(shuō)    明: 無(wú)
  6.   */
  7. int main(void)
  8. {
  9.   /* 復(fù)位所有外設(shè),初始化Flash接口和系統(tǒng)滴答定時(shí)器 */
  10.   HAL_Init();
  11.   /* 配置系統(tǒng)時(shí)鐘 */
  12.   SystemClock_Config();
  13.   /* 配置GPIO作為按鍵使用 */
  14.   KEY_GPIO_Init();
  15.   /* 配置串口輸出 */
  16.   USARTx_Init();
  17.   /* 無(wú)限循環(huán) */
  18.   while (1)
  19.   {
  20.     if(KEY1_StateRead() == KEY_DOWN)
  21.     {
  22.       /* 計(jì)算S型加減速曲線的加速段速度值*/
  23.       CalcSpeed(0,10,4);    // 從0加速到10r/min,加速時(shí)間是4s
  24.     }
  25.   }
  26. }

  27. /**
  28.   * 函數(shù)功能:速度表計(jì)算函數(shù)
  29.   * 輸入?yún)?shù):V0      初速度,單位:轉(zhuǎn)/min
  30.   *          Vt      末速度,單位:轉(zhuǎn)/min
  31.   *          Time    加速時(shí)間 單位: s
  32.   * 返 回 值:無(wú)
  33.   * 說(shuō)    明: 根據(jù)速度曲線和加速時(shí)間,將數(shù)據(jù)密集化,即計(jì)算每一步的速度值
  34. */
  35. void CalcSpeed(int Vo, int Vt, float Time)
  36. {
  37.   int32_t i = 0;
  38.   
  39.   int32_t Vm =0;      // 中間點(diǎn)速度
  40.   float Jerk = 0;   // 加加速度
  41.   float Tn = 0;     // 時(shí)間間隔
  42.   float DeltaV = 0; // 速度的增量dv  
  43.   float TimeDel = 0;

  44.   /* 這里采用的數(shù)學(xué)模型是勻變速直線運(yùn)動(dòng)
  45.    * 加速段的曲線有兩部分組成,第一是加速度遞增的加加速段,
  46.    * 第二是加速度遞減的減加速段,兩段曲線可以視為關(guān)于中心對(duì)稱(中心是中點(diǎn)速度).這兩段曲線所用時(shí)間相等
  47.    * 所以中點(diǎn)速度 Vm = (Vt + Vo)/2;
  48.    * 加加速段:
  49.    *     加加速段的加速度曲線是一條過(guò)原點(diǎn)的遞增的直線,對(duì)加速度積分得到的就是速度的增加量
  50.    *     所以有:Vm - Vo = 1/2 * Jerk * t^2,得到加加速度Jerk.
  51.    *     最后得到位移方程 S = 1/6 Jerk * t^3
  52.    *  :分析過(guò)程請(qǐng)結(jié)合工程文件夾下得曲線圖理解.
  53.    *     由于S型曲線是V-t曲線,所以這里對(duì)時(shí)間進(jìn)行等分,然后根據(jù)每一份的時(shí)間計(jì)算出速度表
  54.    */
  55.   Speed.Vo = ROUNDPS_2_STEPPS(Vo);    // 起速:Step/s
  56.   Speed.Vt = ROUNDPS_2_STEPPS(Vt);    // 末速:Step/s
  57.   Time = ACCEL_TIME(Time);                                // 得到加加速段的時(shí)間
  58.   Vm =  MIDDLEVELOCITY( Speed.Vo , Speed.Vt );            // 計(jì)算中點(diǎn)速度
  59.   Jerk = ACCELL_INCREASE( Speed.Vo, Vm, Time );           // 根據(jù)中點(diǎn)速度計(jì)算加加速度
  60.   Speed.AcceleratingStep  = (int32_t)ACCEL_DISPLACEMENT(Jerk,Time);// 加加速需要的步數(shù)
  61.   
  62.   /* 申請(qǐng)內(nèi)存空間存放速度表 */
  63.   Speed.AcceleratingStep  = abs(Speed.AcceleratingStep ); // 減速計(jì)算的時(shí)候防止出現(xiàn)負(fù)數(shù)
  64.   if( Speed.AcceleratingStep  % 2 != 0)     // 由于浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換成整形數(shù)據(jù)帶來(lái)了誤差,所以這里加1
  65.     Speed.AcceleratingStep  += 1;
  66.   Speed.AccelStep = Speed.AcceleratingStep * 2;           // 加速段的步數(shù)
  67.   Speed.VelocityTab = (float*)(malloc( Speed.AccelStep * sizeof(float) + 1 ));//申請(qǐng)內(nèi)存
  68.   if(Speed.VelocityTab == NULL)
  69.   {
  70.     printf("內(nèi)存不足!請(qǐng)修改曲線參數(shù)!\n");
  71.     return ;
  72.   }
  73.   
  74.   /* 目標(biāo)的速度曲線是對(duì)時(shí)間的方程,所以這里對(duì)時(shí)間等分成Speed.S份,根據(jù)時(shí)間,計(jì)算出對(duì)應(yīng)的速度 */
  75.   TimeDel = Time / Speed.AcceleratingStep;
  76.   for(i = 0; i <= Speed.AcceleratingStep; i++)
  77.   {
  78.     Tn = i * TimeDel;                       // 計(jì)算第n個(gè)時(shí)刻t
  79.     DeltaV = 0.5 * Jerk * pow(Tn,2);        // dv = 1/2 * Jerk * t^2;
  80.     Speed.VelocityTab[i] = Speed.Vo + DeltaV;  // 得到每一時(shí)刻對(duì)應(yīng)的速度 // 加加速過(guò)程與減加速是中心對(duì)稱,可以直接求出后半段速度
  81.     Speed.VelocityTab [ Speed.AccelStep - i] = Speed.Vt - DeltaV ;        // 減加速過(guò)程對(duì)稱點(diǎn)的速度
  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 硬石嵌入式開(kāi)發(fā)團(tuán)隊(duì) *****END OF FILE****/
復(fù)制代碼


YSF4_HAL_MOTOR-134. 57&amp;42步進(jìn)電機(jī)S型加減速速度計(jì)算.7z

2.88 MB, 下載次數(shù): 98, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:25103 發(fā)表于 2020-6-17 14:30 | 只看該作者
謝謝樓主分享。!
回復(fù)

使用道具 舉報(bào)

板凳
ID:307544 發(fā)表于 2020-6-18 08:22 | 只看該作者
正在找步進(jìn)電機(jī)控制資料,謝謝分享!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表