|
农民讲习所
这是俺一个关于打印机项目中步进马达中的内容,使用的原理为电流矢量图(a),为减少矢量表的误差,改进为(g).(误
差大的时候,Ia和 Ib 的绝对值变大,角度不变,即比例不变)
磁场合成决定步进马达当前的位置。
我们常用的是图(b),用电压驱动时和线圈个数有关系,直接驱动它们,合成的最小角度都是固定的。
细分最常见的是电流细分,电流引起的磁场的合成就决定马达的角度。所以我们一般用电流合成图来代替磁场合成图。
用电流合成电路复杂一点(用 MCU+DA+L298实现也不难)。
这里俺用 PWM方式,用控制电压的方式代替电流。原因:在电压稳定后,线圈的电流和电压成正比。稳定是 PWM细分的
要点,也决定马达速度不能太高。
在细分的情况下,电机分两相和四相是没意义的。可以把四相电机当两相使用。
下面是俺的程序,使用 MEGA16,因为有PWM。
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //2 相步进马达驱动
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- #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{ //细分表结构
- unsigned char mQuadrant; //象限 0-3
- unsigned char mX_Pwm; //x输出的PWM
- unsigned char mY_Pwm; //y输出的PWM
- };
-
- struct Motor2P{
- unsigned char mTableId; //细分表 ID
- unsigned char mTask; //马达驱动的任务转移号
-
- unsigned char mSaveTimer; //马达驱动节电模式使用的计数器
-
- unsigned char mReg; //马达驱动使用的寄存器
- unsigned char mTimer; //对 2MS 的计数器,时间扩展
-
- unsigned int mSteps; //马达要走的步数
- unsigned char mDirect; //马达走动方向
-
- unsigned char mStepRunTimer; //步进时输出有效的时间寄存器
- unsigned char mStepIdleTimer; //步进时输出节电的时间寄存器
- unsigned char mStepCount; //细分表走动步长。1-2-4-8-16
- };
-
- //------------------------------------------------------------
- #ifdef dMotor2P_Main
- #define Motor2P_Head
- #else
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整代码和教程下载:
用PWM-细分步进电机-包含原理和程序.pdf
(157.01 KB, 下载次数: 357)
|
|