This commit is contained in:
cfif 2026-04-02 17:07:24 +03:00
parent d9f413af81
commit 9e83b78a13
1 changed files with 78 additions and 22 deletions

View File

@ -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 <stdint.h>
/**
* Расчет шагов для двухкаскадного цифрового потенциометра
@ -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");