之前做電機相關的項目比較少,最近有個項目涉及到步進電機的精確控制,參考了一些資料研究了一下S型曲線加減速,這里總結一下分享給大家。
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 大小。
TIM2_CLOCK_FREQ為定時器的計數頻率。 之后要做的就是在加減速過程中,每輸出一個PWM脈沖,重新裝載一次定時器周期。具體怎樣輸出指定個數PWM來控制步進電機,可參考之前的文章《STM32定時器產生指定個數脈沖》。在PWM中斷中,將計算好的S曲線數組,重新裝載到定時器的ARR和CCR寄存器中即可。程序如下://功能: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;
floatdelt=fre_max-fre_min;
floatdeno;
float melo ;
floatfre;
for(i=0; 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);
}
}
//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是自己定義的一個結構體:
啟動時,初始化參數,啟動定時器輸出PWM即可: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輸出
}
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
驅動器
+關注
關注
52文章
8226瀏覽量
146253 -
步進電機
+關注
關注
150文章
3109瀏覽量
147443
原文標題:步進電機S型曲線加速的實現
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
伺服電機加減速機慣量怎么計算
伺服電機加減速機系統是現代工業自動化領域中常見的一種傳動裝置,它通過將伺服電機的高速旋轉轉化為減速機的低速大扭矩輸出,實現對負載的精確控制。
stm32控制步進電機加減速的穩定性?
各位:
我最近接了一個項目做agv小車的驅動部分。使用兩個定時器和io配合輸出脈沖,控制步進電機。控制上沒問題,但是加減速和轉彎的過程不是很平穩,放一杯水在上邊晃動的很厲害。我是用的方法就是勻速變化
發表于 05-06 07:21
如何用stm32f103zet6控制伺服電機的加減速運動?
想用stm32f103zet6控制伺服電機的加減速運動,不知該怎么做,請大神指教。具體情況是有個機械凸輪,有一根頂桿頂著凸輪邊沿,隨著凸輪轉動及其外徑的變化,水平頂桿會沿水平方向作直線運動。現在可以
發表于 04-30 08:00
如何快速開發高性能步進電機控制驅動系統RS485 UART通訊Modebus協議防丟步節能靜音驅動TMCM1290
實現復雜的運動控制邏輯,提高系統的自動化水平。
三、高級功能
EightPoint加減速曲線:TMCM-1290采用EightPoint加減速曲線
發表于 03-10 20:44
解析步進電機三軸聯動的快速加減速算法研究
步進電機具有快速啟停能力強、高、轉速容易控制的特點。但是,步進電動機應避免轉動速率的突變,而且從停止到開始轉動有一個較低的起動頻率,隨后才可以平緩地過渡到較高的轉速。相應地在步進
發表于 01-19 14:55
?1395次閱讀
評論