/*
1 L6219的介绍及电路设计
1.1 L6219的性能介绍
L6219是一个有两极的集成电路,它能控制和驱动具有两极步进电机的绕组,
还可以双向控制两个直流电机。L6219可以非常方便地与微处理器连接成控制步进电机的系统,
其电压范围可以从10V~46V,输出的电流可达到750mA,峰值电流高达1A。因为内部具有保护二极管及PWM电流控制,
所以在可靠性和稳定性方面提供了保障。
1.2 L6219电路的具体实现:
1.3 L6219的电路说明
L6219是一个24脚的芯片,功能说明如下:
1.3.1 PCA(Programmable Counter Array)的简介
P89V51RD内部含有一个PCA模块,输出复用P1口的P1.3、P1.4、P1.5、P1.6、P1.7。
PCA有上升下降沿捕捉、定时、高速输出、看门狗、PWM输出5个工作模式,
通过编程控制P1.3——P1.7工作于任意模式。这里只对8位PWM输出模式做详细介绍,其他工作模式可参考相关资料。
1.3.2 PWM相关寄存器的介绍
PCA有一些相关的控制寄存器:计数模式寄存器(CMOD)、计数控制寄存器(CCON)PCA定时器(CH、CL)、
工作模式寄存器(CCAPMn,其中n对应为:0、1、2、3、4)可对这些寄存器编程来控制PWM的输出。
CMOD:计数模式寄存器
CIDL WDTE —— —— —— CPS1 CPS0 ECF
CCON:计数控制寄存器
CF CR —— CCF4 CCF3 CCF2 CCF1 CCF0
CCAPMn:工作模式寄存器
—— ECOMn CAPPn CAPNn MATn TOGn PWMn
3细分技术的实现
单片机实现时将0~360℃作细分,一个步距角度是1.8℃,首先根据矢量合成图建立相应的向量表,
程序再根据向量表运行控制马达的旋转,可以是步距的1、2、4、8、16、……2n的倍数。
程序的具体实现如下:
*/ #define CMOD 0XD9 #define CCAP0G 0XFA #define CCAP1G 0XFB #define CCAP2G 0XFC #define CCAP3G 0XFD #define CCAP4G 0XFE #define CCAP5G 0XFF #define CCAP0L 0XEA #define CCAP1L 0XEB #define CCAO2L 0XEC #define CCAP3L 0XED #define CCAP4L 0XEE #define CCAP5L 0XEF // IPH EQU 0B7H #define CH 0XF9//H #define CL 0XE9//H #define CCON 0D8H // CCF0 EQU CCON.0 // CCF1 EQU CCON.1 // CCF2 EQU CCON.2 // CCF3 EQU CCON.3 // CCF4 EQU CCON.4 // CCF5 EQU CCON.5 sbit CR =0XD8^6 // CF EQU CCON.7 #define PWM0enable(); CCAPM0|=0x42; //配置P1.3引脚为PWM输出 #define PWM1enable(); CCAPM1|=0x42; //配置P1.4引脚为PWM输出 #define PWM2enable(); CCAPM2|=0x42; //配置P1.5引脚为PWM输出 #define PWM3enable(); CCAPM3|=0x42; //配置P1.6引脚为PWM输出 #define PWM4enable(); CCAPM4|=0x42; //配置P1.7引脚为PWM输出 #define PWM0disable(); CCAPM0&=0xBD; //停止P1.3引脚输出PWM #define PWM1disable(); CCAPM1&=0xBD; //停止P1.4引脚输出PWM #define PWM2disable(); CCAPM2&=0xBD; //停止P1.5引脚输出PWM #define PWM3disable(); CCAPM3&=0xBD; //停止P1.6引脚输出PWM #define PWM4disable(); CCAPM4&=0xBD; //停止P1.7引脚输出PWM #define MotorIdel 0x00 //电机空闲模式 #define MotorPowerOn 0x01 //电机上电 #define MotorNormalState 0x02 //电机正常运转 #define MotorPowerOff 0x03 //电机掉电 //定义细分表结构 typedef struct tagSubdivideTable{ unsigned char mQuardrant; //象限0-3 unsigned char mA_PWM; //A相输出的PWM unsigned char mB_PWM; //B相输出的PWM }SubdivideTable; typedef struct tagWorkInformation{ unsigned int SubdivideTableID; //细分表ID unsigned char MotorDirect; //马达旋转方向 unsigned char SubdivideNumber; //细分倍数,这里的细分倍数就是访问细分表 //的步长,如果选用128倍细分,那么//SubdivideNumber=1,选用64倍细分,//SubdivideNumber=2 unsigned int MotorSteps; //马达旋转总的步距,一个步距角1.8度 unsigned char WorkState; //马达工作状态 unsigned char MaxStep; //马达一个脉冲走过的最大步距,对应细分表//的间隔取值是:1、2、4、8、16...2的倍数 }WorkInformation; sbit PhaseA = 0X90^4 sbit PhaseB = 0X90^5 #define Quardrant0 1 //+iA,+iB 第一象限 #define Quardrant1 2 //-iA,+iB 第二象限 #define Quardrant2 3 //-iA,-iB 第三象限 #define Quardrant3 4 //+iA,-iB 第四象限 WorkInformation MotorWorking; //细分表 //0-360度的细分,128倍细分表,iA=255*cos(a),iB=255*sin(a) SubdivideTable code MotorSubdividedTab[]={ //第一象限, +iA, +iB Quardrant3, 255, 0, Quardrant0, 255, 3, Quardrant0, 255, 6, Quardrant0, 255, 9, Quardrant0, 255, 13, Quardrant0, 255, 16, Quardrant0, 254, 19, Quardrant0, 254, 22, Quardrant0, 254, 25, Quardrant0, 253, 28, Quardrant0, 253, 31, Quardrant0, 253, 34, Quardrant0, 252, 37, Quardrant0, 252, 41, Quardrant0, 251, 44, Quardrant0, 251, 47, Quardrant0, 250, 50, Quardrant0, 249, 53, Quardrant0, 249, 56, Quardrant0, 248, 59, Quardrant0, 247, 62, Quardrant0, 247, 65, Quardrant0, 246, 68, Quardrant0, 245, 71, Quardrant0, 244, 74, Quardrant0, 243, 77, Quardrant0, 242, 80, Quardrant0, 241, 83, Quardrant0, 240, 86, Quardrant0, 239, 89, Quardrant0, 238, 92, Quardrant0, 237, 95, Quardrant0, 236, 98, Quardrant0, 234, 100, Quardrant0, 233, 103, Quardrant0, 232, 106, Quardrant0, 231, 109, Quardrant0, 229, 112, Quardrant0, 228, 115, Quardrant0, 226, 117, Quardrant0, 225, 120, Quardrant0, 223, 123, Quardrant0, 222, 126, Quardrant0, 220, 128, Quardrant0, 219, 131, Quardrant0, 217, 134, Quardrant0, 215, 136, Quardrant0, 214, 139, Quardrant0, 212, 142, Quardrant0, 210, 144, Quardrant0, 208, 147, Quardrant0, 207, 149, Quardrant0, 205, 152, Quardrant0, 203, 154, Quardrant0, 201, 157, Quardrant0, 199, 159, Quardrant0, 197, 162, Quardrant0, 195, 164, Quardrant0, 193, 167, Quardrant0, 191, 169, Quardrant0, 189, 171, Quardrant0, 187, 174, Quardrant0, 185, 176, Quardrant0, 183, 178, Quardrant0, 180, 180, Quardrant0, 178, 183, Quardrant0, 176, 185, Quardrant0, 174, 187, Quardrant0, 171, 189, Quardrant0, 169, 191, Quardrant0, 167, 193, Quardrant0, 164, 195, Quardrant0, 162, 197, Quardrant0, 159, 199, Quardrant0, 157, 201, Quardrant0, 154, 203, Quardrant0, 152, 205, Quardrant0, 149, 207, Quardrant0, 147, 208, Quardrant0, 144, 210, Quardrant0, 142, 212, Quardrant0, 139, 214, Quardrant0, 136, 215, Quardrant0, 134, 217, Quardrant0, 131, 219, Quardrant0, 128, 220, Quardrant0, 126, 222, Quardrant0, 123, 223, Quardrant0, 120, 225, Quardrant0, 117, 226, Quardrant0, 115, 228, Quardrant0, 112, 229, Quardrant0, 109, 231, Quardrant0, 106, 232, Quardrant0, 103, 233, Quardrant0, 100, 234, Quardrant0, 98, 236, Quardrant0, 95, 237, Quardrant0, 92, 238, Quardrant0, 89, 239, Quardrant0, 86, 240, Quardrant0, 83, 241, Quardrant0, 80, 242, Quardrant0, 77, 243, Quardrant0, 74, 244, Quardrant0, 71, 245, Quardrant0, 68, 246, Quardrant0, 65, 247, Quardrant0, 62, 247, Quardrant0, 59, 248, Quardrant0, 56, 249, Quardrant0, 53, 249, Quardrant0, 50, 250, Quardrant0, 47, 251, Quardrant0, 44, 251, Quardrant0, 41, 252, Quardrant0, 37, 252, Quardrant0, 34, 253, Quardrant0, 31, 253, Quardrant0, 28, 253, Quardrant0, 25, 254, Quardrant0, 22, 254, Quardrant0, 19, 254, Quardrant0, 16, 255, Quardrant0, 13, 255, Quardrant0, 9, 255, Quardrant0, 6, 255, Quardrant0, 3, 255, //第二象限 -iA, +iB Quardrant0, 0, 255, Quardrant1, 3, 255, Quardrant1, 6, 255, Quardrant1, 9, 255, Quardrant1, 13, 255, Quardrant1, 16, 255, Quardrant1, 19, 254, Quardrant1, 22, 254, Quardrant1, 25, 254, Quardrant1, 28, 253, Quardrant1, 31, 253, Quardrant1, 34, 253, Quardrant1, 37, 252, Quardrant1, 41, 252, Quardrant1, 44, 251, Quardrant1, 47, 251, Quardrant1, 50, 250, Quardrant1, 53, 249, Quardrant1, 56, 249, Quardrant1, 59, 248, Quardrant1, 62, 247, Quardrant1, 65, 247, Quardrant1, 68, 246, Quardrant1, 71, 245, Quardrant1, 74, 244, Quardrant1, 77, 243, Quardrant1, 80, 242, Quardrant1, 83, 241, Quardrant1, 86, 240, Quardrant1, 89, 239, Quardrant1, 92, 238, Quardrant1, 95, 237, Quardrant1, 98, 236, Quardrant1, 100, 234, Quardrant1, 103, 233, Quardrant1, 106, 232, Quardrant1, 109, 231, Quardrant1, 112, 229, Quardrant1, 115, 228, Quardrant1, 117, 226, Quardrant1, 120, 225, Quardrant1, 123, 223, Quardrant1, 126, 222, Quardrant1, 128, 220, Quardrant1, 131, 219, Quardrant1, 134, 217, Quardrant1, 136, 215, Quardrant1, 139, 214, Quardrant1, 142, 212, Quardrant1, 144, 210, Quardrant1, 147, 208, Quardrant1, 149, 207, Quardrant1, 152, 205, Quardrant1, 154, 203, Quardrant1, 157, 201, Quardrant1, 159, 199, Quardrant1, 162, 197, Quardrant1, 164, 195, Quardrant1, 167, 193, Quardrant1, 169, 191, Quardrant1, 171, 189, Quardrant1, 174, 187, Quardrant1, 176, 185, Quardrant1, 178, 183, Quardrant1, 180, 180, Quardrant1, 183, 178, Quardrant1, 185, 176, Quardrant1, 187, 174, Quardrant1, 189, 171, Quardrant1, 191, 169, Quardrant1, 193, 167, Quardrant1, 195, 164, Quardrant1, 197, 162, Quardrant1, 199, 159, Quardrant1, 201, 157, Quardrant1, 203, 154, Quardrant1, 205, 152, Quardrant1, 207, 149, Quardrant1, 208, 147, Quardrant1, 210, 144, Quardrant1, 212, 142, Quardrant1, 214, 139, Quardrant1, 215, 136, Quardrant1, 217, 134, Quardrant1, 219, 131, Quardrant1, 220, 128, Quardrant1, 222, 126, Quardrant1, 223, 123, Quardrant1, 225, 120, Quardrant1, 226, 117, Quardrant1, 228, 115, Quardrant1, 229, 112, Quardrant1, 231, 109, Quardrant1, 232, 106, Quardrant1, 233, 103, Quardrant1, 234, 100, Quardrant1, 236, 98, Quardrant1, 237, 95, Quardrant1, 238, 92, Quardrant1, 239, 89, Quardrant1, 240, 86, Quardrant1, 241, 83, Quardrant1, 242, 80, Quardrant1, 243, 77, Quardrant1, 244, 74, Quardrant1, 245, 71, Quardrant1, 246, 68, Quardrant1, 247, 65, Quardrant1, 247, 62, Quardrant1, 248, 59, Quardrant1, 249, 56, Quardrant1, 249, 53, Quardrant1, 250, 50, Quardrant1, 251, 47, Quardrant1, 251, 44, Quardrant1, 252, 41, Quardrant1, 252, 37, Quardrant1, 253, 34, Quardrant1, 253, 31, Quardrant1, 253, 28, Quardrant1, 254, 25, Quardrant1, 254, 22, Quardrant1, 254, 19, Quardrant1, 255, 16, Quardrant1, 255, 13, Quardrant1, 255, 9, Quardrant1, 255, 6, Quardrant1, 255, 3, //第三象限 -iA, -iB Quardrant1, 255, 0, Quardrant2, 255, 3, Quardrant2, 255, 6, Quardrant2, 255, 9, Quardrant2, 255, 13, Quardrant2, 255, 16, Quardrant2, 254, 19, Quardrant2, 254, 22, Quardrant2, 254, 25, Quardrant2, 253, 28, Quardrant2, 253, 31, Quardrant2, 253, 34, Quardrant2, 252, 37, Quardrant2, 252, 41, Quardrant2, 251, 44, Quardrant2, 251, 47, Quardrant2, 250, 50, Quardrant2, 249, 53, Quardrant2, 249, 56, Quardrant2, 248, 59, Quardrant2, 247, 62, Quardrant2, 247, 65, Quardrant2, 246, 68, Quardrant2, 245, 71, Quardrant2, 244, 74, Quardrant2, 243, 77, Quardrant2, 242, 80, Quardrant2, 241, 83, Quardrant2, 240, 86, Quardrant2, 239, 89, Quardrant2, 238, 92, Quardrant2, 237, 95, Quardrant2, 236, 98, Quardrant2, 234, 100, Quardrant2, 233, 103, Quardrant2, 232, 106, Quardrant2, 231, 109, Quardrant2, 229, 112, Quardrant2, 228, 115, Quardrant2, 226, 117, Quardrant2, 225, 120, Quardrant2, 223, 123, Quardrant2, 222, 126, Quardrant2, 220, 128, Quardrant2, 219, 131, Quardrant2, 217, 134, Quardrant2, 215, 136, Quardrant2, 214, 139, Quardrant2, 212, 142, Quardrant2, 210, 144, Quardrant2, 208, 147, Quardrant2, 207, 149, Quardrant2, 205, 152, Quardrant2, 203, 154, Quardrant2, 201, 157, Quardrant2, 199, 159, Quardrant2, 197, 162, Quardrant2, 195, 164, Quardrant2, 193, 167, Quardrant2, 191, 169, Quardrant2, 189, 171, Quardrant2, 187, 174, Quardrant2, 185, 176, Quardrant2, 183, 178, Quardrant2, 180, 180, Quardrant2, 178, 183, Quardrant2, 176, 185, Quardrant2, 174, 187, Quardrant2, 171, 189, Quardrant2, 169, 191, Quardrant2, 167, 193, Quardrant2, 164, 195, Quardrant2, 162, 197, Quardrant2, 159, 199, Quardrant2, 157, 201, Quardrant2, 154, 203, Quardrant2, 152, 205, Quardrant2, 149, 207, Quardrant2, 147, 208, Quardrant2, 144, 210, Quardrant2, 142, 212, Quardrant2, 139, 214, Quardrant2, 136, 215, Quardrant2, 134, 217, Quardrant2, 131, 219, Quardrant2, 128, 220, Quardrant2, 126, 222, Quardrant2, 123, 223, Quardrant2, 120, 225, Quardrant2, 117, 226, Quardrant2, 115, 228, Quardrant2, 112, 229, Quardrant2, 109, 231, Quardrant2, 106, 232, Quardrant2, 103, 233, Quardrant2, 100, 234, Quardrant2, 98, 236, Quardrant2, 95, 237, Quardrant2, 92, 238, Quardrant2, 89, 239, Quardrant2, 86, 240, Quardrant2, 83, 241, Quardrant2, 80, 242, Quardrant2, 77, 243, Quardrant2, 74, 244, Quardrant2, 71, 245, Quardrant2, 68, 246, Quardrant2, 65, 247, Quardrant2, 62, 247, Quardrant2, 59, 248, Quardrant2, 56, 249, Quardrant2, 53, 249, Quardrant2, 50, 250, Quardrant2, 47, 251, Quardrant2, 44, 251, Quardrant2, 41, 252, Quardrant2, 37, 252, Quardrant2, 34, 253, Quardrant2, 31, 253, Quardrant2, 28, 253, Quardrant2, 25, 254, Quardrant2, 22, 254, Quardrant2, 19, 254, Quardrant2, 16, 255, Quardrant2, 13, 255, Quardrant2, 9, 255, Quardrant2, 6, 255, Quardrant2, 3, 255, //第四象限 +iA, -iB Quardrant2, 0, 255, Quardrant3, 3, 255, Quardrant3, 6, 255, Quardrant3, 9, 255, Quardrant3, 13, 255, Quardrant3, 16, 255, Quardrant3, 19, 254, Quardrant3, 22, 254, Quardrant3, 25, 254, Quardrant3, 28, 253, Quardrant3, 31, 253, Quardrant3, 34, 253, Quardrant3, 37, 252, Quardrant3, 41, 252, Quardrant3, 44, 251, Quardrant3, 47, 251, Quardrant3, 50, 250, Quardrant3, 53, 249, Quardrant3, 56, 249, Quardrant3, 59, 248, Quardrant3, 62, 247, Quardrant3, 65, 247, Quardrant3, 68, 246, Quardrant3, 71, 245, Quardrant3, 74, 244, Quardrant3, 77, 243, Quardrant3, 80, 242, Quardrant3, 83, 241, Quardrant3, 86, 240, Quardrant3, 89, 239, Quardrant3, 92, 238, Quardrant3, 95, 237, Quardrant3, 98, 236, Quardrant3, 100, 234, Quardrant3, 103, 233, Quardrant3, 106, 232, Quardrant3, 109, 231, Quardrant3, 112, 229, Quardrant3, 115, 228, Quardrant3, 117, 226, Quardrant3, 120, 225, Quardrant3, 123, 223, Quardrant3, 126, 222, Quardrant3, 128, 220, Quardrant3, 131, 219, Quardrant3, 134, 217, Quardrant3, 136, 215, Quardrant3, 139, 214, Quardrant3, 142, 212, Quardrant3, 144, 210, Quardrant3, 147, 208, Quardrant3, 149, 207, Quardrant3, 152, 205, Quardrant3, 154, 203, Quardrant3, 157, 201, Quardrant3, 159, 199, Quardrant3, 162, 197, Quardrant3, 164, 195, Quardrant3, 167, 193, Quardrant3, 169, 191, Quardrant3, 171, 189, Quardrant3, 174, 187, Quardrant3, 176, 185, Quardrant3, 178, 183, Quardrant3, 180, 180, Quardrant3, 183, 178, Quardrant3, 185, 176, Quardrant3, 187, 174, Quardrant3, 189, 171, Quardrant3, 191, 169, Quardrant3, 193, 167, Quardrant3, 195, 164, Quardrant3, 197, 162, Quardrant3, 199, 159, Quardrant3, 201, 157, Quardrant3, 203, 154, Quardrant3, 205, 152, Quardrant3, 207, 149, Quardrant3, 208, 147, Quardrant3, 210, 144, Quardrant3, 212, 142, Quardrant3, 214, 139, Quardrant3, 215, 136, Quardrant3, 217, 134, Quardrant3, 219, 131, Quardrant3, 220, 128, Quardrant3, 222, 126, Quardrant3, 223, 123, Quardrant3, 225, 120, Quardrant3, 226, 117, Quardrant3, 228, 115, Quardrant3, 229, 112, Quardrant3, 231, 109, Quardrant3, 232, 106, Quardrant3, 233, 103, Quardrant3, 234, 100, Quardrant3, 236, 98, Quardrant3, 237, 95, Quardrant3, 238, 92, Quardrant3, 239, 89, Quardrant3, 240, 86, Quardrant3, 241, 83, Quardrant3, 242, 80, Quardrant3, 243, 77, Quardrant3, 244, 74, Quardrant3, 245, 71, Quardrant3, 246, 68, Quardrant3, 247, 65, Quardrant3, 247, 62, Quardrant3, 248, 59, Quardrant3, 249, 56, Quardrant3, 249, 53, Quardrant3, 250, 50, Quardrant3, 251, 47, Quardrant3, 251, 44, Quardrant3, 252, 41, Quardrant3, 252, 37, Quardrant3, 253, 34, Quardrant3, 253, 31, Quardrant3, 253, 28, Quardrant3, 254, 25, Quardrant3, 254, 22, Quardrant3, 254, 19, Quardrant3, 255, 16, Quardrant3, 255, 13, Quardrant3, 255, 9, Quardrant3, 255, 6, Quardrant3, 255, 3, }; //internal clock,Fosc/6,PCA interrupt disable //system oscillator frequency 12M, 1/6 * 12M=0.5us /************************************************************/ void ConfigPWM() { //CIDL WDTE CPS1 CPS0 ECF CMOD=0x02; // 0 0 0 0 0 0 1 0 CL=0; CH=0; PWM3enable(); // CEX0(P1.3) 8 bit PWM Model,join B winding PWM4enable(); // CEX1(P1.4) 8 bit PWM Model,join A winding CR=1; // turn the PCA counter on } /************************************************************/ //马达一个脉冲走过的最大步距,对应细分表的间隔 //取值是:1、2、4、8、16...2的倍数 /************************************************************/ void SetMaxStep(unsigned char Steps) { MotorWorking.MaxStep=Steps; } /************************************************************/ //马达走动一步 //参数:Direct=1,0-->3象限逆时针走细分表 // /************************************************************/ void MotorRunOneStep(unsigned char Direct) { if(Direct) { //逆时针走细分表 //下一细分表ID等于当前细分表ID加细分倍数 MotorWorking.SubdivideTableID+=MotorWorking.SubdivideNumber; if(MotorWorking.SubdivideTableID%128==0) MotorWorking.MotorSteps-=1; //细分表走完128小步,马达旋转1.8度,走了1步 if(MotorWorking.SubdivideTableID>=512) //细分表走完归零 MotorWorking.SubdivideTableID=0; } else { //顺时针走细分表 if(MotorWorking.SubdivideTableID==0) //下一步细分表ID等于当前细分表ID减细分倍数 MotorWorking.SubdivideTableID=512-MotorWorking.SubdivideNumber; else MotorWorking.SubdivideTableID-=MotorWorking.SubdivideNumber; if(MotorWorking.SubdivideTableID%128==0) MotorWorking.MotorSteps-=1; //细分表走完128小步,马达旋转1.8度,走了1步 } } /************************************************************/ //马达根据细分ID输出电流 /************************************************************/ void MotorGetEnergy(unsigned int SubdivideID) { SubdivideTable *pSubdivideTable; pSubdivideTable=&(MotorSubdividedTab+SubdivideID); switch(pSubdivideTable->mQuardrant) { case 1: //+iA,+iB PhaseA=1; PhaseB=1; break; case 2: //-iA,+iB PhaseA=0; PhaseB=1; break; case 3: //-iA,-iB PhaseA=0; PhaseB=0; break; case 4: //+iA,-iB PhaseA=1; PhaseB=0; break; default: break; } CCAP3L=0; CCAP3G=255-pSubdivideTable->mB_PWM; CCAP4L=0; //CL<CCAPxL PWMx=0 CCAP4G=255-pSubdivideTable->mA_PWM; //CL>=CCAPxL PWMx=1 } /************************************************************/ void MotorRun(unsigned char Direct,unsigned int Steps) { unsigned int StepCount; unsigned char Subdivide=1; switch(MotorWorking.WorkState) { case MotorIdel: MotorWorking.MotorDirect=Direct; MotorWorking.MotorSteps=Steps; MotorWorking.SubdivideNumber=1; //马达128倍细分 MotorWorking.WorkState=MotorPowerOn; case MotorPowerOn: //马达旋转步距角比较小时,在上电过程中完成,速度不上到正常旋转中 while(Subdivide<MotorWorking.MaxStep) { StepCount=65; //马达走64个小步,速度上一个台阶 while(--StepCount) { MotorRunOneStep(MotorWorking.MotorDirect); MotorGetEnergy(MotorWorking.SubdivideTableID); } Subdivide<<=1; MotorWorking.SubdivideNumber=Subdivide; }//当马达速度达到最大速度时进入正常运转状态 MotorWorking.WorkState=MotorNormalState; case MotorNormalState: StepCount=MotorWorking.MotorSteps; //这里的StepCount保存的是马达还有多少个步距角 while(StepCount>4) //马达最后一圈进入减速状态 { MotorRunOneStep(MotorWorking.MotorDirect); MotorGetEnergy(MotorWorking.SubdivideTableID); StepCount=MotorWorking.MotorSteps; } MotorWorking.WorkState=MotorPowerOff; case MotorPowerOff: StepCount=MotorWorking.MotorSteps; if(MotorWorking.MotorSteps==4) { Subdivide=MotorWorking.MaxStep>>1; while(Subdivide) { StepCount=65; //马达走64个小步,速度上一个台阶 while(--StepCount) { MotorRunOneStep(MotorWorking.MotorDirect); MotorGetEnergy(MotorWorking.SubdivideTableID); } Subdivide>>=1; MotorWorking.SubdivideNumber=Subdivide; } //当马达速度达到最大速度时进入正常运转状态 } MotorWorking.WorkState=MotorIdel; break; default: break; } }