diff --git a/MainModesArbiter.c b/MainModesArbiter.c index 757f874..5145273 100644 --- a/MainModesArbiter.c +++ b/MainModesArbiter.c @@ -20,42 +20,33 @@ const float R_const = 163.4f; const float Rw_typ = 00.0f; //60.0f // Типовое сопротивление движка const float Rw_max = 120.0f; // Максимальное (для консервативного расчета) -/** - * Расчет шагов для двухкаскадного цифрового потенциометра - * Резисторы: 100 кОм (грубый) и 10 кОм (точный) - * Постоянное сопротивление: 171 Ом - * - * @param Rout_required Требуемое сопротивление в Омах - * @param CountStep100 Указатель для сохранения шагов грубого резистора (0-255) - * @param CountStep10 Указатель для сохранения шагов точного резистора (0-255) - * @return 0 - успех, -1 - ошибка - */ int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *CountStep10) { - const float R_constL = 0.0f;//150.4f; const float R_ab_100k = 100000.0f; - const float R_ab_10k = 10000.0f; + const float R_ab_10k = 10000.0f; + const float R_w_100k = 120.0f; + const float R_w_10k = 120.0f; + const float R__const = R_w_100k + R_w_10k; // 150 Ом — всегда присутствует - 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 Ом - const float Step100 = R_ab_100k / 256.0f; - const float Step10 = R_ab_10k / 256.0f; + // Вычитаем постоянную составляющую + float Rout = Rout_required - R__const; + if (Rout < 0.0f) Rout = 0.0f; - float Rout = Rout_required - R_constL; - if (Rout < 0) Rout = 0; - - *CountStep100 = (int32_t) (Rout / Step100); + // Расчёт грубого каскада (без вычитания R_w — он уже в R_const) + *CountStep100 = (int32_t)(Rout / Step100); if (*CountStep100 > 255) *CountStep100 = 255; - if (*CountStep100 < 0) *CountStep100 = 0; + if (*CountStep100 < 0) *CountStep100 = 0; - float R_tail = Rout - (float) (*CountStep100) * Step100; + // Остаток для точного каскада + float R_tail = Rout - (float)(*CountStep100) * Step100; + if (R_tail < 0.0f) R_tail = 0.0f; - if (R_tail < 0) R_tail = 0; - - *CountStep10 = (int32_t) (R_tail / Step10 + 0.5f); + // Расчёт точного каскада с округлением + *CountStep10 = (int32_t)(R_tail / Step10 + 0.5f); if (*CountStep10 > 255) *CountStep10 = 255; - if (*CountStep10 < 0) *CountStep10 = 0; + if (*CountStep10 < 0) *CountStep10 = 0; return 0; } @@ -216,11 +207,11 @@ static _Noreturn void Mma_Thread(tMma *env) { */ - float required_resistance = 10440.0f; + float required_resistance = 9282.03f; CalculateSteps(required_resistance, &step100, &step10); - step100 = 50; - step10 = 0; +// step100 = 50; +// step10 = 0; step100 = 255 - step100; step10 = 255 - step10; diff --git a/MainModesArbiter.h b/MainModesArbiter.h index dc723b3..f3ca49b 100644 --- a/MainModesArbiter.h +++ b/MainModesArbiter.h @@ -20,6 +20,7 @@ #include "CommandLines.h" #include "ArbiterCommand.h" #include "SpiPorts.h" +#include "LinSensorTasks.h" typedef struct { // Преферийные интерфесы @@ -42,6 +43,8 @@ typedef struct { tTaskSerial TaskSerialUSB2; + tLin5TaskSensor lin5TaskSensor; + tTaskReceivedSerial TaskReceivedSerialUSB1; tTaskReceivedSerial TaskReceivedSerialUSB2; diff --git a/MainModesArbiter_InitStage.c b/MainModesArbiter_InitStage.c index 6e58944..f682748 100644 --- a/MainModesArbiter_InitStage.c +++ b/MainModesArbiter_InitStage.c @@ -16,7 +16,7 @@ void Mma_InitComIntLog(tMma *env) { &env->slog, 3, &SERIAL_PORTS.cliVirtualPortOut_Io, - &SERIAL_PORTS.Rs485_HalfDuplexIo, + &SERIAL_PORTS.Rs485_USART2_HalfDuplexIo, &env->rtcs->rtcI0, SERIAL_LOGGER_SHOW_AUTHOR | SERIAL_LOGGER_SHOW_LOG_LEVEL, 1000 @@ -97,8 +97,16 @@ static void Mma_InitSubSystems(tMma *env) { Task_RECEIVED_SerialUSB2_StartThread(&env->TaskReceivedSerialUSB2); + + Lin_5_Init(&env->lin5TaskSensor, &env->serialPorts->LIN1_UART4_IO, &env->slog.logger); + Lin5_StartThread(&env->lin5TaskSensor); + + SensorSpi_Init(&env->sensorSPI, env->spiPorts, &env->gpios->conns); + + + LoggerInfoStatic(&env->slog.logger, LOG_TASK_MAIN, "End of subsystem initialization") }