diff --git a/ArbiterCommand.c b/ArbiterCommand.c index 4b64c74..ca430bc 100644 --- a/ArbiterCommand.c +++ b/ArbiterCommand.c @@ -276,6 +276,82 @@ setResistanceInit(tTaskSerial *env, char *name, int16_t temperature, const Table return (result1 && result2); } + +// Коэффициенты перевода +#define ATM_TO_KGF_CM2 1.033227f + +/** + * @brief Рассчитать R1 по заданному давлению в атмосферах + * + * @param p_atm Давление в атмосферах (атм), при котором Vout = Vref * R1/(R1+R2) + * @param r2 Нижний резистор делителя (Ом) + * @param vref Опорное напряжение АЦП (В) + * @param vdd Напряжение питания датчика (В) + * @return float Сопротивление R1 (Ом), или 0.0f если делитель не нужен + */ +float calculate_r1_for_pressure_atm(float p_atm, float r2, float vref, float vdd) +{ + // Переводим давление в кгс/см² + float p_kgf = p_atm * ATM_TO_KGF_CM2; + + // Напряжение датчика при давлении P (в кгс/см²) + float vsensor = vdd * (0.025f * p_kgf + 0.1f); + + // Проверка: Vref должно быть больше Vsensor + if (vref <= vsensor) { + return 0.0f; // Делитель не нужен или нужен усилитель + } + + // Расчёт R1 + float r1 = (r2 * vsensor) / (vref - vsensor); + + return r1; +} + +static bool +setPressure(tTaskSerial *env, char *name, + tSensorType sensorType, + tSensorAdr sensorAdr1, tSensorAdr sensorAdr2) { + + char *start = env->At.rxBuffer.data + strlen(name); + int16_t pressure = atoi(start); + + uint32_t r1 = (uint32_t)calculate_r1_for_pressure_atm((float)pressure / 10, 51000.0f, 4.96f, 5.0f); + + uint8_t step100; + uint8_t step10; + find_steps_for_resistance(r1, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + bool result1 = setSpiSensor(env->sensorSPI, sensorType, sensorAdr1, step100); + bool result2 = setSpiSensor(env->sensorSPI, sensorType, sensorAdr2, step10); + + return (result1 && result2); +} + +static bool +setPressureInit(tTaskSerial *env, char *name, int16_t pressure, + tSensorType sensorType, + tSensorAdr sensorAdr1, tSensorAdr sensorAdr2) { + + uint32_t r1 = (uint32_t)calculate_r1_for_pressure_atm((float)pressure / 10, 51000.0f, 4.96f, 5.0f); + + uint8_t step100; + uint8_t step10; + find_steps_for_resistance(r1, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + bool result1 = setSpiSensor(env->sensorSPI, sensorType, sensorAdr1, step100); + bool result2 = setSpiSensor(env->sensorSPI, sensorType, sensorAdr2, step10); + + return (result1 && result2); +} + + void SerialCommand_Scheduler(tTaskSerial *env) { osStatus_t status; @@ -416,8 +492,8 @@ void SerialCommand_Scheduler(tTaskSerial *env) { SENSOR_ADR_11, SENSOR_ADR_12); } - if (AtCmdRxBeginWithStatic(&env->At, "Sen_Eva_F")) { - setResistance(env, "Sen_Eva_F", duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_A, + if (AtCmdRxBeginWithStatic(&env->At, "Eva_F")) { + setResistance(env, "Eva_F", duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_A, SENSOR_ADR_13, SENSOR_ADR_14); } @@ -444,11 +520,48 @@ void SerialCommand_Scheduler(tTaskSerial *env) { SENSOR_ADR_3, SENSOR_ADR_4); } - if (AtCmdRxBeginWithStatic(&env->At, "Sen_Eva_R")) { - setResistance(env, "Sen_Eva_R", duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_B, + if (AtCmdRxBeginWithStatic(&env->At, "Eva_R")) { + setResistance(env, "Eva_R", duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_B, SENSOR_ADR_9, SENSOR_ADR_10); } + + + if (AtCmdRxBeginWithStatic(&env->At, "Incar_FL")) { + setResistance(env, "Incar_FL", incar_lookup_table_20000, size_incar_lookup_table_20000, + SENSOR_TYPE_D, + SENSOR_ADR_1, + SENSOR_ADR_2); + } + + if (AtCmdRxBeginWithStatic(&env->At, "Incar_FL")) { + setResistance(env, "Incar_FL", incar_lookup_table_20000, size_incar_lookup_table_20000, + SENSOR_TYPE_D, + SENSOR_ADR_5, + SENSOR_ADR_6); + } + + if (AtCmdRxBeginWithStatic(&env->At, "Incar_FR")) { + setResistance(env, "Incar_FR", incar_lookup_table_20000, size_incar_lookup_table_20000, + SENSOR_TYPE_D, + SENSOR_ADR_3, + SENSOR_ADR_4); + } + + if (AtCmdRxBeginWithStatic(&env->At, "Incar_RR")) { + setResistance(env, "Incar_RR", incar_lookup_table_20000, size_incar_lookup_table_20000, + SENSOR_TYPE_D, + SENSOR_ADR_7, + SENSOR_ADR_8); + } + + + if (AtCmdRxBeginWithStatic(&env->At, "Pressure")) { + setPressure(env, "Pressure", + SENSOR_TYPE_D, + SENSOR_ADR_9, SENSOR_ADR_10); + } + } @@ -498,6 +611,7 @@ void TaskSerialUSB1_Init(tTaskSerial *env, static _Noreturn void Serial_USB1_Thread(tTaskSerial *env) { int16_t temperature = 250; + int16_t pressure = 150; setResistanceInit(env, "Duct_FL_Upper", temperature, duct_lookup_table_3000, size_duct_lookup_table_3000, SENSOR_TYPE_A, @@ -523,7 +637,7 @@ static _Noreturn void Serial_USB1_Thread(tTaskSerial *env) { SENSOR_TYPE_A, SENSOR_ADR_11, SENSOR_ADR_12); - setResistanceInit(env, "Sen_Eva_F", temperature, duct_lookup_table_20000, size_duct_lookup_table_20000, + setResistanceInit(env, "Eva_F", temperature, duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_A, SENSOR_ADR_13, SENSOR_ADR_14); @@ -541,7 +655,7 @@ static _Noreturn void Serial_USB1_Thread(tTaskSerial *env) { setResistanceInit(env, "Duct_RR", temperature, duct_lookup_table_3000, size_duct_lookup_table_3000, SENSOR_TYPE_B, SENSOR_ADR_3, SENSOR_ADR_4); - setResistanceInit(env, "Sen_Eva_R", temperature, duct_lookup_table_20000, size_duct_lookup_table_20000, + setResistanceInit(env, "Eva_R", temperature, duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_B, SENSOR_ADR_9, SENSOR_ADR_10); @@ -567,6 +681,10 @@ static _Noreturn void Serial_USB1_Thread(tTaskSerial *env) { SENSOR_ADR_7, SENSOR_ADR_8); + setPressureInit(env, "Pressure", pressure, + SENSOR_TYPE_D, + SENSOR_ADR_9, SENSOR_ADR_10); + for (;;) { SerialCommand_Scheduler(env);