天天看點

電機加速時間及距離的算法

#include "stdafx.h"

#include "string.h"

//已知初速度、加速度、目标速度,求加速時間及對應的加速路程最優化(誤差最小)的整型算法

void CalcS()

{

    int v0 = 5, vt = 40;//初始速度、目标速度

    int dv = vt - v0;//內插補點

    int c = 3, b = 10;//加速度參數

    int a = c / b;//定義加速度為分數形式

    int t = dv*b / c;//加速時間計算

    int s = v0 * dv * b / c + dv * dv * b / (2 * c);//根據s=v0t+at^2/2公式推導出

    printf("vt=%dmm/s,連續行程s= %dum\n", vt, s);

}

//使用離散方式計算加速的路程,程式裡适用

void CalcRs()

{

    int v0 = 5, vt = 40;//初始速度、目标速度,mm/s或um/ms

    int a = 3;//加速度,每次加速多少mm

    int dt = 10;//10ms//加速時間間隔

    int times = (vt - v0)/a;//達到目标速度的間隔次數,ms

    int S = 0;//路程,um

    for (int i = 0; i < times; i++)//積分求和

    {

        S += (v0 + i * a)*dt;

    }

    printf("vt=%dmm/s,離散行程S=%dum\n",vt,S);

}

int main()

{

    CalcS();

    CalcRs();

    getchar();

    return 0;

}

運作結果:

電機加速時間及距離的算法

分析:離散運算和連續運算差距還是挺大的,單片機進行計算應該盡量采用離散方式來計算能減小誤差。

用matlab進行加速時間及行程計算代碼如下:v0=5;vt=40;dv=vt-v0;c=3;b=10;a=c/b;t=dv*b/c;s=v0*dv*b/c+dv^2*b/(2*c)