// 根据编码器累计计数值来计算转速 CalcVel();
// 执行转速控制环
PIParmQref.qInMeas = EncoderParm.qVelMech; PIParmQref.qInRef = CtrlParm.qVelRef; CalcPI(&PIParmQref);
CtrlParm.qVqRef = PIParmQref.qOut; }
#endif
// Q的 PI控制
PIParmQ.qInMeas = ParkParm.qIq; PIParmQ.qInRef = CtrlParm.qVqRef; CalcPI(&PIParmQ);
ParkParm.qVq = PIParmQ.qOut;
// D的 PI控制
PIParmD.qInMeas = ParkParm.qId; PIParmD.qInRef = CtrlParm.qVdRef; CalcPI(&PIParmD);
ParkParm.qVd = PIParmD.qOut; } }
//--------------------------------------------------------------------// ADC中断服务程序执行速度计算以及电压矢量更新循环。 // ADC采样和转换由 PWM周期触发。
// 速度计算假定计算之间的间隔时间是固定的。 //--------------------------------------------------------------------
void __attribute__((__interrupt__)) _ADCInterrupt(void)
{
IFS0bits.ADIF = 0;
// 递增控制显示和按钮功能执行的计数变量。 //
iDispLoopCnt++;
// 累计自上一次中断后的编码器计数 CalcVelIrp();
if( uGF.bit.RunMotor ) {
// 置位用于诊断的 LED1 pinLED1 = 1;
// 使用 TMR1来测量用于诊断的中断时间 TMR1 = 0;
iLoopCnt = TMR1;
MeasCompCurr();
// 根据 qSin、 qCos、 qIa、 qIb计算 qId、 qIq ClarkePark();
// 计算控制值 DoControl();
// 根据 qAngle计算 qSin、 qCos SinCos();
// 根据 qSin、 qCos、 qVd、 qVq计算 qValpha、InvPark();
// 根据 qValpha、 qVbeta计算 Vr1、 Vr2、 Vr3。CalcRefVec();
qVbeta
// 根据 Vr1、 Vr2、 Vr3计算和设定 PWM占空比 CalcSVGen();
// 测量循环时间
iLoopCnt = TMR1 - iLoopCnt; if( iLoopCnt > iMaxLoopCnt )
iMaxLoopCnt = iLoopCnt;
// 清零用于诊断的 LED1 pinLED1 = 0; } }
//--------------------------------------------------------------------// SetupBoard //
// 初始化控制板
//--------------------------------------------------------------------
void SetupBoard( void ) {
BYTE b;
//禁止 ADC中断 IEC0bits.ADIE = 0;
// 复位电机控制功率模块上的所有故障。 pinFaultReset = 1; for(b=0;b<10;b++)
Nop();
pinFaultReset = 0;
// 确保 PFC开关是关闭的。 pinPFCFire = 0;
// 确保制动开关是关闭的。 pinBrakeFire = 0; }
//--------------------------------------------------------------------// Dis_RPM //
// 显示 RPM
//--------------------------------------------------------------------
void Dis_RPM( BYTE bChrPosC, BYTE bChrPosR ) {
if (EncoderParm.iDeltaCnt < 0)
Wrt_S_LCD(\ else
Wrt_S_LCD(\
iRPM = EncoderParm.iDeltaCnt*60/
(MotorParm.fLoopPeriod*MotorParm.iIrpPerCalc*EncoderParm.iCntsPerRev);
Wrt_Signed_Int_LCD( iRPM, bChrPosC+1, bChrPosR); }
//--------------------------------------------------------------------bool SetupParm(void) {
// 开启抗饱和功能以确保能够平滑处理溢出。 CORCONbits.SATA = 0;