//*****************************************************************************************************
//中断服务程序
//*****************************************************************************************************
//第一步初始位置定位,uvw比较简单。不作详细介绍。
interrupt void MainISR(void)
{
_iq t_01,t_02;
IPM_BaoHu(); //保护函数
RS232_CNT=RS232_CNT+5;
Show_time++;
Show_time2++;
if(Show_time2==1000)//1秒显示一次
{
Show_time2=0;
lcd_dis_flag=1;
}
Read_key();
Ad_CaiJi();
JiSuan_Dl();
if(Run_PMSM==1&&IPM_Fault==0)
{
if(LocationFlag!=LocationEnd) //uvw计算公式HallAngle=4*u+2*v+w
{
Modulation=0.95;
if(GpioDataRegs.GPBDAT.bit.GPIOB15)//W
{
HallAngle+=1;
}
if(GpioDataRegs.GPBDAT.bit.GPIOB14)//V
{
HallAngle+=2;
}
if(GpioDataRegs.GPBDAT.bit.GPIOB13)//U
{
HallAngle+=4;
}
switch(HallAngle)
{
case 5:
Position=PositionPhase60;
LocationFlag=LocationEnd;//定位结束
EvaRegs.T2CNT =(EvaRegs.T2PR-BuChang*0-BuChang/2); //跟距uvw的信号大致判断一下转子在哪个区,然后在T2定时器计数值上改到那个区的中间值开始计时,
break;
case 1:
Position=PositionPhase360;
LocationFlag=LocationEnd;//定位结束
EvaRegs.T2CNT =(EvaRegs.T2PR-BuChang*5-BuChang/2);
break;
case 3:
Position=PositionPhase300;
LocationFlag=LocationEnd;//定位结束
EvaRegs.T2CNT =(EvaRegs.T2PR-BuChang*4-BuChang/2);
break;
case 2:
Position=PositionPhase240;
LocationFlag=LocationEnd;//定位结束
EvaRegs.T2CNT =(EvaRegs.T2PR-BuChang*3-BuChang/2);
break;
case 6:
Position=PositionPhase180;
LocationFlag=LocationEnd;//定位结束
EvaRegs.T2CNT =(EvaRegs.T2PR-BuChang*2-BuChang/2);
break;
case 4:
Position=PositionPhase120;
LocationFlag=LocationEnd;//定位结束
EvaRegs.T2CNT =(EvaRegs.T2PR-BuChang*1-BuChang/2);
break;
default:
Run_PMSM=0;//霍尔信号错误启动停止
eva_close();
Hall_Fault=1;
break;
}
}
//这只是为了启动电机,当Z相信号到来,也就是cap3进中断,EvaRegs.T2CNT归零,然后就会得到精确的角度值。
//*******主要分析一下计算电流**********//
void JiSuan_Dl(void) //计算电流 电流采集因为不知道采集电阻阻值所以目前我无法知道一些程序的对错
{
float32 IA,IB,IC;
static Uint16 i=0;
IA=(AD_BUF[0]-HALL_U)*0.4;//放大10倍
IC=(AD_BUF[1]-HALL_W)*0.4;//放大10倍
// IB=_IQtoF(_IQmpy(_IQ(ib),_IQ(E_Ding_DianLiu)))*10;
IB=-IA-IC;
I_AAA=IA*10;
I_BBB=IB*10;
I_CCC=IC*10;
if(IA<0.0)
{IA=-IA;}
// IB=(AD_BUF[1]-HALL_W)*0.4;//放大10倍
if(IB<0.0)
{IB=-IB;}
if(IC<0.0)
{IC=-IC;}
if(IA>IA_MAX)
{
IA_MAX=IA;
}
if(IB>IB_MAX)
{
IB_MAX=IB;
}
if(IC>IC_MAX)
{
IC_MAX=IC;
}
i++;
if(i==400)
{
// I_A=IA/1.414;//有效值
//I_B=IB/1.414;//有效值
I_A= IA_MAX/1.414;//有效值
I_B= IB_MAX/1.414;//有效值
I_C= IC_MAX/1.414;//有效值
I_AA=I_A*10;
I_BB=I_B*10;
I_CC=I_C*10;
i=0;
IB_MAX=0;
IA_MAX=0;
IC_MAX=0;
if((I_A>GuoliuZhi)||(I_C>GuoliuZhi))
{
Pwm_EN_1;
eva_close();//过流保护,停机
O_Current=1;
Run_PMSM=0;
}
else if((I_A>100)||(I_C>100))
{
Pwm_EN_1;
eva_close();//过流保护, 停机
O_Current=1;
Run_PMSM=0;
}
}