|
農(nóng)民講習(xí)所
這是俺一個(gè)關(guān)于打印機(jī)項(xiàng)目中步進(jìn)馬達(dá)中的內(nèi)容,使用的原理為電流矢量圖(a),為減少矢量表的誤差,改進(jìn)為(g).(誤
差大的時(shí)候,Ia和 Ib 的絕對(duì)值變大,角度不變,即比例不變)
磁場(chǎng)合成決定步進(jìn)馬達(dá)當(dāng)前的位置。
我們常用的是圖(b),用電壓驅(qū)動(dòng)時(shí)和線圈個(gè)數(shù)有關(guān)系,直接驅(qū)動(dòng)它們,合成的最小角度都是固定的。
細(xì)分最常見的是電流細(xì)分,電流引起的磁場(chǎng)的合成就決定馬達(dá)的角度。所以我們一般用電流合成圖來(lái)代替磁場(chǎng)合成圖。
用電流合成電路復(fù)雜一點(diǎn)(用 MCU+DA+L298實(shí)現(xiàn)也不難)。
這里俺用 PWM方式,用控制電壓的方式代替電流。原因:在電壓穩(wěn)定后,線圈的電流和電壓成正比。穩(wěn)定是 PWM細(xì)分的
要點(diǎn),也決定馬達(dá)速度不能太高。
在細(xì)分的情況下,電機(jī)分兩相和四相是沒(méi)意義的。可以把四相電機(jī)當(dāng)兩相使用。
下面是俺的程序,使用 MEGA16,因?yàn)橛蠵WM。
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //2 相步進(jìn)馬達(dá)驅(qū)動(dòng)
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- #define Step_OutMode() DDRB|=BIT(6)|BIT(7)
- #define Step_InMode() DDRB&=~(BIT(6)|BIT(7))
- #define Step_ReadIO() (PORTB&( ~(BIT(6)|BIT(7)) ))
- #define Step_WriteIO(x) PORTB=x
-
- struct Motor2P_Table{ //細(xì)分表結(jié)構(gòu)
- unsigned char mQuadrant; //象限 0-3
- unsigned char mX_Pwm; //x輸出的PWM
- unsigned char mY_Pwm; //y輸出的PWM
- };
-
- struct Motor2P{
- unsigned char mTableId; //細(xì)分表 ID
- unsigned char mTask; //馬達(dá)驅(qū)動(dòng)的任務(wù)轉(zhuǎn)移號(hào)
-
- unsigned char mSaveTimer; //馬達(dá)驅(qū)動(dòng)節(jié)電模式使用的計(jì)數(shù)器
-
- unsigned char mReg; //馬達(dá)驅(qū)動(dòng)使用的寄存器
- unsigned char mTimer; //對(duì) 2MS 的計(jì)數(shù)器,時(shí)間擴(kuò)展
-
- unsigned int mSteps; //馬達(dá)要走的步數(shù)
- unsigned char mDirect; //馬達(dá)走動(dòng)方向
-
- unsigned char mStepRunTimer; //步進(jìn)時(shí)輸出有效的時(shí)間寄存器
- unsigned char mStepIdleTimer; //步進(jìn)時(shí)輸出節(jié)電的時(shí)間寄存器
- unsigned char mStepCount; //細(xì)分表走動(dòng)步長(zhǎng)。1-2-4-8-16
- };
-
- //------------------------------------------------------------
- #ifdef dMotor2P_Main
- #define Motor2P_Head
- #else
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
完整代碼和教程下載:
用PWM-細(xì)分步進(jìn)電機(jī)-包含原理和程序.pdf
(157.01 KB, 下載次數(shù): 357)
2017-4-29 12:30 上傳
點(diǎn)擊文件名下載附件
|
|