步進電機控制程序編寫 stm32步進電機控制程序系統

表面
為了實行步進電機的緩慢啟停以及制止轉高轉速時不失步停轉 。在步進電機啟用、遏止進程中,須要沿用加放慢的算法對啟用進程舉行遏制 。S弧線是加放慢遏制最理念的計劃 。然而S弧線的公式以及遏制進程都比擬攙雜 。鑒于單片機實行這一算法須要有深沉的數學以及單片機軟硬件安排本領 。
本視頻從淺入深引見S弧線加減數的表面、編制程序與試驗 。
將S弧線分割化,在所有加放慢進程中,以確定的功夫間隙革新頻次,總的革新度數為2*N,i表白為第i次的革新,則第i次革新的頻次f(i)表白為:
個中fb為發端的頻次,fr是最后運轉的頻次,α是弧線的舒卷系數,普遍不妨取3-5之間的常數 。
比方,啟用加快,發端頻次為400Hz,運轉頻次為5KHz 。
【步進電機控制程序編寫stm32步進電機控制程序系統】遏止放慢,發端頻次為5KHz,遏止頻次為400Hz,
加放慢的功夫均為1s,按10ms的功夫間隙革新頻次,所有革新100次,α取5 。
則不妨繪制以次的加放慢弧線:
編制程序
經過以次辦法實行實行步進電機的S弧線的加放慢遏制:
擺設1ms的準時器以及1ms的阻礙步調在阻礙步調中對加放慢的頻次革新度數i舉行計數擺設爆發步進電機啟動旗號的PWM模塊,樹立PWM的準時阻礙以及阻礙步調在PWM的準時阻礙步調中,計劃暫時革新度數對應的頻次,并按出來的頻次革新PWM的頻次以及占空比在PWM的準時阻礙步調中,計劃步進電機運轉的步數,即使到達樹立的步數減去遏止的S弧線放慢運轉所樹立的步數,則發端放慢運轉 。同聲檢驗和測定外部輸出,即使有須要遏止運轉的輸出前提,則發端放慢運轉 。所有加放慢遏制進程的難點在乎:
步進電機的計步以及頻次革新須要在每一個PWM阻礙中舉行 。步進電機的運轉頻次更高到40KHz,這種頻次下,PWM的準時阻礙周期到達了25us,PWM準時器阻礙步調運轉總功夫盡管小,按照體味起碼小于阻礙周期的30%,即7.5us 。一旦勝過這個數值,引導一切阻礙步調(囊括PWM準時阻礙步調)漏運轉,基礎主步調沒轍運轉,引導所有遏制器佯死局面 。按照S弧線的公司是一個攙雜的非線性的指數浮點數演算,須要奢侈洪量的功夫,徑直挪用C談話的庫因變量計劃這一數值大概奢侈幾十上百毫秒 。為領會決S弧線的演算功夫題目,鑒于STM32F103,我沿用了查表法,簡直辦法如次:
1. 將α值設置5,
的取值范疇為-5~5之間 。
2. 在所有加放慢進程中,表白式
在取值范疇-5~5內平均取1024個數值,獲得數值表 。
3. 設置一個unsigned short型有1024個元素的const典型的數組,用來保存數值表 。
4. Const數組保存在里面的flash,數值表共占用2048字節 。
STM32F103RTC6共256K,步調組和樹立參數占用48K,bootloader步調占用了8K,長途晉級空間占用了100K,暫時運用步調只用到40K安排 。
結余60K安排的空間,騰出2K的空間來保存數值表,有空間,即是這么大肆 。
5. 在阻礙步調中,按照總的革新度數以及暫時的革新計數值,計劃
值,再映照到0-1023的數值有的索引值,經過索引獲得數值 。
6. 須要提防的是stm32f103不扶助浮點數的演算,以是對于浮點數的演算,須要折算成乘以一個數再除以另一個數,比方*α,須要變化為*65535/13107 。
底下一段代碼是按照革新的計數值獲得頻次的因變量:
U16 fnMC_GetFreq(U16 n, U16 halftn, U16 alpha, U16 minfreq, U16 maxfreq){//alpha=alpha * 4096 signed int udataA; signed short uiDataA; U16 uiRes; U32 uwData; udataA = (signed int)alpha * (signed int)n; udataA = (signed int)udataA / halftn; if(udataA > 32767){udataA = 32767; } uiDataA = (signed short)alpha - (signed short)udataA; uiDataA = (signed short)4 * 4096 - uiDataA; if(uiDataA < 0){ uiDataA = 0; } uiRes = (U16)uiDataA;uiRes = uiRes / 32;//*1023/8/4096 if(uiRes > 1023){ uiRes = 1023; } udataA = (signed int)(maxfreq - minfreq) * g_mc_uchExp[uiRes]; udataA = udataA / 65535; uiDataA = (signed int)udataA; uiDataA += minfreq; if(uiDataA < 200){ uiDataA = 200; } return(uiDataA); }底下一段代碼是爆發步進電機遏制旗號的PWM周期阻礙步調:
int data; U16 freq; STRMotorRegs *motor; motor = &g_motor_regs[0]; MOTOR_A_CLEARINT(); motor->steps ++; data = https://www.juguize.com/b/(int)MOTOR_A_STEPS_GET(); if(motor->direction == 0) { data = data + 1;} else { data = data - 1; } MOTOR_A_STEPS_SET(data); freq = motor->runfrequency; if(motor->runstate == MOTOR_RUN_STATE_INC){if(motor->runtimer >= motor->starttime){motor->runstate = MOTOR_RUN_STATE_IDLE;}else{freq = fnMC_GetFreq(motor->runtimer, motor->halfstarttime, motor->alpha, motor->startfreq, motor->runfrequency);//U16 n,U16 halftn,U16 alpha,U16 maxfreq,U16 minfreq)}motor->runsnapfreq = freq; }else if(motor->runstate == MOTOR_RUN_STATE_IDLE){if(motor->totalstep

推薦閱讀