int iRPM;
WORD iMaxLoopCnt; WORD iLoopCnt; WORD iDispLoopCnt;
/**********************************************************************/ void __attribute__((__interrupt__)) _ADCInterrupt(void); void SetupBoard( void ); bool SetupParm(void); void DoControl( void );
void Dis_RPM( BYTE bChrPosC, BYTE bChrPosR ); void DiagnosticsOutput(void);
/******************** 主函数开头 *************************/
int main ( void ) {
SetupPorts(); InitLCD();
while(1) {
uGF.Word = 0; // 清除标志
// 初始化模式
uGF.bit.OpenLoop = 1; // 以开环模式起动
// 初始化 LED pinLED1 = 0;
pinLED2 = !uGF.bit.OpenLoop; pinLED3 = 0; pinLED4 = 0;
// 初始化控制板 SetupBoard();
// 对用户指定参数进行初始化并在出错时停止
if( SetupParm() ) {
//错误
uGF.bit.RunMotor=0; return; }
// 清零 i和
PIParmD.qdSum = 0; PIParmQ.qdSum = 0; PIParmQref.qdSum = 0; iMaxLoopCnt = 0;
Wrt_S_LCD(\ Wrt_S_LCD(\ // 使能 ADC中断并开始主循环定时 IFS0bits.ADIF = 0; IEC0bits.ADIE = 1; if(!uGF.bit.RunMotor) {
// 初始化电流偏移量补偿
while(!pinButton1) //在此处等待直至按钮 1按下 {
ClrWdt();
// 开始偏移量累加 //并在等待时对电流偏移量进行累加 MeasCompCurr(); }
while(pinButton1); //当按钮 1释放时 uGF.bit.RunMotor = 1; //随后起动电机 }
//电机运行
uGF.bit.ChangeMode = 1;
// 使能电机控制 PCB上的驱动器 IC pinPWMOutputEnable_ = 0; Wrt_S_LCD(\
Wrt_S_LCD(\ //电机运行循环 while(1) {
ClrWdt();
// 如果使用 OC7和 OC8显示矢量控制变量, // 调用更新代码。 #ifdefDIAGNOSTICS DiagnosticsOutput(); #endif
// 每隔 50毫秒执行更新 LCD显示和查询按钮状态的代码。 //
if(iDispLoopCnt >= dDispLoopCnt) {
//Display RPM Dis_RPM(5,0);
// 按钮 1控制电机的起停
if(pinButton1) {
if( !uGF.bit.Btn1Pressed )
uGF.bit.Btn1Pressed = 1; } else {
if( uGF.bit.Btn1Pressed ) {
// 按钮刚被释放
uGF.bit.Btn1Pressed = 0; // 开始停止过程
uGF.bit.RunMotor = 0;
pinPWMOutputEnable_ = 1; break; } }
// 在运行时按钮 2将控制开 /闭环模式之间的切换
if(pinButton2) {
if( !uGF.bit.Btn2Pressed )
uGF.bit.Btn2Pressed = 1; }
else {
if( uGF.bit.Btn2Pressed ) {
// 按钮刚释放
uGF.bit.Btn2Pressed = 0; uGF.bit.ChangeMode = 1;
uGF.bit.OpenLoop = ! uGF.bit.OpenLoop; pinLED2 = !uGF.bit.OpenLoop; } }
//在运行时按钮 3将加倍 /减半速度或转矩给定
if(pinButton3) {
if( !uGF.bit.Btn3Pressed )
uGF.bit.Btn3Pressed = 1; LATGbits.LATG0 = 0; }
else {