// // Created by cfif on 15.12.2025. // #include "AdcTasks.h" #include "CmsisRtosThreadUtils.h" #include #include "memory.h" #include "HVAC_model.h" #include "ADC_Temp.h" #include "ADC_Temp_Fast.h" #define LOG_SIGN "ADC" #define LOGGER env->logger void Adc_0_Init(tAdc0Task *env, osMutexId_t modelTaskAccess, tAdcIO *adcIO, tGpios *gpios, tLoggerInterface *logger ) { env->adcIO = adcIO; env->modelTaskAccess = modelTaskAccess; env->access = osMutexNew(NULL); env->logger = logger; env->gpios = gpios; env->queueRandom = osMessageQueueNew(10, 4, NULL); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Ambient_Temp, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.IGN_ANS, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_AC_Pressure, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Incar_Temp_FL, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Incar_Temp_RL, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Rear_Evap_Temp, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Rear_Duct1, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Rear_Duct2, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Front_Duct1, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Front_Duct2, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Front_Duct3, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Front_Duct4, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Rear_Duct3, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Rear_Duct4, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Incar_Temp_FR, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Incar_Temp_RR, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Rear_Duct5, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Rear_Duct6, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Reserve_Sensor_Duct_Temp_1, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Front_Duct5, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_Front_Duct6, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Pressure_DIAG, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Reserve_Sensor_Duct_Temp_2, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_PT_rHVAC_P, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.Sensor_A_T_reserve, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5120_2EKA_ShutoffValvePowerTXV1, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5180_2EKA_ShutOFFValveFront, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5180_2EKA_TwoWayValve, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5180_2EKA_FrontIncarMotor, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5180_2EKA_ChannelPTCPower1, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5120_2EKA_ShutoffValvePowerTXV2, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5180_2EKA_ShutOFFValveRear, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5180_2EKA_ReservePowerSupply, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5180_2EKA_RearIncarMotor, MAX_ADC_FILTER_SIZE); ADC_Filter_Init(&env->ADC0_Filter_data.BTS5180_2EKA_ChannelPTCPower2, MAX_ADC_FILTER_SIZE); InitThreadAtrStatic(&env->thread.attr, "Adc0", env->thread.controlBlock, env->thread.stack, osPriorityNormal); } void BTS5180_120(tAdc0Task *env, char *desc, uint16_t adc_value) { float kILIS = 550.0f; float ERROR_THRESHOLD_HIGH_V = 4.9f; float ERROR_THRESHOLD_LOW_V = 0.1f; uint16_t ERROR_THRESHOLD_HIGH_CODE = (uint16_t) (ERROR_THRESHOLD_HIGH_V * 4095.0f / 5.0f); // uint16_t ERROR_THRESHOLD_LOW_CODE = (uint16_t) (ERROR_THRESHOLD_LOW_V * 4095.0f / 5.0f); if (adc_value >= ERROR_THRESHOLD_HIGH_CODE) { LoggerFormatInfo(LOGGER, LOG_SIGN, "%s: Error !!! (adc = %d)", desc, adc_value) } else { // Преобразование в напряжение float U = (float) adc_value * 5.0f / 4095.0f; float I = U / 1200; // Ток диагностики R = 1200 float Iout = I * kILIS; // Ток устройства LoggerFormatInfo(LOGGER, LOG_SIGN, "%s: U = %f I = %f Iout = %f", desc, U, I, Iout) } } void VN7008AJ(tAdc0Task *env, char *desc, uint16_t adc_value) { float RSENSE = 2490.0f; // Сопротивление датчика, Ом (На схеме) float K_TYPICAL = 5890.0f; // Типичный коэффициент из даташита на микросхему float ERROR_THRESHOLD_HIGH_V = 4.9f; float ERROR_THRESHOLD_LOW_V = 0.1f; uint16_t ERROR_THRESHOLD_HIGH_CODE = (uint16_t) (ERROR_THRESHOLD_HIGH_V * 4095.0f / 5.0f); // uint16_t ERROR_THRESHOLD_LOW_CODE = (uint16_t) (ERROR_THRESHOLD_LOW_V * 4095.0f / 5.0f); // 1. Проверка на ошибку if (adc_value >= ERROR_THRESHOLD_HIGH_CODE) { LoggerFormatInfo(LOGGER, LOG_SIGN, "%s: Error !!! (adc = %d)", desc, adc_value) } else { // 2. Преобразование в напряжение float vsense = (float) adc_value * 5.0f / 4095.0f; // 3. Вычисление тока float Isense = vsense / RSENSE; float Iout = Isense * K_TYPICAL; LoggerFormatInfo(LOGGER, LOG_SIGN, "%s: U = %f I = %f Iout = %f", desc, vsense, Isense, Iout) } } void ANALOG_SENSOR(tAdc0Task *env, char *desc, uint16_t adc_value, eNtcTable NtcTable, float R) { float ERROR_THRESHOLD_HIGH_V = 4.9f; float ERROR_THRESHOLD_LOW_V = 0.1f; uint16_t ERROR_THRESHOLD_HIGH_CODE = (uint16_t) (ERROR_THRESHOLD_HIGH_V * 4095.0f / 5.0f); uint16_t ERROR_THRESHOLD_LOW_CODE = (uint16_t) (ERROR_THRESHOLD_LOW_V * 4095.0f / 5.0f); // 1. Проверка на ошибку if (adc_value >= ERROR_THRESHOLD_HIGH_CODE || adc_value <= ERROR_THRESHOLD_LOW_CODE) { LoggerFormatInfo(LOGGER, LOG_SIGN, "%s: Error !!! (adc = %d)", desc, adc_value) } else { // Преобразование в напряжение float U = (float) adc_value * 5.0f / 4095.0f; float temp = 0; switch (NtcTable) { case TABLE_NONE: LoggerFormatInfo(LOGGER, LOG_SIGN, "%s: U = %f (adc = %d)", desc, U, adc_value) return; case TABLE_DUCT: if (R == 3000) { temp = get_temperature_by_adc(temperature_table_duct_KST45_table_3000, 1024, adc_value); } if (R == 20000) { temp = lookup_table_get_temp(temperature_table_duct_KST45_table_20000, adc_value); } break; case TABLE_INCAR: break; case TABLE_AMBIENT: break; } LoggerFormatInfo(LOGGER, LOG_SIGN, "%s: U = %f (adc = %d) Temp = %f", desc, U, adc_value, temp / 10) } } /** * Расчет сопротивления NTC для схемы с делителем напряжения * * Схема: VCC --- R_series --- NTC --- GND * АЦП подключен к точке соединения R_series и NTC * * @param adc_value - значение АЦП (0..adc_max) * @param R_series - сопротивление балластного резистора (Ом) * @param Vcc_mv - напряжение питания делителя (мВ) * @param Vref_mv - опорное напряжение АЦП (мВ) * @param adc_max - максимальное значение АЦП (4095 для 12 бит) * @return - сопротивление NTC (Ом) */ float calculate_ntc_resistance(uint16_t adc_value, float R_series, float Vcc_mv, float Vref_mv, uint16_t adc_max) { // Защита от деления на ноль if (adc_value == 0) { return 0; // Rntc = бесконечность (обрыв) - NTC не подключен } if (adc_value >= adc_max) { return 0.0f; // Rntc = 0 (короткое замыкание) } // Напряжение на NTC, измеренное АЦП (используем Vref АЦП) float V_ntc = (float) adc_value / adc_max * Vref_mv; // Проверка, что V_ntc не превышает Vcc if (V_ntc > Vcc_mv) { V_ntc = Vcc_mv; // Ограничиваем физически возможным значением } // Напряжение на балластном резисторе float V_r1 = Vcc_mv - V_ntc; // Защита от отрицательного напряжения if (V_r1 <= 0.0f) { return 0.0f; // Короткое замыкание } // Закон Ома: Rntc = R_series * (V_ntc / V_r1) float Rntc = R_series * (V_ntc / V_r1); // Ограничиваем разумными пределами (1 Ом ... 10 МОм) if (Rntc < 1.0f) Rntc = 1.0f; if (Rntc > 10000000.0f) Rntc = 10000000.0f; return Rntc; } static _Noreturn void Adc0_Thread(tAdc0Task *env) { uint32_t ADC_Pointer_Data; for (;;) { env->ADC_ChannelCount = env->adcIO->get(env->adcIO->env, &ADC_Pointer_Data, 5000); uint32_t *pData = (uint32_t *) ADC_Pointer_Data; uint32_t count = osMessageQueueGetSpace(env->queueRandom); if (count) { uint32_t seed = 0; for (uint8_t i = 0; i < 28; ++i) { seed = seed | ((pData[i] & 1) << i); } for (uint8_t i = 0; i < 4; ++i) { seed = seed | (((pData[i] >> 1) & 1) << (i + 28)); } osStatus_t status = osMessageQueuePut(env->queueRandom, &seed, 0, 0U); } if (osMutexAcquire(env->modelTaskAccess, 5000) == osOK) { tADC0_data *ADC0_data = (tADC0_data *) ADC_Pointer_Data; rtDW.ADC_Data_Model.Sensor_Ambient_Temp = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Ambient_Temp,ADC0_data->Sensor_Ambient_Temp); rtDW.ADC_Data_Model.IGN_ANS = ADC_Filter_Update(&env->ADC0_Filter_data.IGN_ANS, ADC0_data->IGN_ANS); rtDW.ADC_Data_Model.Sensor_AC_Pressure = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_AC_Pressure,ADC0_data->Sensor_AC_Pressure); rtDW.ADC_Data_Model.Sensor_Incar_Temp_FL = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Incar_Temp_FL,ADC0_data->Sensor_Incar_Temp_FL); rtDW.ADC_Data_Model.Sensor_Incar_Temp_RL = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Incar_Temp_RL,ADC0_data->Sensor_Incar_Temp_RL); rtDW.ADC_Data_Model.Sensor_Rear_Evap_Temp = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Rear_Evap_Temp,ADC0_data->Sensor_Rear_Evap_Temp); rtDW.ADC_Data_Model.Sensor_Rear_Duct1 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Rear_Duct1,ADC0_data->Sensor_Rear_Duct1); rtDW.ADC_Data_Model.Sensor_Rear_Duct2 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Rear_Duct2,ADC0_data->Sensor_Rear_Duct2); rtDW.ADC_Data_Model.Sensor_Front_Duct1 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Front_Duct1,ADC0_data->Sensor_Front_Duct1); rtDW.ADC_Data_Model.Sensor_Front_Duct2 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Front_Duct2,ADC0_data->Sensor_Front_Duct2); rtDW.ADC_Data_Model.Sensor_Front_Duct3 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Front_Duct3,ADC0_data->Sensor_Front_Duct3); rtDW.ADC_Data_Model.Sensor_Front_Duct4 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Front_Duct4,ADC0_data->Sensor_Front_Duct4); rtDW.ADC_Data_Model.Sensor_Rear_Duct3 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Rear_Duct3,ADC0_data->Sensor_Rear_Duct3); rtDW.ADC_Data_Model.Sensor_Rear_Duct4 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Rear_Duct4,ADC0_data->Sensor_Rear_Duct4); rtDW.ADC_Data_Model.Sensor_Incar_Temp_FR = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Incar_Temp_FR,ADC0_data->Sensor_Incar_Temp_FR); rtDW.ADC_Data_Model.Sensor_Incar_Temp_RR = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Incar_Temp_RR,ADC0_data->Sensor_Incar_Temp_RR); rtDW.ADC_Data_Model.Sensor_Rear_Duct5 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Rear_Duct5,ADC0_data->Sensor_Rear_Duct5); rtDW.ADC_Data_Model.Sensor_Rear_Duct6 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Rear_Duct6,ADC0_data->Sensor_Rear_Duct6); rtDW.ADC_Data_Model.Reserve_Sensor_Duct_Temp_1 = ADC_Filter_Update(&env->ADC0_Filter_data.Reserve_Sensor_Duct_Temp_1, ADC0_data->Reserve_Sensor_Duct_Temp_1); rtDW.ADC_Data_Model.Sensor_Front_Duct5 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Front_Duct5,ADC0_data->Sensor_Front_Duct5); rtDW.ADC_Data_Model.Sensor_Front_Duct6 = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_Front_Duct6,ADC0_data->Sensor_Front_Duct6); rtDW.ADC_Data_Model.Pressure_DIAG = ADC_Filter_Update(&env->ADC0_Filter_data.Pressure_DIAG,ADC0_data->Pressure_DIAG); rtDW.ADC_Data_Model.Reserve_Sensor_Duct_Temp_2 = ADC_Filter_Update( &env->ADC0_Filter_data.Reserve_Sensor_Duct_Temp_2, ADC0_data->Reserve_Sensor_Duct_Temp_2); // rtDW.ADC_Data_Model.Sensor_PT_rHVAC_P = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_PT_rHVAC_P, ADC0_data->Sensor_PT_rHVAC_P); // rtDW.ADC_Data_Model.Sensor_A_T_reserve = ADC_Filter_Update(&env->ADC0_Filter_data.Sensor_A_T_reserve, ADC0_data->Sensor_A_T_reserve); /* rtDW.ADC_Data_Model.Sensor_Front_Duct1 = 3071; rtDW.ADC_Data_Model.Sensor_Front_Duct2 = 3031; rtDW.ADC_Data_Model.Sensor_Front_Duct3 = 2993; rtDW.ADC_Data_Model.Sensor_Front_Duct4 = 2952; rtDW.ADC_Data_Model.Sensor_Front_Duct5 = 2912; rtDW.ADC_Data_Model.Sensor_Front_Duct6 = 2871; rtDW.ADC_Data_Model.Sensor_Rear_Duct1 = 2829; rtDW.ADC_Data_Model.Sensor_Rear_Duct2 = 2787; rtDW.ADC_Data_Model.Sensor_Rear_Duct3 = 2744; rtDW.ADC_Data_Model.Sensor_Rear_Duct4 = 2701; */ /* rtDW.ADC_Data_Model.Sensor_Ambient_Temp = pData[0]; rtDW.ADC_Data_Model.IGN_ANS = pData[1]; rtDW.ADC_Data_Model.Sensor_AC_Pressure = pData[2]; rtDW.ADC_Data_Model.Sensor_Incar_Temp_FL = pData[3]; rtDW.ADC_Data_Model.Sensor_Incar_Temp_RL = pData[4]; rtDW.ADC_Data_Model.Sensor_Rear_Evap_Temp = pData[5]; rtDW.ADC_Data_Model.Sensor_Evap_Temp = pData[6]; rtDW.ADC_Data_Model.Sensor_Rear_Duct1 = pData[7]; rtDW.ADC_Data_Model.Sensor_Rear_Duct2 = pData[8]; rtDW.ADC_Data_Model.Sensor_Front_Duct1 = pData[9]; rtDW.ADC_Data_Model.Sensor_Front_Duct2 = pData[10]; rtDW.ADC_Data_Model.Sensor_Front_Duct3 = pData[11]; rtDW.ADC_Data_Model.Sensor_Front_Duct4 = pData[12]; rtDW.ADC_Data_Model.Sensor_Rear_Duct3 = pData[13]; rtDW.ADC_Data_Model.Sensor_Rear_Duct4 = pData[14]; rtDW.ADC_Data_Model.Sensor_Incar_Temp_FR = pData[15]; rtDW.ADC_Data_Model.Sensor_Incar_Temp_RR = pData[16]; rtDW.ADC_Data_Model.Sensor_Rear_Duct5 = pData[17]; rtDW.ADC_Data_Model.Sensor_Rear_Duct6 = pData[18]; rtDW.ADC_Data_Model.Reserve_Sensor_Duct_Temp_1 = pData[19]; rtDW.ADC_Data_Model.Sensor_Front_Duct5 = pData[20]; rtDW.ADC_Data_Model.Sensor_Front_Duct6 = pData[21]; rtDW.ADC_Data_Model.Pressure_DIAG = pData[23]; rtDW.ADC_Data_Model.Reserve_Sensor_Duct_Temp_2 = pData[28]; */ // rtDW.ADC_Data_Model.Sensor_PT_rHVAC_P = pData[29]; // rtDW.ADC_Data_Model.Sensor_A_T_reserve = pData[30]; if (env->ADC0_BTS5120_2EKA_Channel == 0) { env->ADC0_BTS5120_2EKA_Channel = 1; GpioPinSet(&env->gpios->power.BTS5120_2EKA_ShutoffValvePowerTXV.ShutSelTXV_SEL_Diag, true); GpioPinSet(&env->gpios->power.BTS5180_2EKA_ShutOFFValveFrontRear.ShutSel_SEL_Diag, true); GpioPinSet(&env->gpios->power.BTS5180_2EKA_TwoWayValveAndReservePowerSupply.TwoWayValve_SEL_Diag, true); GpioPinSet(&env->gpios->power.BTS5180_2EKA_FrontRearIncarMotor.Incar_SEL_Diag, true); GpioPinSet(&env->gpios->power.BTS5180_2EKA_2xChannelPTCPower.PtcRelayDriver_SEL_Diag, true); rtDW.ADC_Data_Model.BTS5120_2EKA_ShutoffValvePowerTXV1 = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5120_2EKA_ShutoffValvePowerTXV1, ADC0_data->BTS5120_2EKA_ShutoffValvePowerTXV1); rtDW.ADC_Data_Model.BTS5180_2EKA_ShutOFFValveFront = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5180_2EKA_ShutOFFValveFront, ADC0_data->BTS5180_2EKA_ShutOFFValveFront); rtDW.ADC_Data_Model.BTS5180_2EKA_TwoWayValve = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5180_2EKA_TwoWayValve, ADC0_data->BTS5180_2EKA_TwoWayValve); rtDW.ADC_Data_Model.BTS5180_2EKA_FrontIncarMotor = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5180_2EKA_FrontIncarMotor, ADC0_data->BTS5180_2EKA_FrontIncarMotor); rtDW.ADC_Data_Model.BTS5180_2EKA_ChannelPTCPower1 = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5180_2EKA_ChannelPTCPower1, ADC0_data->BTS5180_2EKA_ChannelPTCPower1); /* rtDW.ADC_Data_Model.BTS5120_2EKA_ShutoffValvePowerTXV1 = pData[22]; // rtDW.ADC_Data_Model.BTS5180_2EKA_ShutOFFValveFront = pData[24]; // rtDW.ADC_Data_Model.BTS5180_2EKA_TwoWayValve = pData[25]; // rtDW.ADC_Data_Model.BTS5180_2EKA_FrontIncarMotor = pData[26]; // rtDW.ADC_Data_Model.BTS5180_2EKA_ChannelPTCPower1 = pData[27]; // */ } else { env->ADC0_BTS5120_2EKA_Channel = 0; GpioPinSet(&env->gpios->power.BTS5120_2EKA_ShutoffValvePowerTXV.ShutSelTXV_SEL_Diag, false); GpioPinSet(&env->gpios->power.BTS5180_2EKA_ShutOFFValveFrontRear.ShutSel_SEL_Diag, false); GpioPinSet(&env->gpios->power.BTS5180_2EKA_TwoWayValveAndReservePowerSupply.TwoWayValve_SEL_Diag, false); GpioPinSet(&env->gpios->power.BTS5180_2EKA_FrontRearIncarMotor.Incar_SEL_Diag, false); GpioPinSet(&env->gpios->power.BTS5180_2EKA_2xChannelPTCPower.PtcRelayDriver_SEL_Diag, false); rtDW.ADC_Data_Model.BTS5120_2EKA_ShutoffValvePowerTXV2 = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5120_2EKA_ShutoffValvePowerTXV2, ADC0_data->BTS5120_2EKA_ShutoffValvePowerTXV2); rtDW.ADC_Data_Model.BTS5180_2EKA_ShutOFFValveRear = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5180_2EKA_ShutOFFValveRear, ADC0_data->BTS5180_2EKA_ShutOFFValveRear); rtDW.ADC_Data_Model.BTS5180_2EKA_ReservePowerSupply = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5180_2EKA_ReservePowerSupply, ADC0_data->BTS5180_2EKA_ReservePowerSupply); rtDW.ADC_Data_Model.BTS5180_2EKA_RearIncarMotor = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5180_2EKA_RearIncarMotor, ADC0_data->BTS5180_2EKA_RearIncarMotor); rtDW.ADC_Data_Model.BTS5180_2EKA_ChannelPTCPower2 = ADC_Filter_Update( &env->ADC0_Filter_data.BTS5180_2EKA_ChannelPTCPower2, ADC0_data->BTS5180_2EKA_ChannelPTCPower2); /* rtDW.ADC_Data_Model.BTS5120_2EKA_ShutoffValvePowerTXV2 = pData[22]; // rtDW.ADC_Data_Model.BTS5180_2EKA_ShutOFFValveRear = pData[24]; // rtDW.ADC_Data_Model.BTS5180_2EKA_ReservePowerSupply = pData[25]; // rtDW.ADC_Data_Model.BTS5180_2EKA_RearIncarMotor = pData[26]; // rtDW.ADC_Data_Model.BTS5180_2EKA_ChannelPTCPower2 = pData[27]; // */ } /* //////////////////////////////////////----DEBUG----//////////////////////////////////////////////////////////////////// BTS5180_120(env, "BTS5120_2EKA_ShutoffValvePowerTXV1", rtDW.ADC_Data_Model.BTS5120_2EKA_ShutoffValvePowerTXV1); BTS5180_120(env, "BTS5120_2EKA_ShutoffValvePowerTXV2", rtDW.ADC_Data_Model.BTS5120_2EKA_ShutoffValvePowerTXV2); BTS5180_120(env, "BTS5180_2EKA_ShutOFFValveFront", rtDW.ADC_Data_Model.BTS5180_2EKA_ShutOFFValveFront); BTS5180_120(env, "BTS5180_2EKA_ShutOFFValveRear", rtDW.ADC_Data_Model.BTS5180_2EKA_ShutOFFValveRear); BTS5180_120(env, "BTS5180_2EKA_TwoWayValve", rtDW.ADC_Data_Model.BTS5180_2EKA_TwoWayValve); BTS5180_120(env, "BTS5180_2EKA_ReservePowerSupply", rtDW.ADC_Data_Model.BTS5180_2EKA_ReservePowerSupply); BTS5180_120(env, "BTS5180_2EKA_FrontIncarMotor", rtDW.ADC_Data_Model.BTS5180_2EKA_FrontIncarMotor); BTS5180_120(env, "BTS5180_2EKA_RearIncarMotor", rtDW.ADC_Data_Model.BTS5180_2EKA_RearIncarMotor); BTS5180_120(env, "BTS5180_2EKA_ChannelPTCPower1", rtDW.ADC_Data_Model.BTS5180_2EKA_ChannelPTCPower1); BTS5180_120(env, "BTS5180_2EKA_ChannelPTCPower2", rtDW.ADC_Data_Model.BTS5180_2EKA_ChannelPTCPower2); ANALOG_SENSOR(env, "Sensor_Ambient_Temp", rtDW.ADC_Data_Model.Sensor_Ambient_Temp, TABLE_AMBIENT, 20000); ANALOG_SENSOR(env, "Sensor_AC_Pressure", rtDW.ADC_Data_Model.Sensor_AC_Pressure, TABLE_NONE, 0); ANALOG_SENSOR(env, "Sensor_Incar_Temp_FL", rtDW.ADC_Data_Model.Sensor_Incar_Temp_FL, TABLE_INCAR, 20000); ANALOG_SENSOR(env, "Sensor_Incar_Temp_RL", rtDW.ADC_Data_Model.Sensor_Incar_Temp_RL, TABLE_INCAR, 20000); ANALOG_SENSOR(env, "Sensor_Incar_Temp_FR", rtDW.ADC_Data_Model.Sensor_Incar_Temp_FR, TABLE_INCAR, 20000); ANALOG_SENSOR(env, "Sensor_Incar_Temp_RR", rtDW.ADC_Data_Model.Sensor_Incar_Temp_RR, TABLE_INCAR, 20000); ANALOG_SENSOR(env, "Sensor_Rear_Evap_Temp", rtDW.ADC_Data_Model.Sensor_Rear_Evap_Temp, TABLE_DUCT, 20000); ANALOG_SENSOR(env, "Sensor_Evap_Temp", rtDW.ADC_Data_Model.Sensor_Evap_Temp, TABLE_DUCT, 20000); ANALOG_SENSOR(env, "Sensor_Rear_Duct1 (dbg_Sen_Duct_RL_Fb)", rtDW.ADC_Data_Model.Sensor_Rear_Duct1, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Rear_Duct2 (dbg_Sen_Duct_RR_Fb)", rtDW.ADC_Data_Model.Sensor_Rear_Duct2, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Rear_Duct3 (dbg_Sen_Duct_RL_Side_Fb)", rtDW.ADC_Data_Model.Sensor_Rear_Duct3, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Rear_Duct4 (dbg_Sen_Duct_RR_Side_Fb)", rtDW.ADC_Data_Model.Sensor_Rear_Duct4, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Rear_Duct5", rtDW.ADC_Data_Model.Sensor_Rear_Duct5, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Rear_Duct6", rtDW.ADC_Data_Model.Sensor_Rear_Duct6, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Front_Duct1 (dbg_Sen_Duct_FL_Upper_Fb)", rtDW.ADC_Data_Model.Sensor_Front_Duct1, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Front_Duct2 (dbg_Sen_Duct_FR_Upper_Fb)", rtDW.ADC_Data_Model.Sensor_Front_Duct2, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Front_Duct3 (dbg_Sen_Duct_FL_Lower_Fb)", rtDW.ADC_Data_Model.Sensor_Front_Duct3, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Front_Duct4 (dbg_Sen_Duct_FR_Lower_Fb)", rtDW.ADC_Data_Model.Sensor_Front_Duct4, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Front_Duct5 (dbg_Sen_Duct_FL_Side_Fb)", rtDW.ADC_Data_Model.Sensor_Front_Duct5, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Sensor_Front_Duct6 (dbg_Sen_Duct_FR_Side_Fb)", rtDW.ADC_Data_Model.Sensor_Front_Duct6, TABLE_DUCT, 3000); ANALOG_SENSOR(env, "Reserve_Sensor_Duct_Temp_1", rtDW.ADC_Data_Model.Reserve_Sensor_Duct_Temp_1, TABLE_DUCT,20000); */ // ANALOG_SENSOR(env, "Sensor_Rear_Duct3", rtDW.ADC_Data_Model.Sensor_Rear_Duct3, TABLE_DUCT, 3000); // float Rntc = calculate_ntc_resistance(rtDW.ADC_Data_Model.Sensor_Rear_Duct3, 3000, 4.96f, 5, 4095); // LoggerFormatInfo(LOGGER, LOG_SIGN, "Rntc = %f", Rntc) /* ANALOG_SENSOR(env, "Pressure_DIAG", rtDW.ADC_Data_Model.Pressure_DIAG, TABLE_NONE, 0); ANALOG_SENSOR(env, "Reserve_Sensor_Duct_Temp_2", rtDW.ADC_Data_Model.Reserve_Sensor_Duct_Temp_2, TABLE_DUCT, 20000); */ /* ANALOG_SENSOR(env, "Sensor_PT_rHVAC_P", rtDW.ADC_Data_Model.Sensor_PT_rHVAC_P); ANALOG_SENSOR(env, "Sensor_A_T_reserve", rtDW.ADC_Data_Model.Sensor_A_T_reserve); */ //////////////////////////////////////----DEBUG----//////////////////////////////////////////////////////////////////// osMutexRelease(env->modelTaskAccess); } else { LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error Adc0_Thread"); } ++env->step; if (env->step > MAX_ADC_FILTER_SIZE) { SystemDelayMs(50); } } } uint32_t getRandom32(tAdc0Task *env) { uint32_t random = 0; osStatus_t status = osMessageQueueGet(env->queueRandom, &random, 0, 1500); if (status == osOK) { return random; } return 0; } void Adc_0_StartThread(tAdc0Task *env) { if (!env->thread.id) { env->thread.id = osThreadNew((osThreadFunc_t) (Adc0_Thread), (void *) (env), &env->thread.attr); } } void Adc_1_Init(tAdc1Task *env, osMutexId_t modelTaskAccess, tAdcIO *adcIO, tGpios *gpios, tLoggerInterface *logger) { env->adcIO = adcIO; env->modelTaskAccess = modelTaskAccess; env->logger = logger; env->access = osMutexNew(NULL); env->gpios = gpios; InitThreadAtrStatic(&env->thread.attr, "Adc1", env->thread.controlBlock, env->thread.stack, osPriorityNormal); } static _Noreturn void Adc1_Thread(tAdc1Task *env) { uint32_t ADC_Pointer_Data; for (;;) { env->ADC_ChannelCount = env->adcIO->get(env->adcIO->env, &ADC_Pointer_Data, 5000); if (osMutexAcquire(env->modelTaskAccess, 5000) == osOK) { uint32_t *pData = (uint32_t *) ADC_Pointer_Data; rtDW.ADC_Data_Model.VN7008AJ_DIAG_FrontLINActuatorPowerDriverAB = pData[0]; rtDW.ADC_Data_Model.VN7008AJ_DIAG_RearLINActuatorPowerDriverC = pData[1]; rtDW.ADC_Data_Model.PBATT_CHECK = pData[2]; rtDW.ADC_Data_Model.VN7008AJ_FrontLINActuatorPowerDriverAB = pData[3]; rtDW.ADC_Data_Model.VN7008AJ_RearLINActuatorPowerDriverC = pData[4]; /* rtDW.ADC_Data_Model.PT_F_HVAC_VCC_DIAG = pData[5]; // PT_F_HVAC_VCC_DIAG rtDW.ADC_Data_Model.PT_HVBchiller_VCC_DIAG = pData[6]; // PT_HVBchiller_VCC_DIAG rtDW.ADC_Data_Model.PT_R_HVAC_VCC_DIAG = pData[7]; // PT_R_HVAC_VCC_DIAG rtDW.ADC_Data_Model.Sensor_PT_fHVAC_P = pData[8]; rtDW.ADC_Data_Model.Sensor_PT_fHVAC_T = pData[9]; rtDW.ADC_Data_Model.Sensor_PT_rHVAC_T = pData[10]; rtDW.ADC_Data_Model.Sensor_HVBchiller_P = pData[11]; rtDW.ADC_Data_Model.Sensor_HVBchiller_T = pData[12]; rtDW.ADC_Data_Model.Sensor_PT_P_reserve = pData[13]; rtDW.ADC_Data_Model.Sensor_PT_T_reserve = pData[14]; rtDW.ADC_Data_Model.Sensor_B_T_reserve = pData[15]; */ //////////////////////////////////////----DEBUG----//////////////////////////////////////////////////////////////////// /* ANALOG_SENSOR(env, "PT_F_HVAC_VCC_DIAG", rtDW.ADC_Data_Model.PT_F_HVAC_VCC_DIAG); ANALOG_SENSOR(env, "PT_HVBchiller_VCC_DIAG", rtDW.ADC_Data_Model.PT_HVBchiller_VCC_DIAG); ANALOG_SENSOR(env, "PT_R_HVAC_VCC_DIAG", rtDW.ADC_Data_Model.PT_R_HVAC_VCC_DIAG); ANALOG_SENSOR(env, "Sensor_PT_fHVAC_P", rtDW.ADC_Data_Model.Sensor_PT_fHVAC_P); ANALOG_SENSOR(env, "Sensor_PT_rHVAC_T", rtDW.ADC_Data_Model.Sensor_PT_rHVAC_T); ANALOG_SENSOR(env, "Sensor_HVBchiller_P", rtDW.ADC_Data_Model.Sensor_HVBchiller_P); ANALOG_SENSOR(env, "Sensor_HVBchiller_T", rtDW.ADC_Data_Model.Sensor_HVBchiller_T); ANALOG_SENSOR(env, "Sensor_PT_P_reserve", rtDW.ADC_Data_Model.Sensor_PT_P_reserve); ANALOG_SENSOR(env, "Sensor_PT_T_reserve", rtDW.ADC_Data_Model.Sensor_PT_T_reserve); ANALOG_SENSOR(env, "Sensor_B_T_reserve", rtDW.ADC_Data_Model.Sensor_B_T_reserve); */ /* ANALOG_SENSOR(env, "VN7008AJ_DIAG_FrontLINActuatorPowerDriverAB", rtDW.ADC_Data_Model.VN7008AJ_DIAG_FrontLINActuatorPowerDriverAB, TABLE_NONE, 0); ANALOG_SENSOR(env, "VN7008AJ_DIAG_RearLINActuatorPowerDriverC", rtDW.ADC_Data_Model.VN7008AJ_DIAG_RearLINActuatorPowerDriverC, TABLE_NONE, 0); VN7008AJ(env, "VN7008AJ_FrontLINActuatorPowerDriverAB", rtDW.ADC_Data_Model.VN7008AJ_FrontLINActuatorPowerDriverAB); VN7008AJ(env, "VN7008AJ_RearLINActuatorPowerDriverC", rtDW.ADC_Data_Model.VN7008AJ_RearLINActuatorPowerDriverC); //////////////////////////////////////----DEBUG----//////////////////////////////////////////////////////////////////// */ // float V_ref = (float) pData[16] / 4095.0f * 5.0f; // LoggerFormatInfo(LOGGER, LOG_SIGN, "V_ref = %f", V_ref) osMutexRelease(env->modelTaskAccess); } else { LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error Adc1_Thread"); } ++env->step; if (env->step > MAX_ADC_FILTER_SIZE) { SystemDelayMs(50); } } } void Adc_1_StartThread(tAdc1Task *env) { if (!env->thread.id) { env->thread.id = osThreadNew((osThreadFunc_t) (Adc1_Thread), (void *) (env), &env->thread.attr); } }