⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 128细分.txt

📁 步进电动机细分程序
💻 TXT
字号:
我的步进电机细分的源代码(128细分),已经运转正常,请大家参考

#include <motor.h>
/************************************************************/
//internal  clock,Fosc/6,PCA interrupt enable
//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
     CCAPM0=0x42;      // CEX0(P1.3) 8 bit PWM Model,join B winding
     CCAPM1=0x42;      // CEX1(P1.4) 8 bit PWM Model,join A winding
     CL=0;
     CH=0;
     CR=1;                  // turn the PCA counter on
}
/************************************************************/
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;
     }
     CCAP0L=0;
     CCAP0H=255-pSubdivideTable->mB_PWM;
     CCAP1L=0;                                                      //CL<CCAPxL  PWMx=0
     CCAP1H=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;
     }
}
/************************************************************/

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -