2004 Microchip Technology Inc.
DS00908A-page 25
AN908
}
// end of display and button polling code
}
// End of Run Motor loop
}
// End of Main loop
// should never get here
while(1){}
}
//---------------------------------------------------------------------
// Executes one PI itteration for each of the three loops Id,Iq,Speed
void DoControl( void )
{
short i;
// Assume ADC channel 0 has raw A/D value in signed fractional form from
// speed pot (AN7).
ReadSignedADC0( &ReadADCParm );
// Set reference speed
if(uGF.bit.ChangeSpeed)
CtrlParm.qVelRef = ReadADCParm.qADValue/8;
else
CtrlParm.qVelRef = ReadADCParm.qADValue/16;
if( uGF.bit.OpenLoop )
{
‘
// OPENLOOP: force rotating angle,Vd,Vq
if( uGF.bit.ChangeMode )
{
// just changed to openloop
uGF.bit.ChangeMode = 0;
// synchronize angles
OpenLoopParm.qAngFlux = CurModelParm.qAngFlux;
// VqRef & VdRef not used
CtrlParm.qVqRef = 0;
CtrlParm.qVdRef = 0;
}
OpenLoopParm.qVelMech = CtrlParm.qVelRef;
// calc rotational angle of rotor flux in 1.15 format
// just for reference & sign needed by CorrectPhase
CurModelParm.qVelMech = EncoderParm.qVelMech;
CurModel();
ParkParm.qVq = 0;
if( OpenLoopParm.qVelMech >= 0 )
i = OpenLoopParm.qVelMech;
else
i = -OpenLoopParm.qVelMech;
uWork = i <<2;
if( uWork > 0x5a82 )
uWork = 0x5a82;
if( uWork < 0x1000 )
uWork = 0x1000;