久久免费看少妇潮喷_欧美αⅤ一区二区_丝袜福利一区区电影_欧洲中出无码字幕

News center

新聞中心

步進(jìn)電機(jī)S曲線加減速算法及實(shí)現(xiàn)

2021-03-25??作品聲明:內(nèi)容由AI生成

步進(jìn)電機(jī)是將電脈沖信號(hào)轉(zhuǎn)換成角位移或線位移的開環(huán)控制電機(jī)。它是現(xiàn)代數(shù)字程控系統(tǒng)的主要執(zhí)行部件,應(yīng)用廣泛。在非過(guò)載情況下,電機(jī)的轉(zhuǎn)速和停止位置只取決于脈沖信號(hào)的頻率和脈沖數(shù),不受負(fù)載變化的影響。步進(jìn)驅(qū)動(dòng)器接收到脈沖信號(hào)后,驅(qū)動(dòng)步進(jìn)電機(jī)在設(shè)定的方向旋轉(zhuǎn)一個(gè)固定的角度,稱為“步角”,其旋轉(zhuǎn)以固定的角度步進(jìn)運(yùn)行。角位移可以通過(guò)控制脈沖數(shù)來(lái)控制,從而達(dá)到精確定位的目的;同時(shí),可以通過(guò)控制脈沖頻率來(lái)控制電機(jī)的速度和加速度,從而達(dá)到調(diào)速的目的。

步進(jìn)電機(jī)是感應(yīng)電機(jī)的一種。其工作原理是利用電子電路將直流電轉(zhuǎn)換成分時(shí)供電和多相定時(shí)控制電流。只有用這個(gè)電流給步進(jìn)電機(jī)供電,步進(jìn)電機(jī)才能正常工作。驅(qū)動(dòng)器是一個(gè)多相定時(shí)控制器,分時(shí)向步進(jìn)電機(jī)供電。

  步進(jìn)電機(jī)S型曲線加減速算法與實(shí)現(xiàn)

s型曲線方程

,在[-5,5]圖形中如下圖所示:

如果想把這條曲線應(yīng)用到步進(jìn)電機(jī)的加減速過(guò)程中,需要在XY坐標(biāo)系中平移方程,同時(shí)拉起曲線:

其中a分量在y方向平移,b分量在y方向拉伸,ax b分量在x方向平移拉伸。

項(xiàng)目中的加速過(guò)程:從5600Hz加速到64000Hz,采用4細(xì)分。輸出比較模塊中使用的定時(shí)器驅(qū)動(dòng)頻率為10M,1000點(diǎn)用于加速處理。后,根據(jù)項(xiàng)目需要,加速過(guò)程中采用的曲線方程為:

其中Fcurrent是長(zhǎng)度為(1000)點(diǎn)的單個(gè)頻率值。Fmin啟動(dòng)頻率為5600;Fmax為頻率64000;-flexible*(i-num)/num為S形曲線的拉伸變化,其中flexible表示S形曲線的區(qū)間(越大壓縮越劇烈,中間加速度越大(X坐標(biāo)0點(diǎn)附近);越小越接近勻加速。理想S曲線的值是4-6),I是循環(huán)計(jì)算過(guò)程中的指標(biāo),num是從0開始的長(zhǎng)度/2(可以使S曲線對(duì)稱)。在項(xiàng)目中I的區(qū)間[0,1000]內(nèi),num=1000/2=500。這些參數(shù)可以修改。提供的計(jì)算接口如下。

相應(yīng)計(jì)算接口的代碼:

/*計(jì)算周期和頻率陣列值,在定時(shí)器中斷期間將周期值填入周期寄存器。

*計(jì)算acceleraTIon過(guò)程,總共1000個(gè)元素的數(shù)組。

*參數(shù)fre[]:指向保存freq值的數(shù)組。

* period[]:指向保存TImer period值的數(shù)組。

* len:加速長(zhǎng)度的程序,好設(shè)置浮點(diǎn)數(shù),有些編譯軟件可能會(huì)轉(zhuǎn)移

error if set it as a int

  * fre_max: maximum speed, frequency vale.

  * fre_min: start minimum speed, frequency vale. mind : 10000000/65535 = 152, so fre_min can‘t less than 152.

  * flexible: flexible value. adjust the S curves

  void CalculateSModelLine(float fre[], unsigned short period[], float len, float fre_max, float fre_min, float flexible)

  int i=0;

  float deno ;

  float melo ;

  float delt = fre_max-fre_min;

  for(; i《len; i++)

  melo = flexible * (i-len/2) / (len/2);

  deno = 1.0 / (1 + expf(-melo)); //expf is a library function of exponential(e)

  fre[i] = delt * deno + fre_min;

  period[i] = (unsigned short)(10000000.0 / fre[i]); // 10000000 is the timer driver frequency

  return ;

  // start move motor

  void StartPWM()

  DriverMotorFlag = TRUE;

  Index = 0;

  MOTOR_EN_DISABLE = ENABLE;

  OpenOC4(OC_ON | OC_TIMER_MODE16 | OC_TIMER3_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0);

  // map rc13 to oc4 output

  RPC13R = 11;

  // 50 percent duty

  OC4RS = OC_PERIOD_MIN / 2;

  OpenTimer3(T3_ON | T3_PS_1_8, OC_PERIOD_MIN);

  INTSetVectorPriority(INT_TIMER_3_VECTOR, INT_PRIORITY_LEVEL_6);

  INTSetVectorSubPriority(INT_TIMER_3_VECTOR, INT_SUB_PRIORITY_LEVEL_1);

  EnableIntT3;

  //stop motor, hereis no deceleration

  void StopPWM()

  DriverMotorFlag = FALSE;

  Index = 0;

  MOTOR_EN_DISABLE = DISENABLE;

  OpenOC4(OC_OFF | OC_TIMER_MODE16 | OC_TIMER3_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0);

  // map rc13 to oc4 output

  RPC13R = 0;

  PORTCbits.RC13 = 0;

  CloseTimer3();

  DisableIntT3;

  //change the timer Period value in the correspond timer rather than the other place, Or the motor will be stalled occasionally.

  // 剛開始我在另外的一個(gè)定時(shí)器中斷中每隔1ms改變 應(yīng)用在OC模塊的timer3 的Period值,結(jié)構(gòu)偶發(fā)的造成電機(jī)在加速過(guò)程中堵轉(zhuǎn)。其實(shí)應(yīng)該是在timer3的中斷中修改。

  static unsigned short CountForAcc = 0;

  void __ISR(_TIMER_3_VECTOR, ipl6) Timer3OutHandler(void)

  // clear the interrupt flag, or the interrupt will not occur again.

  mT3ClearIntFlag();

  if(CountForAcc++ 》 2) // here can adjust the totally time of acceleration

  CountForAcc = 0;

  //if(DriverMotorFlag == TRUE && PR3 》 OC_PERIOD_MAX + SPEED_STEP)

  if(DriverMotorFlag == TRUE && Index 《 ACC_TIMES)

  PR3 = Period[Index++];

  OC4RS = PR3 / 2;

  通過(guò)CalculateSModelLine接口得到如下不同的幾條加速曲線:

  黃色:CalculateSModelLine(Freq, Period, 1000, 56000, 16000, 4);

  橙色:CalculateSModelLine(Freq, Period, 1000, 64000, 500, 8);

  藍(lán)色:CalculateSModelLine(Freq, Period, 1000, 64000, 500, 15);

  灰色:CalculateSModelLine(Freq, Period, 1000, 40000, 500, 5);