This commit is contained in:
cfif 2026-05-18 17:40:41 +03:00
parent 06524546a3
commit c392b084a3
3 changed files with 33 additions and 31 deletions

View File

@ -20,40 +20,31 @@ const float R_const = 163.4f;
const float Rw_typ = 00.0f; //60.0f // Типовое сопротивление движка const float Rw_typ = 00.0f; //60.0f // Типовое сопротивление движка
const float Rw_max = 120.0f; // Максимальное (для консервативного расчета) const float Rw_max = 120.0f; // Максимальное (для консервативного расчета)
/**
* Расчет шагов для двухкаскадного цифрового потенциометра
* Резисторы: 100 кОм (грубый) и 10 кОм (точный)
* Постоянное сопротивление: 171 Ом
*
* @param Rout_required Требуемое сопротивление в Омах
* @param CountStep100 Указатель для сохранения шагов грубого резистора (0-255)
* @param CountStep10 Указатель для сохранения шагов точного резистора (0-255)
* @return 0 - успех, -1 - ошибка
*/
int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *CountStep10) { int32_t CalculateSteps(float Rout_required, int32_t *CountStep100, int32_t *CountStep10) {
const float R_constL = 0.0f;//150.4f;
const float R_ab_100k = 100000.0f; const float R_ab_100k = 100000.0f;
const float R_ab_10k = 10000.0f; const float R_ab_10k = 10000.0f;
const float R_w_100k = 120.0f;
const float R_w_10k = 120.0f;
const float R__const = R_w_100k + R_w_10k; // 150 Ом — всегда присутствует
if (CountStep100 == NULL || CountStep10 == NULL) { const float Step100 = R_ab_100k / 256.0f; // ~390.625 Ом
return -1; const float Step10 = R_ab_10k / 256.0f; // ~39.0625 Ом
}
const float Step100 = R_ab_100k / 256.0f; // Вычитаем постоянную составляющую
const float Step10 = R_ab_10k / 256.0f; float Rout = Rout_required - R__const;
if (Rout < 0.0f) Rout = 0.0f;
float Rout = Rout_required - R_constL; // Расчёт грубого каскада (без вычитания R_w — он уже в R_const)
if (Rout < 0) Rout = 0; *CountStep100 = (int32_t)(Rout / Step100);
*CountStep100 = (int32_t) (Rout / Step100);
if (*CountStep100 > 255) *CountStep100 = 255; if (*CountStep100 > 255) *CountStep100 = 255;
if (*CountStep100 < 0) *CountStep100 = 0; if (*CountStep100 < 0) *CountStep100 = 0;
float R_tail = Rout - (float) (*CountStep100) * Step100; // Остаток для точного каскада
float R_tail = Rout - (float)(*CountStep100) * Step100;
if (R_tail < 0.0f) R_tail = 0.0f;
if (R_tail < 0) R_tail = 0; // Расчёт точного каскада с округлением
*CountStep10 = (int32_t)(R_tail / Step10 + 0.5f);
*CountStep10 = (int32_t) (R_tail / Step10 + 0.5f);
if (*CountStep10 > 255) *CountStep10 = 255; if (*CountStep10 > 255) *CountStep10 = 255;
if (*CountStep10 < 0) *CountStep10 = 0; if (*CountStep10 < 0) *CountStep10 = 0;
@ -216,11 +207,11 @@ static _Noreturn void Mma_Thread(tMma *env) {
*/ */
float required_resistance = 10440.0f; float required_resistance = 9282.03f;
CalculateSteps(required_resistance, &step100, &step10); CalculateSteps(required_resistance, &step100, &step10);
step100 = 50; // step100 = 50;
step10 = 0; // step10 = 0;
step100 = 255 - step100; step100 = 255 - step100;
step10 = 255 - step10; step10 = 255 - step10;

View File

@ -20,6 +20,7 @@
#include "CommandLines.h" #include "CommandLines.h"
#include "ArbiterCommand.h" #include "ArbiterCommand.h"
#include "SpiPorts.h" #include "SpiPorts.h"
#include "LinSensorTasks.h"
typedef struct { typedef struct {
// Преферийные интерфесы // Преферийные интерфесы
@ -42,6 +43,8 @@ typedef struct {
tTaskSerial TaskSerialUSB2; tTaskSerial TaskSerialUSB2;
tLin5TaskSensor lin5TaskSensor;
tTaskReceivedSerial TaskReceivedSerialUSB1; tTaskReceivedSerial TaskReceivedSerialUSB1;
tTaskReceivedSerial TaskReceivedSerialUSB2; tTaskReceivedSerial TaskReceivedSerialUSB2;

View File

@ -16,7 +16,7 @@ void Mma_InitComIntLog(tMma *env) {
&env->slog, &env->slog,
3, 3,
&SERIAL_PORTS.cliVirtualPortOut_Io, &SERIAL_PORTS.cliVirtualPortOut_Io,
&SERIAL_PORTS.Rs485_HalfDuplexIo, &SERIAL_PORTS.Rs485_USART2_HalfDuplexIo,
&env->rtcs->rtcI0, &env->rtcs->rtcI0,
SERIAL_LOGGER_SHOW_AUTHOR | SERIAL_LOGGER_SHOW_LOG_LEVEL, SERIAL_LOGGER_SHOW_AUTHOR | SERIAL_LOGGER_SHOW_LOG_LEVEL,
1000 1000
@ -97,8 +97,16 @@ static void Mma_InitSubSystems(tMma *env) {
Task_RECEIVED_SerialUSB2_StartThread(&env->TaskReceivedSerialUSB2); Task_RECEIVED_SerialUSB2_StartThread(&env->TaskReceivedSerialUSB2);
Lin_5_Init(&env->lin5TaskSensor, &env->serialPorts->LIN1_UART4_IO, &env->slog.logger);
Lin5_StartThread(&env->lin5TaskSensor);
SensorSpi_Init(&env->sensorSPI, env->spiPorts, &env->gpios->conns); SensorSpi_Init(&env->sensorSPI, env->spiPorts, &env->gpios->conns);
LoggerInfoStatic(&env->slog.logger, LOG_TASK_MAIN, "End of subsystem initialization") LoggerInfoStatic(&env->slog.logger, LOG_TASK_MAIN, "End of subsystem initialization")
} }