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