📄 a_dc.c
字号:
{
pos_change++;
if(pos_change>5)
pos_change=10;
}
//--------------- 电流采样PID调节部分结束 -------------------------
// data_save_dram(); //数据保存至双口RAM中
// led_shine(); //闪灯子程序,作测试用!!!
// current_uref=50; //开环,用做试验用
/* 速度闭环测试用*/
if(direction_flag==0) current_uref =1000-current_uref;
else if(direction_flag==1) current_uref = 1000+current_uref;
*MCRA=*MCRA&0xffc7;
Motor_position=*PADATDIR&0x0038;
Motor_position=Motor_position>>3;
*MCRA=*MCRA|0x0038;
sequence();
*EVAIFRA = 0X0080; //清中断标志,以进行下次中断
}
asm( " clrc INTM");
return;
}
//============================================
sequence()
{
switch(Motor_position)
{
case 1:
if(direction_flag==0)
{
*ACTRA = 0xdf3; //2,5
*CMPR3 = current_uref;
*CMPR1 = 0;
*CMPR2 = 0;
}
else
{
*ACTRA = 0x3fd;
*CMPR1 = current_uref;
*CMPR2 = 0;
*CMPR3 = 0;
}
break;
case 2:
if(direction_flag==0)
{
*ACTRA = 0xf3d; //1,4
*CMPR1 = current_uref;
*CMPR2 = 0;
*CMPR3 = 0;
}
else
{
*ACTRA = 0xfd3;
*CMPR2 = current_uref;
*CMPR1 = 0;
*CMPR3 = 0;
}
break;
case 3:
if(direction_flag==0)
{
*ACTRA = 0xd3f; //4,5
*CMPR3 = current_uref;
*CMPR1 = 0;
*CMPR2 = 0;
}
else
{
*ACTRA = 0x3df;
*CMPR2 = current_uref;
*CMPR1 = 0;
*CMPR3 = 0;
}
break;
case 4:
if(direction_flag==0)
{
*ACTRA = 0x3df; //3,6
*CMPR2 = current_uref;
*CMPR1 = 0;
*CMPR3 = 0;
}
else
{
*ACTRA = 0xd3f;
*CMPR3 = current_uref;
*CMPR1 = 0;
*CMPR2 = 0;
}
break;
case 5:
if(direction_flag==0)
{
*ACTRA = 0xfd3; //2,3
*CMPR2 = current_uref;
*CMPR1 = 0;
*CMPR3 = 0;
}
else
{
*ACTRA = 0xf3d;
*CMPR1 = current_uref;
*CMPR2 = 0;
*CMPR3 = 0;
}
break;
case 6:
if(direction_flag==0)
{
*ACTRA = 0x3fd; //1,6
*CMPR1 = current_uref;
*CMPR2 = 0;
*CMPR3 = 0;
}
else
{
*ACTRA = 0xdf3;
*CMPR3 = current_uref;
*CMPR1 = 0;
*CMPR2 = 0;
}
break;
default:
{
*ACTRA=0x0fff;
break;
}
}
}
/*
//============================================
//采用了PWM_ON调制策略
//============================================
sequence()
{
switch(Motor_position)
{
case 1:
{
if(direction_flag==0) //6-pwm 1/6
{
*ACTRA=0x07fc;
*CMPR3=current_uref;
}
else
{
*ACTRA=0x0cf7;
*CMPR1=current_uref; //2-pwm 2/5
}
break;
}
case 2:
{
if(direction_flag==0) //2-pwm 2/3
{
*ACTRA=0x0fc7;
*CMPR1=current_uref;
}
else
{
*ACTRA=0x0f7c;
*CMPR2=current_uref; //4-pwm 1/4
}
break;
}
case 3:
{
if(direction_flag==0) //3-pwm 3/6
{
*ACTRA=0x03df;
*CMPR2=current_uref;
}
else
{
*ACTRA=0x0d3f;
*CMPR3=current_uref; //5-pwm 4/5
}
break;
}
case 4:
{
if(direction_flag==0) //4-pwm 4/5
{
*ACTRA=0x0c7f;
*CMPR2=current_uref;
}
else
{
*ACTRA=0x07cf;
*CMPR3=current_uref; //6-pwm 3/6
}
break;
}
case 5:
{
if(direction_flag==0) //1-pwm 1/4
{
*ACTRA=0x0f3d;
*CMPR1=current_uref;
}
else
{
*ACTRA=0x0fd3;
*CMPR2=current_uref; //3-pwm 2/3
}
break;
}
case 6:
{
if(direction_flag==0) //5-pwm 2/5
{
*ACTRA=0x0df3;
*CMPR3=current_uref;
}
else
{
*ACTRA=0x03fd;
*CMPR1=current_uref; //1-pwm 1/6
}
break;
}
default:
{
*ACTRA=0x0fff;
break;
}
}
}
*/
//===================================================
//霍尔元件捕获中断
//===================================================
void interrupt capint()
{
int temp=0,temp_2=0;
temp=*PIVR;
pos_change=0;
switch(temp)
{
case 0x33:
*EVAIFRC=*EVAIFRC;
temp_2=*CAP1FBOT;
*T2CNT=0;
if(temp_2>11)
{
*MCRA=*MCRA&0xffc7;
Motor_position=*PADATDIR&0x0038;
Motor_position=Motor_position>>3;
*MCRA=*MCRA|0x0038;
sequence();
}
*CAPFIFOA=0x1500;
break;
case 0x34:
*EVAIFRC=*EVAIFRC;
temp_2=*CAP2FBOT;
*T2CNT=0;
if(temp_2>11)
{
*MCRA=*MCRA&0xffc7;
Motor_position=*PADATDIR&0x0038;
Motor_position=Motor_position>>3;
*MCRA=*MCRA|0x0038;
sequence();
}
*CAPFIFOA=0x1500;
break;
case 0x35:
*EVAIFRC=*EVAIFRC;
temp_2=*CAP3FBOT;
*T2CNT=0;
if(temp_2>11)
{
*MCRA=*MCRA&0xffc7;
Motor_position=*PADATDIR&0x0038;
Motor_position=Motor_position>>3;
*MCRA=*MCRA|0x0038;
sequence();
}
*CAPFIFOA=0x1500;
break;
default:break;
asm( " clrc INTM");
return;
}
}
/*=================================================================== */
/* 空中断子程序 */
void interrupt nothing()
{
enable();
return;
}
/* ==================================================================== */
/* 闪灯子程序,测试用!!!! */
void led_shine()
{
nor_flag = ~nor_flag;
if (nor_flag)
{
asm( " clrc xf");
delay(100);
}
else
{
asm( " setc xf");
delay(100);
}
}
/* ==================================================================== */
/* 延时子程序,测试用!!!!! */
void delay (unsigned int ms)
{
WORD i,j,k;
KICK_DOG;
for (i=0;i<=ms;i++)
{
for(j=0;j<200;j++)
{
k++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -