dsp30代码 下载本文

// 设置所需参数

// 选取定标值为 8倍速度和电流标称值

// 在定标时使用 8倍电机标称机械转速(单位为 RPM) MotorParm.iScaleMechRPM = diNomRPM*8;

// 极对数

MotorParm.iPoles = diPoles ;

//由 dsPIC正交编码配置检测的每转编码器计数值。 //

MotorParm.iCntsPerRev = diCntsPerRev;

// 以秒为单位的转子时间常数

MotorParm.fRotorTmConst = dfRotorTmConst;

// 基本循环周期(单位为秒)。( PWM中断周期)

MotorParm.fLoopPeriod = dLoopInTcy * dTcy; //循环周期(以周期为单位) * 秒 /周期

// 编码器转速中断周期(单位为秒)。

MotorParm.fVelIrpPeriod = MotorParm.fLoopPeriod;

// 每次转速计算的 vel中断数。

MotorParm.iIrpPerCalc = diIrpPerCalc; // 以循环为单位

// 电机的定标机械速度(单位为转 /秒)

MotorParm.fScaleMechRPS = MotorParm.iScaleMechRPM/60.0;

// 定标后的电机磁通转速(单位为转 /秒) //通过该值定标后的所有无量纲磁通转速。

MotorParm.fScaleFluxRPS = MotorParm.iPoles*MotorParm.fScaleMechRPS;

// 磁通矢量每转一周的最小周期时间(单位为秒)

MotorParm.fScaleFluxPeriod = 1.0/MotorParm.fScaleFluxRPS;

//在最大磁通转速时的每个 LoopTime的转数系数

MotorParm.fScaleFracRevPerLoop = MotorParm.fLoopPeriod * MotorParm.fScaleFluxRPS;

// 定标后的电机磁通转速(单位为弧度 /秒)

// 通过该值定标后的所有无量纲转速(单位为弧度 /秒)。 MotorParm.fScaleFluxSpeed = 6.283 * MotorParm.fScaleFluxRPS;

// iScaleMechRPM时的编码器计数频率

MotorParm.lScaleCntRate = MotorParm.iCntsPerRev * (MotorParm.iScaleMechRPM/60.0);

// ============= 开环 ======================

OpenLoopParm.qKdelta = 32768.0 * 2 * MotorParm.iPoles * MotorParm.fLoopPeriod *

MotorParm.fScaleMechRPS;

OpenLoopParm.qVelMech = dqOL_VelMech; CtrlParm.qVelRef = OpenLoopParm.qVelMech;

InitOpenLoop();

// ============= 编码器 ===============

if( InitEncoderScaling() ) // 出错 return True;

// ============= ADC - 测量电流和电位器 ======================

// 定标常数:由校准或硬件设计决定。 ReadADCParm.qK = dqK;

MeasCurrParm.qKa = dqKa; MeasCurrParm.qKb = dqKb;

// 初始偏移量

InitMeasCompCurr( 450, 730 );

// ============= 电流模型 ===============

if(InitCurModelScaling()) // 出错 return True;

// ============= 弱磁 =============== // 恒转矩范围的弱磁常数

FdWeakParm.qK1 = dqK1; // 磁通给定值

// ============= PI D项 =============== PIParmD.qKp = dDqKp; PIParmD.qKi = dDqKi; PIParmD.qKc = dDqKc;

PIParmD.qOutMax = dDqOutMax;

PIParmD.qOutMin = -PIParmD.qOutMax;

InitPI(&PIParmD);

// ============= PI Q项 =============== PIParmQ.qKp = dQqKp; PIParmQ.qKi = dQqKi; PIParmQ.qKc = dQqKc;

PIParmQ.qOutMax = dQqOutMax;

PIParmQ.qOutMin = -PIParmQ.qOutMax;

InitPI(&PIParmQ);

// ============= PI Qref项 =============== PIParmQref.qKp = dQrefqKp; PIParmQref.qKi = dQrefqKi; PIParmQref.qKc = dQrefqKc;

PIParmQref.qOutMax = dQrefqOutMax;

PIParmQref.qOutMin = -PIParmQref.qOutMax;

InitPI(&PIParmQref);

// ============= SVGen =============== // 将 PWM周期设定为循环时间

SVGenParm.iPWMPeriod = dLoopInTcy;

// ============= TIMER #1 ====================== PR1 = 0xFFFF;

T1CONbits.TON = 1;

T1CONbits.TCKPS = 1; // 预分频比为 8时 => 一个单位为 1.08504 uS