#include "task.h" #include "inFlash.h" #include "parameter.h" #include "FM_GPIO.h" #include "chargControlEnum.h" #include "bl_chargControl.h" /** * @brief 启动时初始化各任务 * @param None * @retval None * */ void task_Init(void) { TimeSliceOffset_Register(&m_runled, Task_Runled, runled_reloadVal, runled_offset); TimeSliceOffset_Register(&m_wdi, Task_wdi, wdi_reloadVal, wdi_offset); } /** * @brief 运行指示灯任务 * @param None * @retval None * */ STR_TimeSliceOffset m_runled; void Task_Runled(void) { RUN_LED(); } /** * @brief 喂狗任务 * @param None * @retval None */ STR_TimeSliceOffset m_wdi; void Task_wdi(void) { /* 每天复位一次,复位前将电量信息写入flash中 */ static uint32_t temp = 60 * 60 * 24; if (!(--temp)) { temp = 0; float tempF; tempF = getTotalElectricityConsumption(); savetotalElectricityConsumption(&tempF); tempF = getTotalChargCapacity(); savetotalChargCapacity(&tempF); NVIC_SystemReset(); } feedDog(); } /** * @brief 刷新并判断数据 * @param None * @retval None * */ STR_TimeSliceOffset m_refreshJudgeData; void Task_refreshJudgeData(void) { /* 获取数据 */ setInputVoltage(); setHighSideMosTemperature(); /* 判断有无电池 */ if (getBatteryState() == FALSE && (getChargBatteryCurrent() > 1 || getChargBatteryCurrent() < -1) && getOutputVoltage() < 14.2f) { setBatteryState(TRUE); } /* 温度检测 */ if () { } } /** * @brief 停止充电或系统启动时后开启该任务,每隔一段时间检测开路电压 * 检测电池电压是否大于充电电压,大于则开启充电,否则关闭充电 * 能否达到充电标准,达到后检测电压判断系统中是否有电池同时启 * 动软启动任务 * @param None * @retval None * */ STR_TimeSliceOffset g_startControl; void Task_startControl(void) { if (getSolarInCircuitVoltage() > g_cfgParameter.startSolarOpenCircuitV) { TimeSliceOffset_Unregister(&g_startControl); g_startControl.runFlag = 0; if (getOutputVoltage() > 10) { setBatteryState(TRUE); } else { setBatteryState(FALSE); } TimeSliceOffset_Register(&m_softStart, Task_softStart, softStart_reloadVal, softStart_offset); } } /** * @brief 软启动 * @param * @retval * */ STR_TimeSliceOffset m_softStart; void Task_softStart(void) { static uint16_t num = 0; static float dutyRatio = 0; num++; if (num < 5) { set_pwmPulse(100); } else if (num > 70 || dutyRatio > 0.75f) { TimeSliceOffset_Unregister(&m_softStart); m_softStart.runFlag = 0; dutyRatio = 0; num = 0; setDutyRatio(0.75); set_pwmDutyRatio(getDutyRatio()); if (getBatteryState() == TRUE) { setMPPT_Mode(MPPT); } else { setMPPT_Mode(floatCharg); } setChargControlFlag(TRUE); } else { setDutyRatio(getDutyRatio() + 0.05f); set_pwmDutyRatio(getDutyRatio()); } } /** * @brief 满足一定条件后启动该任务,测量回路阻抗 * @param * @retval */ STR_TimeSliceOffset m_impedanceCalculation; void Task_impedanceCalculation(void) { static uint8_t num = 0; static float currOne = 0; static float voltOne = 0; static float currTwo = 0; static float voltTwo = 0; num++; if (num == 1) { setChargControlFlag(FALSE); setDutyRatio(0.7); set_pwmDutyRatio(getDutyRatio()); return; } if (num == 11) { currOne = getChargCurrent() - getDischargCurrent(); voltOne = getOutputVoltage(); setDutyRatio(0.85); set_pwmDutyRatio(getDutyRatio()); return; } if (num == 21) { TimeSliceOffset_Unregister(&m_impedanceCalculation); m_impedanceCalculation.runFlag = 0; currTwo = getChargCurrent() - getDischargCurrent(); voltTwo = getOutputVoltage(); float tempLoopImpedance = 0; tempLoopImpedance = (voltOne - voltTwo) / (currOne - currTwo); /* 判断回路阻抗是否合理 */ if (tempLoopImpedance < 1.0f && tempLoopImpedance > 0.05f) { g_cfgParameter.loopImpedance = tempLoopImpedance; saveLoopImpedance(&g_cfgParameter.loopImpedance); } num = 0; setMPPT_Mode(MPPT); setChargControlFlag(TRUE); return; } }