From f9284b8c034f5e584a6913acb4a6ddca4a15af45 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 31 Mar 2026 15:43:59 +0300 Subject: [PATCH] Init --- MainModesArbiter.c | 62 +++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/MainModesArbiter.c b/MainModesArbiter.c index edc703b..17e7374 100644 --- a/MainModesArbiter.c +++ b/MainModesArbiter.c @@ -3,6 +3,21 @@ // #include "MainModesArbiter_Private.h" +// Функция расчета D для Rwa +int32_t calc_D_for_Rwa(float Rwa_desired, float Rab, float Rw) { + float D_float = 256.0f - ((Rwa_desired - Rw) / Rab) * 256.0f; + int32_t D = (int32_t)(D_float + 0.5f); // Округление + + if (D > 255) D = 255; + if (D < 0) D = 0; + + return D; +} + +// Параметры +const float Rw_typ = 60.0f; // Типовое сопротивление движка +const float Rw_max = 120.0f; // Максимальное (для консервативного расчета) + void Mma_Init( tMma *env, tGpios *gpios, @@ -26,25 +41,18 @@ static _Noreturn void Mma_Thread(tMma *env) { // Запуск устройства Mma_InitStage(env); - bool result; + bool result = false; +// Rwa — желаемое сопротивление между выводами W и A. +// Rab — полное номинальное сопротивление потенциометра (5, 10, 50 или 100 кОм). +// Rw — сопротивление движка (Wiper resistance). Типовое значение — 60 Ом (может варьироваться от 50 до 120 Ом). +// D — десятичное значение кода (от 0 до 255). /* - uint32_t step_100 = 100000 / 256; // ОМ - uint32_t R100 = 100000; - uint32_t R2 = 100000 - R100; // Для записи в регистр - uint32_t steps = R2 / step_100; - - uint32_t step_10 = 10000 / 256; // ОМ - uint32_t R10 = 10000; - uint32_t R3 = 10000 - R10; // Для записи в регистр - uint32_t steps2 = R3 / step_10; -*/ - float Rwa = 60.0f; - float R100 = 21000.0f; // Это сколько нужно + float Rwa100 = 21000.0f; // Это сколько сопротивление желаем float R100ab = 100000.0f; - int32_t D100 = (int32_t) (256.0f - (((R100 - Rwa) / R100ab) * 256.0f)); + int32_t D100 = (int32_t) (256.0f - (((Rwa100 - Rwa) / R100ab) * 256.0f)); if (D100 > 255) D100 = 255; @@ -53,34 +61,42 @@ static _Noreturn void Mma_Thread(tMma *env) { D100 = 0; - float R10 = 3000.0f; // Это сколько нужно + float Rwa10 = 3000.0f; // Это сколько сопротивление желаем float R10ab = 10000.0f; - int32_t D10 = (int32_t) (256.0f - (((R10 - Rwa) / R10ab) * 256.0f)); + int32_t D10 = (int32_t) (256.0f - (((Rwa10 - Rwa) / R10ab) * 256.0f)); if (D10 > 255) D10 = 255; if (D10 < 0) D10 = 0; +*/ +// Использование + float Rwa_desired_100k = 21000.0f; + float R_ab_100k = 100000.0f; + int32_t D100 = calc_D_for_Rwa(Rwa_desired_100k, R_ab_100k, Rw_typ); + + float Rwa_desired_10k = 3000.0f; + float R_ab_10k = 10000.0f; + int32_t D10 = calc_D_for_Rwa(Rwa_desired_10k, R_ab_10k, Rw_typ); for (;;) { /* GpioPinSet(&env->gpios->Led.ledR1, true); - SystemDelayMs(1000); + SystemDelayMs(100); GpioPinSet(&env->gpios->Led.ledR1, false); - SystemDelayMs(1000); + SystemDelayMs(100); */ result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_1, D100); - asm("nop"); - result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_2, D10); - asm("nop"); - - + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_3, D100); + asm("nop"); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_4, D10); + asm("nop"); /*