This commit is contained in:
cfif 2026-03-31 15:43:59 +03:00
parent ca8937626d
commit f9284b8c03
1 changed files with 39 additions and 23 deletions

View File

@ -3,6 +3,21 @@
// //
#include "MainModesArbiter_Private.h" #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( void Mma_Init(
tMma *env, tMma *env,
tGpios *gpios, tGpios *gpios,
@ -26,25 +41,18 @@ static _Noreturn void Mma_Thread(tMma *env) {
// Запуск устройства // Запуск устройства
Mma_InitStage(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 Rwa = 60.0f;
float R100 = 21000.0f; // Это сколько нужно float Rwa100 = 21000.0f; // Это сколько сопротивление желаем
float R100ab = 100000.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) if (D100 > 255)
D100 = 255; D100 = 255;
@ -53,34 +61,42 @@ static _Noreturn void Mma_Thread(tMma *env) {
D100 = 0; D100 = 0;
float R10 = 3000.0f; // Это сколько нужно float Rwa10 = 3000.0f; // Это сколько сопротивление желаем
float R10ab = 10000.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) if (D10 > 255)
D10 = 255; D10 = 255;
if (D10 < 0) if (D10 < 0)
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 (;;) { for (;;) {
/* /*
GpioPinSet(&env->gpios->Led.ledR1, true); GpioPinSet(&env->gpios->Led.ledR1, true);
SystemDelayMs(1000); SystemDelayMs(100);
GpioPinSet(&env->gpios->Led.ledR1, false); GpioPinSet(&env->gpios->Led.ledR1, false);
SystemDelayMs(1000); SystemDelayMs(100);
*/ */
result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_1, D100); result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_1, D100);
asm("nop"); asm("nop");
result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_2, D10); result = setSpiSensor(&env->sensorSPI, SENSOR_TYPE_A, SENSOR_ADR_2, D10);
asm("nop"); 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");
/* /*