530 lines
27 KiB
C
530 lines
27 KiB
C
//
|
||
// Created by cfif on 15.12.2025.
|
||
//
|
||
#include "AdcTasks.h"
|
||
#include "CmsisRtosThreadUtils.h"
|
||
#include <SystemDelayInterface.h>
|
||
#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, 4096, adc_value);
|
||
}
|
||
if (R == 20000) {
|
||
temp = get_temperature_by_adc(temperature_table_duct_KST45_table_20000, 4096, 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)
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
float calculate_ntc_resistance_case_a(uint16_t adc_value,
|
||
float R_series,
|
||
float V_ref,
|
||
uint16_t adc_max)
|
||
{
|
||
// Защита от деления на ноль и выхода за пределы
|
||
if (adc_value == 0) {
|
||
return 0.0f; // Rntc = 0 (короткое замыкание на GND)
|
||
}
|
||
if (adc_value >= adc_max) {
|
||
return 0.0f; // Rntc стремится к бесконечности (обрыв)
|
||
}
|
||
|
||
// Напряжение на NTC, измеренное АЦП
|
||
float V_ntc = (float)adc_value / adc_max * V_ref;
|
||
|
||
// Формула: V_ntc / V_ref = Rntc / (Rntc + R_series)
|
||
// Rntc = R_series * V_ntc / (V_ref - V_ntc)
|
||
float Rntc = R_series * V_ntc / (V_ref - V_ntc);
|
||
|
||
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_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_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", rtDW.ADC_Data_Model.Sensor_Rear_Duct1, TABLE_DUCT, 3000);
|
||
ANALOG_SENSOR(env, "Sensor_Rear_Duct2", rtDW.ADC_Data_Model.Sensor_Rear_Duct2, TABLE_DUCT, 3000);
|
||
ANALOG_SENSOR(env, "Sensor_Front_Duct1", rtDW.ADC_Data_Model.Sensor_Front_Duct1, TABLE_DUCT, 3000);
|
||
ANALOG_SENSOR(env, "Sensor_Front_Duct2", rtDW.ADC_Data_Model.Sensor_Front_Duct2, TABLE_DUCT, 3000);
|
||
ANALOG_SENSOR(env, "Sensor_Front_Duct3", rtDW.ADC_Data_Model.Sensor_Front_Duct3, TABLE_DUCT, 3000);
|
||
ANALOG_SENSOR(env, "Sensor_Front_Duct4", rtDW.ADC_Data_Model.Sensor_Front_Duct4, TABLE_DUCT, 3000);
|
||
ANALOG_SENSOR(env, "Sensor_Rear_Duct3", rtDW.ADC_Data_Model.Sensor_Rear_Duct3, TABLE_DUCT, 3000);
|
||
ANALOG_SENSOR(env, "Sensor_Rear_Duct4", rtDW.ADC_Data_Model.Sensor_Rear_Duct4, TABLE_DUCT, 3000);
|
||
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_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, "Reserve_Sensor_Duct_Temp_1", rtDW.ADC_Data_Model.Reserve_Sensor_Duct_Temp_1, TABLE_DUCT,
|
||
20000);
|
||
*/
|
||
// ANALOG_SENSOR(env, "Sensor_Front_Duct5", rtDW.ADC_Data_Model.Sensor_Front_Duct5, TABLE_DUCT, 3000);
|
||
|
||
ANALOG_SENSOR(env, "Sensor_Front_Duct6", rtDW.ADC_Data_Model.Sensor_Front_Duct6, TABLE_DUCT, 3000);
|
||
|
||
float Rntc = calculate_ntc_resistance_case_a(rtDW.ADC_Data_Model.Sensor_Front_Duct6,3000,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");
|
||
}
|
||
|
||
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----////////////////////////////////////////////////////////////////////
|
||
*/
|
||
|
||
osMutexRelease(env->modelTaskAccess);
|
||
} else {
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN, "Access error Adc1_Thread");
|
||
}
|
||
|
||
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);
|
||
}
|
||
} |