diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/arm_defines.h b/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/arm_defines.h
index fae0001..097b0e0 100644
--- a/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/arm_defines.h
+++ b/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/arm_defines.h
@@ -106,3 +106,30 @@
#define __WFE()
#define __DMB()
+
+/**
+ \brief Reverse bit order of value
+ \details Reverses the bit order of the given value.
+ \param [in] value Value to reverse
+ \return Reversed value
+ */
+#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
+ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
+#define __RBIT __rbit
+#else
+__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
+{
+ uint32_t result;
+ uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
+
+ result = value; /* r will be reversed bits of v; first get LSB of v */
+ for (value >>= 1U; value != 0U; value >>= 1U)
+ {
+ result <<= 1U;
+ result |= value & 1U;
+ s--;
+ }
+ result <<= s; /* shift when v's highest bits are zero */
+ return result;
+}
+#endif
\ No newline at end of file
diff --git a/MATLAB/MCU_Wrapper/run_mex.bat b/MATLAB/MCU_Wrapper/run_mex.bat
index 849620d..cd685c5 100644
--- a/MATLAB/MCU_Wrapper/run_mex.bat
+++ b/MATLAB/MCU_Wrapper/run_mex.bat
@@ -84,6 +84,7 @@ set code_PERIPH=.\MCU_STM32_Matlab\stm32_matlab_conf.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c^
+ .\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_can.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c^
diff --git a/MATLAB/app_wrapper/app_init.c b/MATLAB/app_wrapper/app_init.c
index e1f0f65..661aa7a 100644
--- a/MATLAB/app_wrapper/app_init.c
+++ b/MATLAB/app_wrapper/app_init.c
@@ -23,6 +23,7 @@ void app_init(void) {
MX_TIM1_Init();
MX_TIM2_Init();
MX_TIM3_Init();
+ MX_USART6_UART_Init();
MX_TIM8_Init();
MX_TIM5_Init();
MX_ADC3_Init();
diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c
index 0567512..588716b 100644
--- a/MATLAB/app_wrapper/app_io.c
+++ b/MATLAB/app_wrapper/app_io.c
@@ -125,6 +125,8 @@ void Write_AngleControl(real_T* Buffer, int ind_port)
WriteOutputArray(upp.hangle.Iref, ind_port, nn++);
WriteOutputArray(upp.hangle.Imeas, ind_port, nn++);
WriteOutputArray(upp.hangle.alpha, ind_port, nn++);
+ WriteOutputArray(upp.hangle.f.CurrentLimited, ind_port, nn++);
+ WriteOutputArray(upp.hangle.f.RazgonDone, ind_port, nn++);
#define get_diff(ccrx) ((long long)(upp.hangle.htim->Instance->ccrx) - upp.hangle.htim->Instance->CNT)
diff --git a/MATLAB/upp_init.m b/MATLAB/upp_init.m
index a3796d6..13b9063 100644
--- a/MATLAB/upp_init.m
+++ b/MATLAB/upp_init.m
@@ -2,6 +2,7 @@ clear all
IadcMax = 53;%200;%53;
VadcMax = 1216;
+Va = 3;
Ts = 5e-6;
Vnom = 690;
diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx
index b607c74..79d21f5 100644
Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ
diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h
index 5c24c99..fe8a636 100644
--- a/UPP/Core/Configs/upp_config.h
+++ b/UPP/Core/Configs/upp_config.h
@@ -24,7 +24,7 @@
#define UPP_SET_DEFAULT ///< Установить настройки по умолчанию
#define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках
-//#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП
+#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП
//#define UPP_DISABLE_PROTECT_BOARDPOWER ///< Отключить проверки питания плат (+24, +5 В)
//#define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы
diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h
index 2cb857a..375fe32 100644
--- a/UPP/Core/Configs/upp_defs.h
+++ b/UPP/Core/Configs/upp_defs.h
@@ -118,6 +118,11 @@ typedef struct
*/
typedef struct
{
+ uint16_t NoConnectionPCH:1;
+ uint16_t NoInputVoltage:1;
+ uint16_t CurrentLimited:1;
+ uint16_t OverVoltage:1;
+ uint16_t UnderVoltage:1;
}UPP_PUI_Warnings_t;
/**
@@ -145,17 +150,17 @@ typedef struct {
uint16_t Fbc; /** @brief Адрес 12: Частота напряжения фазы BC, Герцы */
uint16_t Fca; /** @brief Адрес 13: Частота напряжения фазы CA, Герцы */
- uint16_t Temperature1; /** @brief Адрес 14: Температура радиатора тиристоров, Градусы Цельсия */
- uint16_t Temperature2; /** @brief Адрес 15: Температура радиатора тиристоров, Градусы Цельсия */
+ uint16_t Trad; /** @brief Адрес 14: Температура радиатора тиристоров, Градусы Цельсия */
+ uint16_t Tshkaf; /** @brief Адрес 15: Температура внутри шкафа УПП, Градусы Цельсия */
- uint16_t reserved[10]; /** @brief Адрес 16-49: Зарезервированны*/
+ uint16_t reserved[34]; /** @brief Адрес 16-49: Зарезервированны */
union
{
uint16_t all;
UPP_PUI_Warnings_t warn;
- }Warnings; /** @brief Адрес 4: Частота напряжения на входе УПП */
+ }Warnings; /** @brief Адрес 50: Предупреждения УПП */
} UPP_PUI_Values_t;
/**
@@ -230,8 +235,8 @@ typedef struct {
#define I_A 1
#define I_B 2
/* Температуры */
-#define TEMP_1 0
-#define TEMP_2 1
+#define TEMP_RAD 0
+#define TEMP_SHKAF 1
/* Перерасчеты в тики */
#define PM_SLOW_PERIOD_CNT (PM_SLOW_PERIOD_US/PM_FAST_PERIOD_US) ///< Период обновления медленных расчетов тиках @ref PM_FAST_PERIOD_US
diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c
index 6bca9cd..602259d 100644
--- a/UPP/Core/PowerMonitor/power_monitor.c
+++ b/UPP/Core/PowerMonitor/power_monitor.c
@@ -107,8 +107,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
ADC_UpdateTemperatures(&hpm->adc);
float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1];
float t2 = hpm->adc.Data[ADC_CHANNEL_TEMP2];
- meas->final.T[TEMP_1] = Filter_Process(&hpm->avg[AVG_TEMP1], t1);
- meas->final.T[TEMP_2] = Filter_Process(&hpm->avg[AVG_TEMP2], t2);
+ meas->final.T[TEMP_RAD] = Filter_Process(&hpm->avg[AVG_TEMP1], t1);
+ meas->final.T[TEMP_SHKAF] = Filter_Process(&hpm->avg[AVG_TEMP2], t2);
/* Расчет третьей фазы */
meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_AB], meas->slow.U[U_CA]);
@@ -198,8 +198,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
ADC_UpdateRegular(&hpm->adc);
/* Заполняем Напряжения/Токи в о.е. */
- meas->fast.U[U_AB] = hpm->adc.Data[ADC_CHANNEL_UBA]/u_base;
- meas->fast.U[U_CA] = hpm->adc.Data[ADC_CHANNEL_UAC]/u_base;
+ meas->fast.U[U_AB] = -hpm->adc.Data[ADC_CHANNEL_UBA]/u_base;
+ meas->fast.U[U_CA] = -hpm->adc.Data[ADC_CHANNEL_UAC]/u_base;
// meas->fast.U[U_AB] = Filter_Process(&hpm->ufltr[U_AB], uba_fast);
// meas->fast.U[U_CA] = Filter_Process(&hpm->ufltr[U_CA], uac_fast);
meas->fast.U[U_BC] = U_BC_calc(meas->fast.U[U_AB], meas->fast.U[U_CA]);
diff --git a/UPP/Core/PowerMonitor/power_protect.c b/UPP/Core/PowerMonitor/power_protect.c
index 9b75079..9b46e87 100644
--- a/UPP/Core/PowerMonitor/power_protect.c
+++ b/UPP/Core/PowerMonitor/power_protect.c
@@ -214,11 +214,11 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UP
/*=============== ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ==================*/
- if(measure->final.T[TEMP_1] > lTerr)
+ if(measure->final.T[TEMP_RAD] > lTerr)
{
ERR_PRIVATE->temp_err = 1;
}
- else if (measure->final.T[TEMP_1] > lTwarn)
+ else if (measure->final.T[TEMP_RAD] > lTwarn)
{
ERR_PRIVATE->temp_warn = 1;
}
diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c
index 29deae4..7651ed8 100644
--- a/UPP/Core/UPP/angle_control.c
+++ b/UPP/Core/UPP/angle_control.c
@@ -78,11 +78,14 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement, float
hangle->Iref = Filter_Process(&hangle->refFilter, setpoint);
hangle->f.RazgonDone = (fabsf(hangle->Iref - u2f(PARAM_PUI->Iref, 100)) < 0.1);;
-
- hangle->Imeas = measurement;
-
+ hangle->Imeas = measurement;
/* Ошибка регулирования = уставка - измеренное */
float err = hangle->Iref - hangle->Imeas;
+
+ /* Определяем ограничение тока */
+ // Если ошибка меньше порога, значит ток удерживается на заданном уровне Iref
+ float error_threshold = 0.1f*hangle->Iref; // Порог в 10%
+ hangle->f.CurrentLimited = (fabsf(err) > error_threshold) ? 0 : 1;
/* ПИД регулирование */
float open_level = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано
diff --git a/UPP/Core/UPP/angle_control.h b/UPP/Core/UPP/angle_control.h
index fe27daa..ac1e946 100644
--- a/UPP/Core/UPP/angle_control.h
+++ b/UPP/Core/UPP/angle_control.h
@@ -37,9 +37,10 @@ typedef struct
FilterExp_t refFilter; ///< Фильтр для плавного нарастания регулирования
struct {
- unsigned Initialized : 1; ///< Структура инициализирована
- unsigned Running : 3; ///< Сколько каналов запущено сейчас
- unsigned RazgonDone : 1; ///< Флаг что идет разгон Iref
+ unsigned Initialized : 1; ///< Структура инициализирована
+ unsigned Running : 3; ///< Сколько каналов запущено сейчас
+ unsigned RazgonDone : 1; ///< Флаг что идет разгон Iref
+ unsigned CurrentLimited : 1; ///< Флаг что ток ограничивается в данный момент
} f; ///< Флаги
}Angle_Handle_t;
diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c
index b039168..fd05954 100644
--- a/UPP/Core/UPP/upp_main.c
+++ b/UPP/Core/UPP/upp_main.c
@@ -19,7 +19,7 @@
UPP_t upp;
RS_HandleTypeDef hmodbus_pui;
HAL_StatusTypeDef res; // сюда сохраняется результат от выполения всяких функций
-int dbg_polarity = 1;
+int dbg_polarity = 0;
/**
* @brief Инициализация УПП.
@@ -136,8 +136,6 @@ int UPP_While(void)
#ifdef UPP_SIMULATE_I // симулируем токи
upp.pm.measured.final.Iamp = upp.hangle.Iref/2;
- // При симуляции тока не включаем его проверку
- razgon_done = 0;
#endif
// if(test_cen)
diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c
index 3cd2944..a18430b 100644
--- a/UPP/Core/UPP/upp_params.c
+++ b/UPP/Core/UPP/upp_params.c
@@ -470,8 +470,8 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC] = ADC_U_ZERO_DEFAULT;
PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC] = ADC_I_ZERO_DEFAULT;
PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA] = ADC_I_ZERO_DEFAULT;
- PARAM_INTERNAL->adc.Temp_Zero[TEMP_1] = ADC_T_ZERO_DEFAULT;
- PARAM_INTERNAL->adc.Temp_Zero[TEMP_2] = ADC_T_ZERO_DEFAULT;
+ PARAM_INTERNAL->adc.Temp_Zero[TEMP_RAD] = ADC_T_ZERO_DEFAULT;
+ PARAM_INTERNAL->adc.Temp_Zero[TEMP_SHKAF] = ADC_T_ZERO_DEFAULT;
PARAM_INTERNAL->pwm.PhaseMask = 7; // (все три фазы)
PARAM_INTERNAL->pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT;
diff --git a/UPP/Core/UPP/upp_status.c b/UPP/Core/UPP/upp_status.c
index eebab4a..31d99bc 100644
--- a/UPP/Core/UPP/upp_status.c
+++ b/UPP/Core/UPP/upp_status.c
@@ -15,16 +15,34 @@ void UPP_Status_Handler(void)
GPIO_LED_Dynamic_Handle(&UPP_LEDS.green2);
GPIO_LED_Dynamic_Handle(&UPP_LEDS.red);
+ MB_DATA.InRegs.pui.Error = upp.errors->common;
+ MB_DATA.InRegs.pui.WorkMode = upp.workmode;
- MB_DATA.InRegs.pui.Uall = upp.pm.measured.final.Uamp * MB_INTERNAL.param.nominal.U;
+ MB_DATA.InRegs.pui.Uall = upp.pm.measured.final.Uamp * MB_INTERNAL.param.nominal.U;
MB_DATA.InRegs.pui.Uab = upp.pm.measured.final.U[U_AB] * MB_INTERNAL.param.nominal.U;
MB_DATA.InRegs.pui.Ubc = upp.pm.measured.final.U[U_BC] * MB_INTERNAL.param.nominal.U;
MB_DATA.InRegs.pui.Uca = upp.pm.measured.final.U[U_CA] * MB_INTERNAL.param.nominal.U;
MB_DATA.InRegs.pui.Iall = upp.pm.measured.final.Iamp * MB_INTERNAL.param.nominal.I;
- MB_DATA.InRegs.pui.Ia = upp.pm.measured.final.U[I_A] * MB_INTERNAL.param.nominal.I;
- MB_DATA.InRegs.pui.Ib = upp.pm.measured.final.U[I_B] * MB_INTERNAL.param.nominal.I;
- MB_DATA.InRegs.pui.Ic = upp.pm.measured.final.U[I_C] * MB_INTERNAL.param.nominal.I;
+ MB_DATA.InRegs.pui.Ia = upp.pm.measured.final.I[I_A] * MB_INTERNAL.param.nominal.I;
+ MB_DATA.InRegs.pui.Ib = upp.pm.measured.final.I[I_B] * MB_INTERNAL.param.nominal.I;
+ MB_DATA.InRegs.pui.Ic = upp.pm.measured.final.I[I_C] * MB_INTERNAL.param.nominal.I;
+
+ MB_DATA.InRegs.pui.Fall = upp.pm.measured.final.Fmean * 10;
+ MB_DATA.InRegs.pui.Fab = upp.pm.measured.final.F[U_AB] * 10;
+ MB_DATA.InRegs.pui.Fbc = upp.pm.measured.final.F[U_BC] * 10;
+ MB_DATA.InRegs.pui.Fca = upp.pm.measured.final.F[U_CA] * 10;
+
+
+ MB_DATA.InRegs.pui.Trad = upp.pm.measured.final.T[TEMP_RAD] * 10;
+ MB_DATA.InRegs.pui.Tshkaf = upp.pm.measured.final.T[TEMP_SHKAF] * 10;
+
+ MB_DATA.InRegs.pui.Warnings.warn.NoConnectionPCH = 0; //todo
+ MB_DATA.InRegs.pui.Warnings.warn.NoInputVoltage = !upp.pm.f.isU;
+ MB_DATA.InRegs.pui.Warnings.warn.CurrentLimited = upp.hangle.f.CurrentLimited;
+ MB_DATA.InRegs.pui.Warnings.warn.OverVoltage = !upp.errors->pui.err.OverVoltage;
+ MB_DATA.InRegs.pui.Warnings.warn.UnderVoltage = !upp.errors->pui.err.UnderVoltage;
+
if(GPIO_Read_Switch(&UPP_DIN.Pusk))
{
diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx
index 5f3f0dc..9e0ba89 100644
--- a/UPP/MDK-ARM/UPP.uvoptx
+++ b/UPP/MDK-ARM/UPP.uvoptx
@@ -154,7 +154,7 @@