This commit is contained in:
cfif 2026-06-02 09:49:03 +03:00
parent b980d6bae1
commit 851c9b8ee1
1 changed files with 124 additions and 6 deletions

View File

@ -276,6 +276,82 @@ setResistanceInit(tTaskSerial *env, char *name, int16_t temperature, const Table
return (result1 && result2); 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) { void SerialCommand_Scheduler(tTaskSerial *env) {
osStatus_t status; osStatus_t status;
@ -416,8 +492,8 @@ void SerialCommand_Scheduler(tTaskSerial *env) {
SENSOR_ADR_11, SENSOR_ADR_12); SENSOR_ADR_11, SENSOR_ADR_12);
} }
if (AtCmdRxBeginWithStatic(&env->At, "Sen_Eva_F")) { if (AtCmdRxBeginWithStatic(&env->At, "Eva_F")) {
setResistance(env, "Sen_Eva_F", duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_A, setResistance(env, "Eva_F", duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_A,
SENSOR_ADR_13, SENSOR_ADR_14); SENSOR_ADR_13, SENSOR_ADR_14);
} }
@ -444,11 +520,48 @@ void SerialCommand_Scheduler(tTaskSerial *env) {
SENSOR_ADR_3, SENSOR_ADR_4); SENSOR_ADR_3, SENSOR_ADR_4);
} }
if (AtCmdRxBeginWithStatic(&env->At, "Sen_Eva_R")) { if (AtCmdRxBeginWithStatic(&env->At, "Eva_R")) {
setResistance(env, "Sen_Eva_R", duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_B, setResistance(env, "Eva_R", duct_lookup_table_20000, size_duct_lookup_table_20000, SENSOR_TYPE_B,
SENSOR_ADR_9, SENSOR_ADR_10); 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) { static _Noreturn void Serial_USB1_Thread(tTaskSerial *env) {
int16_t temperature = 250; int16_t temperature = 250;
int16_t pressure = 150;
setResistanceInit(env, "Duct_FL_Upper", temperature, duct_lookup_table_3000, size_duct_lookup_table_3000, setResistanceInit(env, "Duct_FL_Upper", temperature, duct_lookup_table_3000, size_duct_lookup_table_3000,
SENSOR_TYPE_A, SENSOR_TYPE_A,
@ -523,7 +637,7 @@ static _Noreturn void Serial_USB1_Thread(tTaskSerial *env) {
SENSOR_TYPE_A, SENSOR_TYPE_A,
SENSOR_ADR_11, SENSOR_ADR_11,
SENSOR_ADR_12); 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_TYPE_A,
SENSOR_ADR_13, SENSOR_ADR_13,
SENSOR_ADR_14); 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, setResistanceInit(env, "Duct_RR", temperature, duct_lookup_table_3000, size_duct_lookup_table_3000, SENSOR_TYPE_B,
SENSOR_ADR_3, SENSOR_ADR_3,
SENSOR_ADR_4); 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_TYPE_B,
SENSOR_ADR_9, SENSOR_ADR_9,
SENSOR_ADR_10); SENSOR_ADR_10);
@ -567,6 +681,10 @@ static _Noreturn void Serial_USB1_Thread(tTaskSerial *env) {
SENSOR_ADR_7, SENSOR_ADR_7,
SENSOR_ADR_8); SENSOR_ADR_8);
setPressureInit(env, "Pressure", pressure,
SENSOR_TYPE_D,
SENSOR_ADR_9, SENSOR_ADR_10);
for (;;) { for (;;) {
SerialCommand_Scheduler(env); SerialCommand_Scheduler(env);