//============================================================== void F_Eng1EntertSet(void) { switch(R_Mode) { case 0: R_Mode=1; if(EE_Read(EE_Unit)!=ChangeUnitFlg) { // 切換公英制 需重新清除相關 eeprom F_EepromClear_2(); EE_Write(EE_SaveUserInit,1); } break; //============= case 1: R_Mode=2; F_Write2Byte(EE_WheelSize_L,R_WheelSize); break; //============= case 2: R_Mode=3; if(ChangeUnitFlg) EE_Write(EE_SpeedMinMile,R_SpeedMin); else EE_Write(EE_SpeedMinKm,R_SpeedMin); break; //============= case 3: R_Mode=4; if(ChangeUnitFlg) EE_Write(EE_SpeedMaxMile,R_SpeedMax); else EE_Write(EE_SpeedMaxKm,R_SpeedMax); break; //============= case 4: R_Mode=5; EE_Write(EE_IncMax,R_IncMax); break; //============= case 5: R_Mode=0; EE_Write(EE_IncZeroAdr,R_IncZeroAdr); if(IncUpDownFlg==1) { R_IncMaxAd = R_IncCarryAd; } else { R_IncMinAd = R_IncCarryAd; } F_IncFinsh(); break; } }
//======================== void F_GraphSpeedInc(void) { unsigned char SpeedAdrTemp,IncAdrTemp; switch(R_PorgMode) { case User1Val: SpeedAdrTemp=User_1_SpeedAdrVal; IncAdrTemp=User_1_IncAdrVal; break; //============ case User2Val: SpeedAdrTemp=User_2_SpeedAdrVal; IncAdrTemp=User_2_IncAdrVal; break; //============ case User3Val: SpeedAdrTemp=User_3_SpeedAdrVal; IncAdrTemp=User_3_IncAdrVal; break; //============ } EE_Write(SpeedAdrTemp+R_ProgramIndex,R_User_SetSpeed); EE_Write(IncAdrTemp+R_ProgramIndex,R_User_SetInc); //=========== R_ProgramIndex++; if(R_ProgramIndex>=30) { R_ProgramIndex=0; R_Mode=0; } else { R_User_SetSpeed=EE_Read(SpeedAdrTemp+R_ProgramIndex); R_User_SetInc=EE_Read(IncAdrTemp+R_ProgramIndex); //F_ChangeGraphInc(R_ProgramIndex,R_User_SetInc); //F_ChangeGraphSpeed(R_ProgramIndex,R_User_SetSpeed); } }
//===================================== void F_SpeedAuto(unsigned char Speed) { unsigned char i; R_SpeedBuf=Speed; switch(R_SpeedAutoCnt) { case 0: // 低速校正 if((Speed>=R_SpeedMin) &&(Speed<=R_SpeedMin+2)) { // 低速校正結束 R_LowSpeedCntDelay++; if(R_LowSpeedCntDelay>2) { R_LowSpeedCntDelay=0; R_PwmLowSpeed=R_SpeedPwmCntSave; EE_Write(EE_PwmLowSpeed,R_PwmLowSpeed); R_SpeedAutoCnt=1; } } else if(R_SpeedMin>Speed) { R_LowSpeedCntDelay=0; MotoUpDownFlg=0; // 馬達加速 R_SpeedPwmCnt=1; } else { R_LowSpeedCntDelay=0; MotoUpDownFlg=1; // 馬達減速 R_SpeedPwmCnt=1; } break; //============================ case 1: // 高速確認 if(R_SpeedMax<=Speed) //校正完成 { SpeedAutoFlg=0; //速度校正完成 R_SpeedPwmCnt=0; F_SpeedSwCotrol(0); } else { if(R_SpeedMax>Speed) { MotoUpDownFlg=0; // 馬達加速 i=R_SpeedMax-Speed; } else { MotoUpDownFlg=1; // 馬達減速 i=Speed-R_SpeedMax; } if(i>99) // > ±5.0Km R_SpeedPwmCnt = 25; else if(i>49) // > ±4.0Km R_SpeedPwmCnt = 20; else if(i>39) // > ±3.0Km R_SpeedPwmCnt = 13; else if(i>19) // > ±2.0Km R_SpeedPwmCnt = 10; else if(i>9) // > ±1.0Km R_SpeedPwmCnt = 8; else if(i>2) // > ±0.5Km R_SpeedPwmCnt = 3; else if(i>0) // > ±0.1Km R_SpeedPwmCnt = 1; // 1 階 } break; } }
//========================================================== //自動校正 //========================================================== void F_IncAuto(void) { unsigned char i; R_IncAutoTime++; F_IncAd(R_IncAutoAd); //===================== if(R_IncAutoTemp1<=253) R_IncAutoTemp1=R_IncAutoTemp1+2; else R_IncAutoTemp1=R_IncAutoTemp1; if(R_IncAutoTemp2>=2) R_IncAutoTemp2=R_IncAutoTemp2-2; else R_IncAutoTemp2=R_IncAutoTemp2; //===================== switch(R_IncAutoCnt) // 揚升校準處理 { case 0: F_IncIoUpControl(1); // 開啟上升繼電器 F_IncIoDownControl(0); // 關閉下降繼電器 R_IncAutoTime=0; R_IncAutoCnt=1; break; //=================================== case 1: if((R_IncNumAd>=R_IncAutoTemp2)&&(R_IncNumAd<=R_IncAutoTemp1)) { if(R_IncAutoTime>60) // 穩定超過6秒 { R_IncAutoTime=0; F_IncIoUpControl(0); // 關閉上升繼電器 R_IncMinAd=R_IncNumAd; R_IncAutoCnt=2; } } else { R_IncAutoAd=R_IncNumAd; R_IncAutoTime=0; } break; //=================================== case 2: if(R_IncAutoTime>=30) //需要等3秒鐘,才能轉成下降模式 { R_IncAutoTime=0; F_IncIoDownControl(1); //開啟下降繼電器 R_IncAutoCnt=3; } break; //=================================== case 3: if((R_IncNumAd>=R_IncAutoTemp2)&&(R_IncNumAd<=R_IncAutoTemp1)) { if(R_IncAutoTime>60) //穩定超過6秒 { R_IncAutoTime=0; R_IncMaxAd=R_IncNumAd; F_RelayMoveStop(); IncStopFlg=1; //揚升關閉 IncAutoFlg=0; if(R_IncMaxAd>R_IncMinAd) { // 正向 IncUpDownFlg=1; i=R_IncMaxAd-R_IncMinAd; } else { IncUpDownFlg=0; // 反向 i=R_IncMinAd-R_IncMaxAd; } if(i<80) { // 揚升校正錯誤 //R_FaultData=7; } else { // 揚升校正 OK if(IncUpDownFlg==1) { EE_Write(EE_IncUpDown,1); R_IncMaxAd=R_IncMaxAd-2; R_IncNumAdBuf=R_IncMaxAd; EE_Write(EE_IncMaxAd,R_IncMaxAd); EE_Write(EE_IncMinAd,R_IncMinAd); } else { EE_Write(EE_IncUpDown,0); i=R_IncMaxAd; //Max 與 Min 對調 R_IncMaxAd=R_IncMinAd; R_IncMinAd=i; R_IncMinAd=R_IncMinAd+2; R_IncNumAdBuf=R_IncMinAd; EE_Write(EE_IncMaxAd,R_IncMaxAd); EE_Write(EE_IncMinAd,R_IncMinAd); } } } } else { R_IncAutoAd=R_IncNumAd; R_IncAutoTime=0; } break; } }
/****************************************************************************** ** Function name: store_persistent ** ** Description: Saves persistent variables to EEPROM ** ** Parameters: None ** Returned value: None ** ******************************************************************************/ void store_persistent (void) { EE_Write(AddressBMUWHR, conv_float_uint(bmu_data.watt_hrs)); EE_Write(AddressBMUWHRI, conv_float_uint(bmu_data.watt_hrs_in)); EE_Write(AddressBMUWHRO, conv_float_uint(bmu_data.watt_hrs_out)); }