📄 128细分.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 + -