有不少網友感嘆高鐵技術之穩,一杯水放在窗戶上面都不會晃動.要達到這個‘穩’,就要在電機啟動停止時,有一個加減速.電機啟動時,速度需要逐漸提高,停止時,速度逐漸減小,這就是步進電機的加減速過程。單片機給步進驅動一個脈沖,電機轉動一個步距角,單片機給脈沖越快,步進電機單位時間內,轉動的角度也就越大.即脈沖頻率正比于電機轉速.另一方面,速度的變化對應的物理量是加速度,高中物理可以知道,一個加速過程一般涉及:初始速度,加速度,加速時間這三個量.對應到電機轉動:起始轉速(rpm),最大速度(rpm),加速時間(min),轉速對應單片機定時器的頻率 pulse/ms(單片機定時器1毫秒中斷次數).
工控行業電機加減速一般有T型加速,S型加速.負載慣量比較輕的情況就可以使用T型曲線,負載慣量比較重的情況一般使用S型曲線,S型曲線光滑,速度不突變.
單片機速度控制原理
單片機通過調節頻率控制電機速度,頻率是單片機定時器的定時間隔決定的,只需要在定時器中斷處理程序里邊翻轉脈沖輸出端口即可.單片機的RAM和CPU不是很快,定時器的間隔使用查表的方法來獲取,效率比較高.
控制流程
T型曲線
T型曲線的加速減階段是線性加減速的,整個運動[加速,勻速,減速]速度變化看起來像一個等腰梯形.
加速階段就是一個一次線性函數,斜率不變[加速度不變],公式如下:
單片機生成加速數組代碼:
//生成T形加速數組
//Vmin:起始速度(pulse/s)
//Vmax:最大速度,即勻速速度(pulse/s)
//AccTime:加速時間(ms)
//pBuffer:數組緩存區
//返回值:數組長度
int GenTTable(uint Vmin,uint Vmax,int AccTime,uint* pBuffer)
{
//計算加速度
uint a = (Vmax-Vmin)/AccTime;
uint v = Vmin;
uint t = 0;
int index = 0;
while(v<=Vmax)
{
v = a*t+Vmin;
pBuffer[index] = f/v; //f為定時器的工作頻率
t += 1000000/v; //v的速度為pulse/s,一個脈沖的時間為:1/v s=1000000/v us
index++;
}
return index;
}
S形加減速
從T形加速曲線的圖形,可以看出加速階段轉向勻速階段時加速度是突然變為零的,這對大慣量的設備晃動比較大,要想設備晃動比較小,就需要加速過渡到勻速階段是漸進光滑的,加速度不突變,進入到勻速階段時加速度剛好為0.數學模型的S形曲線就是光滑,加速度不突變的。數學方程可以參考**邏輯斯蒂**曲線,下圖是公式推導:
單片機S形曲線加速數組生成:
上面的公式推導有一個結論:
程序代碼就是根據這個公式來生成數組數據
//生成S形加速數組
//Vmin:起始速度(pulse/s)
//Vmax:最大速度,即勻速速度(pulse/s)
//AccTime:加速時間(s)
//pBuffer:數組緩存區
//返回值:數組長度
int GenSTable(uint Vmin,uint Vmax,int AccTime,uint* pBuffer)
{
double tSum = 0;
double T= AccTime*f; //f為定時器工作頻率
uint C0 = (uint)(f/Vmin);
uint Cmax = (uint)(f/Vmax);
uint index = 0;
while (tSum < T)
{
pBuffer[index]= (uint)(Cmax+pow(C0-Cmax,(T-tSum)/T));
tSum += pBuffer[index];
index++;
}
return index;
}
上面生成的加速數據就是定時器的間隔,可以把這邊這份數據寫到Flash的扇區,這樣不用電機每次運動都來生成一次,減少單片機的運算量.也可使用上位機改變電機的起始速度,勻速速度,加速時間來調節電機加速性能,不用重新編譯單片機代碼,使用起來很方便.
-
單片機
+關注
關注
6023文章
44376瀏覽量
628369 -
電機
+關注
關注
141文章
8772瀏覽量
143770 -
脈沖頻率
+關注
關注
0文章
11瀏覽量
7934
發布評論請先 登錄
相關推薦
評論