This commit is contained in:
cfif 2026-05-29 15:09:13 +03:00
parent 120365628e
commit da9bdb9d39
2 changed files with 159 additions and 148 deletions

View File

@ -2,6 +2,10 @@
// Created by cfif on 05.05.23.
//
#include "MainModesArbiter_Private.h"
#include <stdlib.h>
#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");

View File

@ -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);
@ -65,7 +67,8 @@ static void Mma_InitSubSystems(tMma *env) {
&env->serialPorts->SerialPortUsb1IO,
&env->TaskSerialToCanCyclic0,
&env->TaskSerialToCanCyclic1,
&env->TaskSerialToCanSpontany
&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);
@ -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")
}