/**************************** (C) COPYRIGHT 2015 Fortiortech shenzhen ***************************** File Name : IRScan.c Author : Billy Long Fortiortech Market Dept Version : V1.0 Date : 01/07/2015 Description : This file contains main function used for Motor Control. *************************************************************************************************** All Rights Reserved **************************************************************************************************/ /* Includes -------------------------------------------------------------------------------------*/ #include #include /* Private typedef ------------------------------------------------------------------------------*/ /* Private define -------------------------------------------------------------------------------*/ /* Private macro --------------------------------------------------------------------------------*/ /* Private variables ----------------------------------------------------------------------------*/ IRScan_TypeDef xdata IRScan; IRControl_TypeDef xdata IRControl; IRControl_AutoPowerDef AutoPowerState; LineControlSpeedDEF xdata LineSpeedState; uint8 NatureWinFlag = 0; /* Private function prototypes ------------------------------------------------------------------*/ /* Private functions ----------------------------------------------------------------------------*/ /* ------------------------------------------------------------------------------------------------- Function Name : void IRInit(void) Description : Input : 无 Output : 无 -------------------------------------------------------------------------------------------------*/ void IRInit(void) { IRControl.LEDONOFFStatus = 1; IRScan.BitValue = 0; IRScan.BitCnt = 0; IRScan.Bit0Cnt = 0; IRScan.ByteValue = 0; IRScan.UserCode = 0; IRScan.DataCode = 0; IRScan.IRReceiveFlag = 0; IRScan.CurrentUserCode = 0; IRScan.OldDataCodeMixTimes1 = 0; IRScan.OldDataCodeMixTimes0 = 0; IRScan.CurrentDataCode = 0; IRScan.DataCodeLengthCover = 1; IRScan.UserCodeLengthCover = 1; IRScan.DataCodeLengthCover = (IRScan.DataCodeLengthCover << (DataCodeLength)) - 1; IRScan.UserCodeLengthCover = (IRScan.UserCodeLengthCover << (UserCodeLength)) - 1; IRControl.FlagONOFF = 0; IRControl.FlagFR = 0; IRControl.FlagSpeed = 0; IRControl.TargetSpeed = 0; IRControl.ONOFFStatus = 0; IRControl.FlagNatureWind = 0; IRControl.FlagLED = 0; IRControl.FlagAutoPower = 0; IRControl.FlagUserCodeSave = 0; IRControl.FlagUserCodeSaveOFF = 0; IRControl.FlagUserCodeRead = 1; //上电读出一次UserCode IRControl.FlagLED1Protect = 0; //LED欠压过压保护标记 IRControl.FlagLED2Protect = 0; IRScan.TempDataCode[0] = 0; IRScan.TempDataCode[1] = 0; IRScan.TempDataCode[2] = 0; IRScan.TempDataCode[3] = 0; IRScan.DataCodeNum = 0; IRScan.BYTE0 = 0; IRScan.BYTE1 = 0; IRScan.BYTE2 = 0; IRScan.BYTE3 = 0; IRScan.PID = 0; IRScan.B = 0; IRControl.NatureFlage = 0; IRScan.OverFlowStatus = 0; mcFRState.OldTargetSpeed = 1; mcFRState.FR = CCW; mcFRState.FlagFR = 0; mcFRState.FRStatus = 0; // Time.ReciveDelayFlage=0; // Time.ReciveDelayCount=0; // Time.PowerUpTimeCount=0; AutoPowerState.FlagAutoPower = 0; AutoPowerState.Timer10sec = 0; AutoPowerState.ShutDowntime = 0; AutoPowerState.CurrentTime = 0; #if (Motor_Speed_Control_Mode == SPEED_LOOP_CONTROL) { IRControl.SpeedLevel[0] = MOTOR_SPEED_LEVEL_0; IRControl.SpeedLevel[1] = MOTOR_SPEED_LEVEL_1; IRControl.SpeedLevel[2] = MOTOR_SPEED_LEVEL_2; IRControl.SpeedLevel[3] = MOTOR_SPEED_LEVEL_3; IRControl.SpeedLevel[4] = MOTOR_SPEED_LEVEL_4; IRControl.SpeedLevel[5] = MOTOR_SPEED_LEVEL_5; IRControl.SpeedLevel[6] = MOTOR_SPEED_LEVEL_6; } #elif (Motor_Speed_Control_Mode == POWER_LOOP_CONTROL) { IRControl.SpeedLevel[0] = MOTOR_POWER_LEVEL_0; IRControl.SpeedLevel[1] = MOTOR_POWER_LEVEL_1; IRControl.SpeedLevel[2] = MOTOR_POWER_LEVEL_2; IRControl.SpeedLevel[3] = MOTOR_POWER_LEVEL_3; IRControl.SpeedLevel[4] = MOTOR_POWER_LEVEL_4; IRControl.SpeedLevel[5] = MOTOR_POWER_LEVEL_5; IRControl.SpeedLevel[6] = MOTOR_POWER_LEVEL_6; } #endif LineSpeedState.TargetSpeed = 0; LineSpeedState.PreTargetSpeed = 0; } /* ------------------------------------------------------------------------------------------------- Function Name : void IRValue(void) Description : 红外接收头解码 Input : 无 Output : 无 -------------------------------------------------------------------------------------------------*/ //void IRValue(void) //{ // uint8 tempof1 = 0; // uint8 tempof2 = 0; // // if (IRScan.BitCnt == 0) // { // IRScan.Bit0Cnt = TIM3__DR; // // if ((IRScan.Bit0Cnt <= TempLeadCodeMax) && (IRScan.Bit0Cnt >= TempLeadCodeMin)) // { // IRScan.BitCnt++; // } // } // else // { // IRScan.Bit0Cnt = TIM3__ARR - TIM3__DR; // // if ((IRScan.Bit0Cnt >= TempBitValue1Min) && (IRScan.Bit0Cnt <= TempBitValue1Max)) // { // IRScan.BitValue = 1; // tempof1 = 0x00; // } // else if ((IRScan.Bit0Cnt >= TempBitValue0Min) && (IRScan.Bit0Cnt <= TempBitValue0Max)) // { // IRScan.BitValue = 0; // tempof1 = 0x00; // } // else // { // tempof1 = 0xFF; // } // // if (tempof1 != 0xff) // { // if (IRScan.BitCnt <= UserCodeLength) // { // IRScan.ByteValue += (IRScan.BitValue << (UserCodeLength - IRScan.BitCnt)); // // if (IRScan.BitCnt == UserCodeLength) // { // IRScan.UserCode = IRScan.ByteValue; // IRScan.ByteValue = 0; // } // // IRScan.BitCnt ++; // } // else // { // IRScan.ByteValue += (IRScan.BitValue << (DataCodeLength - (IRScan.BitCnt - UserCodeLength))); // // if (IRScan.BitCnt == AllCodeLength) // { // IRScan.DataCode = IRScan.ByteValue; // IRScan.ByteValue = 0; // IRScan.BitCnt = 0; // // // tempof2 = (uint8)IRScan.DataCode; // // tempof1 = IRScan.DataCode>>8; // // tempof1 = 0xff -tempof1-1; // // tempof1 = 0xff -tempof1; // // if (IRScan.UserCode == UserCodeDef) // { // IRScan.IRReceiveFlag = 1; // } // } // else // { IRScan.BitCnt ++; } // } // } // else // { // IRScan.ByteValue = 0; // IRScan.BitCnt = 0; // } // } //} /* ------------------------------------------------------------------------------------------------- Function Name : void SetSpeed(uint8 SpeedLevel) Description : 速度设置 Input : SpeedLevel:速度挡位 Output : 无 -------------------------------------------------------------------------------------------------*/ void SetSpeed(uint8 SpeedLevel) { IRControl.TargetSpeed = SpeedLevel; if (!mcSpeedRamp.FlagONOFF) { mcSpeedRamp.FlagONOFF = 1; } IRControl.ONOFFStatus = 1; IRControl.FlagSpeed = 1; mcFRState.OldTargetSpeed = IRControl.TargetSpeed; NatureWinFlag = 0; //正反转切换后根据遥控档位启动 IRControl.NatureFlage = 0; // SetBuzzer(1,1); } /* ------------------------------------------------------------------------------------------------- Function Name : void SetAutoPower(uint16 Time) Description : 定时设置 Input : Time:定时时长 Output : 无 -------------------------------------------------------------------------------------------------*/ void SetAutoPower(uint16 Time) { IRControl.FlagAutoPower = 1; AutoPowerState.ShutDowntime = Time; } uint32 idata TempByteValue; uint16 buf1[32] = {0}; uint8 k = 0; uint16 TIM4_DR_Temp = 0; uint16 TIM4_ARR_Temp = 0; ///*------------------------------------------------------------------------------------------------- // Function Name : void RFValue(void) // Description : RF接收头解码 // Input : 无 // Output : 无 //-------------------------------------------------------------------------------------------------*/ void IRValue(void) { static uint8 UserSavedStatus = 0; static uint8 UserSavedOffStatus = 0; static idata uint32 TempByteValueEff; static idata uint32 TempBitValue; static idata uint8 effect_value = 0; uint8 tempof1 = 0; TIM4_ARR_Temp = TIM4__ARR; TIM4_DR_Temp = TIM4__DR; IRScan.Bit0Cnt = TIM4_ARR_Temp - TIM4_DR_Temp; //读出高电平 //两组遥控信号之间的低电平信号认为是第二组信号的起始信号,低电平长度6ms // if((TIM4_DR_Temp <= 15000)&&(TIM4_DR_Temp >= 12000)&&(IRScan.Bit0Cnt <= 2100)&&(IRScan.Bit0Cnt >= 1500)) if ((TIM4_DR_Temp <= TempLeadCodeMax) && (TIM4_DR_Temp >= TempLeadCodeMin) && (IRScan.Bit0Cnt <= TempLeadCode0Max) && (IRScan.Bit0Cnt >= TempLeadCode0Min)) { IRScan.BitCnt = 1; effect_value = 0; } if (IRScan.BitCnt == 1) { IRScan.BitCnt = 2; TempByteValue = 0; TempByteValueEff = 0; } else if (IRScan.BitCnt >= 2) { IRScan.Bit0Cnt = TIM4__DR; // buf1[k] = IRScan.Bit0Cnt; // if(++k == 32) // { // k = 0; // } if ((IRScan.Bit0Cnt >= TempBitValue1Min) && (IRScan.Bit0Cnt <= TempBitValue1Max)) { //当前数据为1 TempBitValue = 1; tempof1 = 0x00; } else if ((IRScan.Bit0Cnt >= TempBitValue0Min) && (IRScan.Bit0Cnt <= TempBitValue0Max)) { //当前数据为0 TempBitValue = 0; tempof1 = 0x00; } else { tempof1 = 0xff; //当前数据电平长度不符合要求 } if (tempof1 != 0xff) { /****************************遥控解码部分**************/ //存储有效数据至对应位 TempByteValue += (TempBitValue << ((AllCodeLength - 1) - (IRScan.BitCnt - 2))); IRScan.BitCnt ++; //接收满24位数据时进行处理(数据长度实际为25位,最后一位在起始信号时读取) if ((IRScan.BitCnt - 2) == AllCodeLength) { IRScan.DataCode = (TempByteValue) & 0XFFFF; //存储当前遥控地址吗 IRScan.UserCode = (TempByteValue >> 16) & 0XFFFF; TempByteValue = 0; if (IRScan.UserCode == 0x00ff) { if (IRScan.DataCode == 0x8877) { if (KeySpeed == 0) //处于关机状态按下该按键则以一档速度运行并短“滴”一声 { KeySpeed = 1; SetBuzzer(1, 1); SetSpeed_LEDPin; } else //处于开机状态按下该按键则关机并长“滴”一声 { KeySpeed = 0; SetBuzzer(5, 1); ResetSpeed_LEDPin; YaoTou_Flag = 0; ResetYaoTou_LEDPin; } } else if (IRScan.DataCode == 0x6897)//摇头 { if (KeySpeed) //只有在主控电机运行时才开摇头 { YaoTou_Flag ^= 1; if (YaoTou_Flag) // { SetBuzzer(1, 1); SetYaoTou_LEDPin; } else { SetBuzzer(1, 2); ResetYaoTou_LEDPin; } } } else if (IRScan.DataCode == 0x48b7)//加大风量并短“滴”一声 { if (KeySpeed != 0) { if (KeySpeed < 3) { KeySpeed++; } SetBuzzer(1, 1); SetSpeed_LEDPin; } } else if (IRScan.DataCode == 0xa857)//减小风量并短“滴”一声 { if (KeySpeed != 0) { if (KeySpeed > 1) { KeySpeed--; } SetSpeed_LEDPin; SetBuzzer(1, 1); } } } } } else { TempByteValue = 0; IRScan.BitCnt = 0; } } } /* ------------------------------------------------------------------------------------------------- Function Name : void IRScanControl(void) Description : 遥控信号处理 Input : 无 Output : 无 -------------------------------------------------------------------------------------------------*/ void IRScanControl(void) { if (IRScan.IRReceiveFlag) { //Time.ReciveDelayFlage=1; if (IRScan.DataCode == IRFRCCW) { SetBuzzer(2, 2); } else { SetBuzzer(2, 1); } switch (IRScan.DataCode) { case IRALLOFF: { IRControl.ONOFFStatus = 0; IRControl.TargetSpeed = 0; IRControl.FlagSpeed = 1; mcSpeedRamp.FlagONOFF = 0; IRControl.NatureFlage = 0; //在反转过程中关机时退出反转状态 mcFRState.FlagFR = 0; mcFRState.FRStatus = 0; NatureWinFlag = 0; if (IRControl.LEDONOFFStatus) { ResetLEDPin; IRControl.LEDONOFFStatus = 0; } break; } case IRONOFF: { if (mcSpeedRamp.FlagONOFF == 1) { IRControl.ONOFFStatus = 0; IRControl.TargetSpeed = 0; mcFRState.OldTargetSpeed = IRControl.TargetSpeed; mcSpeedRamp.FlagONOFF = 0; IRControl.NatureFlage = 0; //在反转过程中关机时退出反转状态 mcFRState.FlagFR = 0; mcFRState.FRStatus = 0; IRControl.FlagSpeed = 1; NatureWinFlag = 0; } break; } case IRFRCCW: { if (mcFRState.FR == CCW) { if ((mcState == mcRun) || (mcState == mcStart)) { IRControl.FlagFR = 1; } else if ((mcState == mcReady) || (mcState == mcFault)) { mcFRState.FR = CW; if (IRControl.TargetSpeed == 0) { SetSpeed(3); } else { SetSpeed(IRControl.TargetSpeed); } } } else { IRControl.FlagFR = 0; if (!NatureWinFlag) { if (IRControl.TargetSpeed == 0) { SetSpeed(3); } else { SetSpeed(IRControl.TargetSpeed); } } else { } } break; } case IRFRCW: { if (mcFRState.FR == CW) { if ((mcState == mcRun) || (mcState == mcStart)) { IRControl.FlagFR = 1; } else if ((mcState == mcReady) || (mcState == mcFault)) { mcFRState.FR = CCW; if (IRControl.TargetSpeed == 0) { SetSpeed(3); } else { SetSpeed(IRControl.TargetSpeed); } } } else { IRControl.FlagFR = 0; if (!NatureWinFlag) { if (IRControl.TargetSpeed == 0) { SetSpeed(3); } else { SetSpeed(IRControl.TargetSpeed); } } else { } } break; } case IRLED: { IRControl.FlagLED = 1; break; } case IRSpeed1: { SetSpeed(1); break; } case IRSpeed2: { SetSpeed(2); break; } case IRSpeed3: { SetSpeed(3); break; } case IRSpeed4: { SetSpeed(4); break; } case IRSpeed5: { SetSpeed(5); break; } case IRSpeed6: { SetSpeed(6); break; } case IRAUTOPOWER1H: { SetAutoPower(360); //360*10s =3600s =1h break; } case IRAUTOPOWER2H: { SetAutoPower(720); break; } case IRAUTOPOWER4H: { SetAutoPower(1400); break; } case IRNatureWind: { if (!IRControl.ONOFFStatus) { IRControl.ONOFFStatus = 1; mcSpeedRamp.FlagONOFF = 1; } if (!NatureWinFlag) { // mcFRState.OldTargetSpeed = 1; // IRControl.TargetSpeed = mcFRState.OldTargetSpeed; IRControl.TargetSpeed = NatureWinCode[0]; mcFRState.OldTargetSpeed = IRControl.TargetSpeed; IRControl.FlagSpeed = 1; IRControl.NatureFlage = 1; //IRControl.FlagSpeed = 1; NatureWinFlag = 1; } break; } default: break; } IRScan.IRReceiveFlag = 0; } } /* ------------------------------------------------------------------------------------------------- Function Name : void AutoPowerControl(void) Description : 自动控制开关机 Input : 无 Output : 无 -------------------------------------------------------------------------------------------------*/ void AutoPowerControl(void) { if (IRControl.FlagAutoPower) { // if (AutoPowerState.FlagAutoPower) // { // AutoPowerState.FlagAutoPower = 0; // } // else // { AutoPowerState.FlagAutoPower = 1; // } AutoPowerState.Timer10sec = 0; //每次按遥控重新计时 AutoPowerState.CurrentTime = 0; IRControl.FlagAutoPower = 0; } //自动关机 if ((AutoPowerState.FlagAutoPower && IRControl.ONOFFStatus) || ( AutoPowerState.FlagAutoPower && IRControl.LEDONOFFStatus)) { AutoPowerState.Timer10sec++; if (AutoPowerState.Timer10sec > 10000) { AutoPowerState.Timer10sec = 0; AutoPowerState.CurrentTime++; if (AutoPowerState.CurrentTime >= AutoPowerState.ShutDowntime) { // if(IRControl.ONOFFStatus) // { IRControl.ONOFFStatus = 0; mcFRState.OldTargetSpeed = 0; IRControl.TargetSpeed = 0; mcSpeedRamp.FlagONOFF = 0; // } // else // { // IRControl.ONOFFStatus =1; // PIControlTime = SPEED_LOOP_TIME; // IRControl.TargetSpeed = MOTOR_POWER_LEVEL_1; // } // IRControl.FlagONOFF = 1; // BZScan.FlagBZ = 1; IRControl.FlagSpeed = 1; if (IRControl.LEDONOFFStatus) { ResetLEDPin; IRControl.LEDONOFFStatus = 0; } AutoPowerState.CurrentTime = 0; AutoPowerState.FlagAutoPower = 0; } } } else { AutoPowerState.FlagAutoPower = 0; AutoPowerState.Timer10sec = 0; AutoPowerState.ShutDowntime = 0; AutoPowerState.CurrentTime = 0; } } /* ------------------------------------------------------------------------------------------------- Function Name : uint8 GetUserCode(void) Description : LED显示,IO口电平变化实现 Input : 无 Output : 无 -------------------------------------------------------------------------------------------------*/ void LEDDisplay(void) { // static uint8 LEDDiaplayStatus = 0; if (IRControl.FlagLED) { if (IRControl.LEDONOFFStatus == 0) { SetLEDPin; // IRControl.ONOFFStatus=1; IRControl.LEDONOFFStatus = 1; } else { // IRControl.ONOFFStatus=0; ResetLEDPin; IRControl.LEDONOFFStatus = 0; } IRControl.FlagLED = 0; } } void IRONOFF_Control(void) { if ((mcSpeedRamp.TargetValue == 0) && (mcState != mcRun) && (mcState != mcStop)) { //关机后堵转保护次数和缺相保护次数清零 mcProtectTime.SecondStartTimes = 0; mcProtectTime.StallTimes = 0; mcProtectTime.LossPHTimes = 0; mcProtectTime.CurrentPretectTimes = 0; } } void NatureWind(void) { static uint16 NatureWindCnt = 0; static uint8 NatureWindStep = 0; static uint8 FlageAddorDelace = 0; // if ((!NatureWinFlag) || (IRControl.FlagFR) || (!IRControl.ONOFFStatus) || (mcState != mcRun)) // { // NatureWindCnt = 0; // NatureWindStep = 0; // return; // } // else // { NatureWindCnt++; // } // IRControl.ONOFFStatus =1; // mcSpeedRamp.FlagONOFF = 1; if (NatureWindCnt > 5000) { NatureWindCnt = 0; if (FlageAddorDelace == 0) { if (NatureWindStep < 5) { NatureWindStep++; } else { NatureWindStep = 5; FlageAddorDelace = 1; } IRControl.TargetSpeed = NatureWinCode[NatureWindStep]; IRControl.FlagSpeed = 1; } else if (FlageAddorDelace) { if (NatureWindStep > 0) { NatureWindStep--; } else { NatureWindStep = 0; FlageAddorDelace = 0; } IRControl.TargetSpeed = NatureWinCode[NatureWindStep]; IRControl.FlagSpeed = 1; } } }