HVAC_M7_ADC_TASKS/AdcTasks.c

408 lines
18 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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(tAdcTask *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);
InitThreadAtrStatic(&env->thread.attr, "Adc0", env->thread.controlBlock, env->thread.stack,
osPriorityNormal);
}
void BTS5180_120(tAdcTask *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 /*|| 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 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(tAdcTask *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/* || adc_value <= ERROR_THRESHOLD_LOW_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(tAdcTask *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 = get_temperature_by_adc(temperature_table_duct_KST45_table_20000, 1024, 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)
}
}
static _Noreturn void Adc0_Thread(tAdcTask *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) {
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 = 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 = 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);
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(tAdcTask *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(tAdcTask *env) {
if (!env->thread.id) {
env->thread.id = osThreadNew((osThreadFunc_t) (Adc0_Thread), (void *) (env), &env->thread.attr);
}
}
void Adc_1_Init(tAdcTask *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(tAdcTask *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(tAdcTask *env) {
if (!env->thread.id) {
env->thread.id = osThreadNew((osThreadFunc_t) (Adc1_Thread), (void *) (env), &env->thread.attr);
}
}