From da9bdb9d3904db0e0a3a43f09281818296946e77 Mon Sep 17 00:00:00 2001 From: cfif Date: Fri, 29 May 2026 15:09:13 +0300 Subject: [PATCH] Init --- MainModesArbiter.c | 284 ++++++++++++++++++----------------- MainModesArbiter_InitStage.c | 23 ++- 2 files changed, 159 insertions(+), 148 deletions(-) diff --git a/MainModesArbiter.c b/MainModesArbiter.c index d388dda..275a23c 100644 --- a/MainModesArbiter.c +++ b/MainModesArbiter.c @@ -2,6 +2,10 @@ // Created by cfif on 05.05.23. // #include "MainModesArbiter_Private.h" +#include +#include "dig_pot.h" + +/* // Функция расчета D для Rwa int32_t calc_D_for_Rwa(float Rwa_desired, float Rab, float Rw) { @@ -16,11 +20,11 @@ int32_t calc_D_for_Rwa(float Rwa_desired, float Rab, float Rw) { // Параметры -const float R_const = 163.4f; +const float R_const = 130.0f; const float Rw_typ = 00.0f; //60.0f // Типовое сопротивление движка const float Rw_max = 120.0f; // Максимальное (для консервативного расчета) -int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *CountStep10) { +int32_t CalculateSteps(float Rout_required, uint8_t *CountStep100, uint8_t *CountStep10) { const float R_ab_100k = 100000.0f; const float R_ab_10k = 10000.0f; const float R_w_100k = 120.0f; @@ -30,6 +34,8 @@ int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *Coun const float Step100 = R_ab_100k / 256.0f; // ~390.625 Ом const float Step10 = R_ab_10k / 256.0f; // ~39.0625 Ом + + // Вычитаем постоянную составляющую float Rout = Rout_required - R__const; if (Rout < 0.0f) Rout = 0.0f; @@ -50,78 +56,9 @@ int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *Coun return 0; } +*/ -/** - * Расчет шагов для двухкаскадного цифрового потенциометра - * Приоритет заполнения точного резистора (10 кОм) - * Резисторы: 100 кОм (грубый) и 10 кОм (точный) - * Постоянное сопротивление: 163.4 Ом - * - * @param Rout_required Требуемое сопротивление в Омах - * @param CountStep100 Указатель для сохранения шагов грубого резистора (0-255) - * @param CountStep10 Указатель для сохранения шагов точного резистора (0-255) - * @return 0 - успех, -1 - ошибка - */ -/** - * Расчет шагов для двухкаскадного цифрового потенциометра - * Приоритет заполнения точного резистора (10 кОм) - * Резисторы: 100 кОм (грубый) и 10 кОм (точный) - * Постоянное сопротивление: 163.4 Ом - * - * @param Rout_required Требуемое сопротивление в Омах - * @param CountStep100 Указатель для сохранения шагов грубого резистора (0-255) - * @param CountStep10 Указатель для сохранения шагов точного резистора (0-255) - * @return 0 - успех, -1 - ошибка - */ -int32_t CalculateSteps2(float Rout_required, int32_t *CountStep100, int32_t *CountStep10) { - const float R_constL = 163.4f; - const float R_ab_100k = 100000.0f; - const float R_ab_10k = 10000.0f; - - if (CountStep100 == NULL || CountStep10 == NULL) { - return -1; - } - - const float Step100 = R_ab_100k / 256.0f; // ~390.625 Ом на шаг - const float Step10 = R_ab_10k / 256.0f; // ~39.0625 Ом на шаг - - float Rout = Rout_required - R_constL; - if (Rout < 0) Rout = 0; - - // Приоритет 1: Сначала заполняем точный резистор (10 кОм) - *CountStep10 = (int32_t) (Rout / Step10 + 0.5f); - if (*CountStep10 > 255) *CountStep10 = 255; - if (*CountStep10 < 0) *CountStep10 = 0; - - // Вычисляем остаток после установки точного резистора - float R_remaining = Rout - (float) (*CountStep10) * Step10; - if (R_remaining < 0) R_remaining = 0; - - // Приоритет 2: Остаток добираем грубым резистором (100 кОм) - *CountStep100 = (int32_t) (R_remaining / Step100 + 0.5f); - if (*CountStep100 > 255) *CountStep100 = 255; - if (*CountStep100 < 0) *CountStep100 = 0; - - // Опционально: корректировка для минимизации общей ошибки - // Если грубый резистор перекомпенсировал, уменьшаем точный - float R_actual = R_constL + (float) (*CountStep100) * Step100 + (float) (*CountStep10) * Step10; - float R_error = R_actual - Rout_required; - - // Если ошибка положительная и большая, пробуем скорректировать - if (R_error > Step10 && *CountStep10 > 0) { - // Уменьшаем точный резистор на 1 шаг - (*CountStep10)--; - // Пересчитываем грубый резистор - R_remaining = Rout - (float) (*CountStep10) * Step10; - if (R_remaining < 0) R_remaining = 0; - *CountStep100 = (int32_t) (R_remaining / Step100 + 0.5f); - if (*CountStep100 > 255) *CountStep100 = 255; - } - - return 0; -} - void Mma_Init( tMma *env, tGpios *gpios, @@ -147,73 +84,12 @@ static _Noreturn void Mma_Thread(tMma *env) { // Запуск устройства Mma_InitStage(env); - bool result = false; + /* + uint8_t step100, step10; + float required_resistance = 10860; -// Rwa — желаемое сопротивление между выводами W и A. -// Rab — полное номинальное сопротивление потенциометра (5, 10, 50 или 100 кОм). -// Rw — сопротивление движка (Wiper resistance). Типовое значение — 60 Ом (может варьироваться от 50 до 120 Ом). -// D — десятичное значение кода (от 0 до 255). -/* - float Rwa = 60.0f; - - float Rwa100 = 21000.0f; // Это сколько сопротивление желаем - float R100ab = 100000.0f; - int32_t D100 = (int32_t) (256.0f - (((Rwa100 - Rwa) / R100ab) * 256.0f)); - - if (D100 > 255) - D100 = 255; - - if (D100 < 0) - D100 = 0; - - - float Rwa10 = 3000.0f; // Это сколько сопротивление желаем - float R10ab = 10000.0f; - int32_t D10 = (int32_t) (256.0f - (((Rwa10 - Rwa) / R10ab) * 256.0f)); - - if (D10 > 255) - D10 = 255; - - if (D10 < 0) - D10 = 0; -*/ - - int32_t step100, step10; -/* -// Использование - float R_ab_100k = 100000.0f; - float R_ab_10k = 10000.0f; - float Step100 = R_ab_100k / 256.0f; // Шаг 100 кОм резистора - float Step10 = R_ab_10k / 256.0f; // Шаг 10 кОм резистора - - float Rout = 9000.0f - R_const; - int32_t CountStep100 = (int32_t) (Rout / Step100); // Целых шагов на резисторе 100 кОм - float R_tail = Rout - (float) CountStep100 * Step100; // Хвост нужного сопротивления (Ом) для резистора 10 кОм - int32_t CountStep10 = (int32_t) (R_tail / Step10 + 0.5f); // Шагов на резисторе 10 КОм (+ 0.5f для округления) - - - float Rwa_desired_100k = (float)CountStep100 * Step100; - step100 = calc_D_for_Rwa(Rwa_desired_100k, R_ab_100k, Rw_typ); - - float Rwa_desired_10k = (float)CountStep10 * Step10; - step10 = calc_D_for_Rwa(Rwa_desired_10k, R_ab_10k, Rw_typ); -*/ -/* - float Rwa_desired2_100k = 000.00f - R_const; - step100 = calc_D_for_Rwa(Rwa_desired2_100k, R_ab_100k, Rw_typ); - - float Rwa_desired2_10k = 9000.0f - R_const; - step10 = calc_D_for_Rwa(Rwa_desired2_10k, R_ab_10k, Rw_typ); -*/ - - - float required_resistance = 9282.03f; - CalculateSteps(required_resistance, &step100, &step10); - -// step100 = 50; -// step10 = 0; step100 = 255 - step100; step10 = 255 - step10; @@ -221,6 +97,142 @@ static _Noreturn void Mma_Thread(tMma *env) { result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_1, step100); result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_2, step10); + + required_resistance = 0.03f; // DUCT1 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - 20; + step10 = 255 - 20; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_1, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_2, step10); + + + + required_resistance = 3000.03f; // DUCT1 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_1, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_2, step10); + + + required_resistance = 4000.03f; // DUCT2 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_3, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_4, step10); + + + required_resistance = 5000.03f; // DUCT3 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_5, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_6, step10); + + + required_resistance = 6000.03f; // DUCT4 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_7, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_8, step10); + + + required_resistance = 7000.03f; // DUCT5 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_9, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_10, step10); + + + required_resistance = 8000.03f; // DUCT6 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_11, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_12, step10); + + + required_resistance = 9000.03f; // EVAP TEMP F + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_13, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_14, step10); + + + + //------------------ + + + required_resistance = 10000.03f; // DUCT1 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_1, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_2, step10); + + + required_resistance = 11000.03f; // DUCT2 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_3, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_4, step10); + + + required_resistance = 12000.03f; // DUCT3 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_5, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_6, step10); + + + required_resistance = 13000.03f; // DUCT4 + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_7, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_8, step10); + + + required_resistance = 14000.03f; // EVAP TEMP R + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; + + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_9, step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_B, SENSOR_ADR_10, step10); + +*/ asm("nop"); diff --git a/MainModesArbiter_InitStage.c b/MainModesArbiter_InitStage.c index 8d91c53..66ae95e 100644 --- a/MainModesArbiter_InitStage.c +++ b/MainModesArbiter_InitStage.c @@ -38,6 +38,8 @@ static void Mma_InitSubSystems(tMma *env) { Mma_InitComIntLog(env); LoggerInfoStatic(&env->slog.logger, LOG_TASK_MAIN, "Subsystem initialization") + SensorSpi_Init(&env->sensorSPI, env->spiPorts, &env->gpios->conns); + TaskSerialToCanCyclic0_Init(&env->TaskSerialToCanCyclic0, &env->canPorts->Can1_IO); @@ -62,10 +64,11 @@ static void Mma_InitSubSystems(tMma *env) { TaskSerialUSB1_Init(&env->TaskSerialUSB1, FROM_USB1, - &env->serialPorts->SerialPortUsb1IO, - &env->TaskSerialToCanCyclic0, - &env->TaskSerialToCanCyclic1, - &env->TaskSerialToCanSpontany + &env->serialPorts->SerialPortUsb1IO, + &env->TaskSerialToCanCyclic0, + &env->TaskSerialToCanCyclic1, + &env->TaskSerialToCanSpontany, + &env->sensorSPI ); TaskSerialUSB1_StartThread(&env->TaskSerialUSB1); @@ -75,7 +78,8 @@ static void Mma_InitSubSystems(tMma *env) { &env->serialPorts->SerialPortUsb2IO, &env->TaskSerialToCanCyclic0, &env->TaskSerialToCanCyclic1, - &env->TaskSerialToCanSpontany + &env->TaskSerialToCanSpontany, + &env->sensorSPI ); TaskSerialUSB2_StartThread(&env->TaskSerialUSB2); @@ -90,9 +94,9 @@ static void Mma_InitSubSystems(tMma *env) { Task_RECEIVED_SerialUSB2_Init(&env->TaskReceivedSerialUSB2, - &env->canPorts->Can1_IO, + &env->canPorts->Can1_IO, FROM_USB2, - &env->serialPorts->SerialPortUsb2IO); + &env->serialPorts->SerialPortUsb2IO); Task_RECEIVED_SerialUSB2_StartThread(&env->TaskReceivedSerialUSB2); @@ -101,11 +105,6 @@ static void Mma_InitSubSystems(tMma *env) { Lin5_StartThread(&env->lin5TaskSensor); - SensorSpi_Init(&env->sensorSPI, env->spiPorts, &env->gpios->conns); - - - - LoggerInfoStatic(&env->slog.logger, LOG_TASK_MAIN, "End of subsystem initialization") }