From 9e83b78a13e46a6ee503c0d24e57b53bc87b8d20 Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 2 Apr 2026 17:07:24 +0300 Subject: [PATCH] Init --- MainModesArbiter.c | 100 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 22 deletions(-) diff --git a/MainModesArbiter.c b/MainModesArbiter.c index 6455df2..e5d7948 100644 --- a/MainModesArbiter.c +++ b/MainModesArbiter.c @@ -2,7 +2,7 @@ // Created by cfif on 05.05.23. // #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; @@ -13,16 +13,12 @@ int32_t calc_D_for_Rwa(float Rwa_desired, float Rab, float Rw) { return D; } -*/ + // Параметры -/* -const float R_const = 171.0f; + +const float R_const = 163.4f; const float Rw_typ = 00.0f; //60.0f // Типовое сопротивление движка const float Rw_max = 120.0f; // Максимальное (для консервативного расчета) -*/ - - -#include /** * Расчет шагов для двухкаскадного цифрового потенциометра @@ -35,7 +31,7 @@ const float Rw_max = 120.0f; // Максимальное (для консе * @return 0 - успех, -1 - ошибка */ int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *CountStep10) { - const float R_const = 171.0f; + const float R_constL = 163.4f; const float R_ab_100k = 100000.0f; const float R_ab_10k = 10000.0f; @@ -46,7 +42,47 @@ int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *Coun const float Step100 = R_ab_100k / 256.0f; const float Step10 = R_ab_10k / 256.0f; - float Rout = Rout_required - R_const; + float Rout = Rout_required - R_constL; + if (Rout < 0) Rout = 0; + + *CountStep100 = (int32_t) (Rout / Step100); + if (*CountStep100 > 255) *CountStep100 = 255; + if (*CountStep100 < 0) *CountStep100 = 0; + + float R_tail = Rout - (float) (*CountStep100) * Step100; + if (R_tail < 0) R_tail = 0; + + *CountStep10 = (int32_t) (R_tail / Step10 + 0.5f); + if (*CountStep10 > 255) *CountStep10 = 255; + if (*CountStep10 < 0) *CountStep10 = 0; + + return 0; +} + + +/** + * Расчет шагов для двухкаскадного цифрового потенциометра + * Приоритет заполнения точного резистора (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, float R_constS,float R_constL, int32_t *CountStep100, int32_t *CountStep10) { + 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; + const float Step10 = R_ab_10k / 256.0f; + + float Rout = Rout_required - R_constS + R_constL; if (Rout < 0) Rout = 0; *CountStep100 = (int32_t) (Rout / Step100); @@ -117,21 +153,41 @@ static _Noreturn void Mma_Thread(tMma *env) { D10 = 0; */ -// Использование -/* - float Rwa_desired_100k = 7000.0f - R_const;//10000.0f; - float R_ab_100k = 100000.0f; - int32_t D100 = calc_D_for_Rwa(Rwa_desired_100k, R_ab_100k, Rw_typ); + int32_t step100, step10; - float Rwa_desired_10k = 0;//8701.0f - R_const; +// Использование + float R_ab_100k = 100000.0f; float R_ab_10k = 10000.0f; - int32_t D10 = calc_D_for_Rwa(Rwa_desired_10k, R_ab_10k, Rw_typ); + 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); */ - int32_t step100, step10; - float required_resistance = 7000.0f; - CalculateSteps(required_resistance, &step100, &step10); + float required_resistance = 2000.00f; +// CalculateSteps2(required_resistance, 0, 0, &step100, &step10); + CalculateSteps(required_resistance, &step100, &step10); + + step100 = 255 - step100; + step10 = 255 - step10; asm("nop"); @@ -174,7 +230,7 @@ static _Noreturn void Mma_Thread(tMma *env) { - result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_1, 255 - step100); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_1, step100); asm("nop"); // ++step; @@ -182,7 +238,7 @@ static _Noreturn void Mma_Thread(tMma *env) { // step =0; - result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_2, 255 - step10); + result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_2, step10); asm("nop");