dsp30代码 下载本文

// 根据编码器累计计数值来计算转速 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;