if( uGF.bit.Btn3Pressed ) {
// 按钮刚释放
uGF.bit.Btn3Pressed = 0;
uGF.bit.ChangeSpeed = !uGF.bit.ChangeSpeed; pinLED3 = uGF.bit.ChangeSpeed; LATGbits.LATG0 = 1; } }
// 按钮 4不具备任何功能
if(pinButton4) {
if( !uGF.bit.Btn4Pressed )
uGF.bit.Btn4Pressed = 1; }
else {
if( uGF.bit.Btn4Pressed ) {
// 按钮刚被释放
uGF.bit.Btn4Pressed = 0;
//*** 此处加入按钮 4功能的代码 } }
} // 显示和按钮查询代码结束
} // 电机运行循环结束
} //主循环结束
// 不应执行到此处 while(1){} }
//--------------------------------------------------------------------//
对 Id控制环、 Iq控制环和速度控制环中的每个控制环执行一次 PI迭代 void DoControl( void ) {
short i;
// 假定 ADC通道 0具有来自速度电位器( AN7)的有符号小数格式原始 A/D值
ReadSignedADC0( &ReadADCParm );
// 设定给定速度
if(uGF.bit.ChangeSpeed)
CtrlParm.qVelRef = ReadADCParm.qADValue/8; else
CtrlParm.qVelRef = ReadADCParm.qADValue/16;
if( uGF.bit.OpenLoop ) {
// 开环:强制旋转角、 Vd和 Vq
if( uGF.bit.ChangeMode ) {
// 改变为开环模式
uGF.bit.ChangeMode = 0; // 同步角度
OpenLoopParm.qAngFlux = CurModelParm.qAngFlux;
// 未使用 VqRef和 VdRef CtrlParm.qVqRef = 0; CtrlParm.qVdRef = 0; }
OpenLoopParm.qVelMech = CtrlParm.qVelRef;
// 为 CorrectPhase所需的给定值和符号 // 计算 1.15格式的转子磁通旋转角。
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;
ParkParm.qVd = uWork;
OpenLoop();
ParkParm.qAngle = OpenLoopParm.qAngFlux; }
else
// 闭环矢量控制 {
if( uGF.bit.ChangeMode ) {
// 改变为闭环模式
uGF.bit.ChangeMode = 0;
// 同步角度以及准备 qdImag
CurModelParm.qAngFlux = OpenLoopParm.qAngFlux; CurModelParm.qdImag = ParkParm.qId; }
// 根据电流模型计算角度
CurModelParm.qVelMech = EncoderParm.qVelMech;
CurModel();
ParkParm.qAngle = CurModelParm.qAngFlux;
// 计算弱磁控制模式的 qVdRef FdWeakening();
// 设定给定速度
// 如果应用运行在转矩模式,转速控制环将被忽略。
// 从电位器读取的转速给定值将直接用作转矩给定 VqRef。 #ifdefTORQUE_MODE
CtrlParm.qVqRef = CtrlParm.qVelRef;
#else
// 通过对比每一次转速计算中的中断数和速度计数采样数来确定是否可以获得新的转速信息。 //
// 如果可以获得新的转速信息,则计算新的转速值并执行 // 转速控制环。
if(EncoderParm.iVelCntDwn == EncoderParm.iIrpPerCalc) {