// 设置所需参数
// 选取定标值为 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