diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx
index 7899bcf..827ce7c 100644
Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ
diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h
index f37f589..37be046 100644
--- a/UPP/Core/Configs/upp_defs.h
+++ b/UPP/Core/Configs/upp_defs.h
@@ -74,6 +74,51 @@ typedef enum {
Err_Interlace = 21, ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
} UPP_ErrorType_t;
+/**
+ * @brief Структура аварий УПП для ПУИ
+ */
+typedef struct
+{
+ /* Програмные ошибки */
+ unsigned Internal_1:1; ///< Ошибка 1: Внутренняя неисправность УПП 1
+ unsigned Internal_2:1; ///< Ошибка 2: Внутренняя неисправность УПП 2
+ unsigned Internal_3:1; ///< Ошибка 3: Внутренняя неисправность УПП 3
+ unsigned Internal_4:1; ///< Ошибка 4: Внутренняя неисправность УПП 4
+ unsigned Internal_5:1; ///< Ошибка 5: Внутренняя неисправность УПП 5
+ unsigned Internal_6:1; ///< Ошибка 6: Внутренняя неисправность УПП 6
+
+ /* Ошибки по питанию */
+ unsigned Power_Digit_5V:1; ///< Ошибка 7: Неисправность цифрового источника питания (5 В)
+ unsigned Power_24V:1; ///< Ошибка 8: Неисправность источника питания 24 В
+ unsigned Power_Analog_5V:1; ///< Ошибка 9: Неисправность аналогового источника питания микроконтроллера (± 5 В)
+ unsigned Power_SCI_5V:1; ///< Ошибка 10: Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В)
+ unsigned Power_DIO_24V:1; ///< Ошибка 11: Неисправность источника питания дискретных входов/выходов (24 В)
+
+ /* Ошибки по допустимым пределам Наряжений/Токов/Температуры */
+ unsigned OverCurrent:1; ///< Ошибка 12: Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t)
+ unsigned OverVoltage:1; ///< Ошибка 13: Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
+ unsigned OverTemperature:1; ///< Ошибка 14: Температура выше допустимой (плюс 85 °C)
+ unsigned UnderVoltage:1; ///< Ошибка 15: Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
+
+ /* Ошибки по обрывам фаз */
+ unsigned LossPhaseAll:1; ///< Ошибка 16: Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t)
+ unsigned LossPhaseA:1; ///< Ошибка 17: Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t)
+ unsigned LossPhaseB:1; ///< Ошибка 18: Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t)
+ unsigned LossPhaseC:1; ///< Ошибка 19: Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t)
+
+ /* Другие ошибки */
+ unsigned LongStart:1; ///< Ошибка 20: Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
+ unsigned Interlace:1; ///< Ошибка 21: Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
+ unsigned OverFrequency:1; ///< Ошибка 22: Частота сети выше допустимой
+ unsigned UnderFrequency:1; ///< Ошибка 23: Частота сети ниже допустимой
+}UPP_PUI_Error_t;
+
+/**
+ * @brief Структура предупреждений УПП для ПУИ
+ */
+typedef struct
+{
+}UPP_PUI_Warnings_t;
/**
* @brief Структура данных от УПП передаваемых в ПУИ
@@ -85,13 +130,32 @@ typedef struct {
uint16_t WorkMode; /** @brief Адрес 1: Режим работы
@details «Готовность» или «Работа» */
- uint16_t Voltage; /** @brief Адрес 2: Напряжение на входе УПП, Вольты */
+ uint16_t Uall; /** @brief Адрес 2: Среднее напряжение по трем фазам на входе УПП (RMS), Вольты */
+ uint16_t Uab; /** @brief Адрес 3: Напряжение фазы AB (RMS), Вольты */
+ uint16_t Ubc; /** @brief Адрес 4: Напряжение фазы BC (RMS), Вольты */
+ uint16_t Uca; /** @brief Адрес 5: Напряжение фазы CA (RMS), Вольты */
- uint16_t Current; /** @brief Адрес 3: Ток на входе УПП, Амперы */
+ uint16_t Iall; /** @brief Адрес 6: Средний ток по трем фазам на входе УПП (RMS), Амперы */
+ uint16_t Ia; /** @brief Адрес 7: Ток фазы A (RMS), Амперы */
+ uint16_t Ib; /** @brief Адрес 8: Ток фазы B (RMS), Амперы */
+ uint16_t Ic; /** @brief Адрес 9: Ток фазы C (RMS), Амперы */
- uint16_t Frequency; /** @brief Адрес 4: Частота напряжения на входе УПП */
+ uint16_t Fall; /** @brief Адрес 10: Средняя частота напряжений по трем фазам на входе УПП, Герцы */
+ uint16_t Fab; /** @brief Адрес 11: Частота напряжения фазы AB, Герцы */
+ uint16_t Fbc; /** @brief Адрес 12: Частота напряжения фазы BC, Герцы */
+ uint16_t Fca; /** @brief Адрес 13: Частота напряжения фазы CA, Герцы */
- uint16_t Temperature; /** @brief Адрес 5: Температура радиатора тиристоров, Градусы Цельсия */
+ uint16_t Temperature1; /** @brief Адрес 14: Температура радиатора тиристоров, Градусы Цельсия */
+ uint16_t Temperature2; /** @brief Адрес 15: Температура радиатора тиристоров, Градусы Цельсия */
+
+ uint16_t reserved[10]; /** @brief Адрес 16-49: Зарезервированны*/
+
+
+ union
+ {
+ uint16_t all;
+ UPP_PUI_Warnings_t warn;
+ }Warnings; /** @brief Адрес 4: Частота напряжения на входе УПП */
} UPP_PUI_Values_t;
/**
@@ -180,11 +244,12 @@ typedef struct {
#define SQRT2 1.4142135
/* Дефайны для "удобного" доступа к структурам */
-#define PARAM_INTERNAL MB_INTERNAL.param
-#define PARAM_PUI MB_DATA.HoldRegs.pui_params
-#define ERR_PUI errors.pui.err
-#define ERR_PRIVATE errors.prvt.f.err
-#define ERR_PRIVATE_CNT errors.prvt.cnt
+//#define PARAM_INTERNAL MB_INTERNAL.param
+//#define PARAM_PUI MB_DATA.HoldRegs.pui_params
+//#define ERR_PUI errors.pui.err
+//#define ERR_PRIVATE errors.prvt.f.err
+//#define ERR_PRIVATE_CNT errors.prvt.cnt
+
/* Enum'ы УПП */
/**
diff --git a/UPP/Core/Inc/main.h b/UPP/Core/Inc/main.h
index 9c14f2b..ef1b27f 100644
--- a/UPP/Core/Inc/main.h
+++ b/UPP/Core/Inc/main.h
@@ -52,6 +52,12 @@ extern "C" {
/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */
+/* Дефайны для "удобного" доступа к структурам */
+static UPP_PrvtParams_t *PARAM_INTERNAL = &MB_INTERNAL.param;
+static UPP_PUI_Params_t *PARAM_PUI = &MB_DATA.HoldRegs.pui_params;
+static UPP_PUI_Error_t *ERR_PUI = &errors.pui.err;
+static UPP_PrvtErrors_t *ERR_PRIVATE = &errors.prvt.f.err;
+static UPP_ErrorsCnt_t *ERR_PRIVATE_CNT = &errors.prvt.cnt;
/* USER CODE END EM */
/* Exported functions prototypes ---------------------------------------------*/
diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c
index 219aa08..3f269c3 100644
--- a/UPP/Core/PowerMonitor/power_monitor.c
+++ b/UPP/Core/PowerMonitor/power_monitor.c
@@ -130,8 +130,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
float iphase_mean = 0; // средний ток каждой фазы
float uphase_mean = 0; // среднее напряжение каждой фазы
// Дополнительно посчитаем значения в реальных Вольтах/Амперах
- float u_base = u2f(PARAM_INTERNAL.nominal.U, 10);
- float i_base = u2f(PARAM_INTERNAL.nominal.I, 10);
+ float u_base = u2f(PARAM_INTERNAL->nominal.U, 10);
+ float i_base = u2f(PARAM_INTERNAL->nominal.I, 10);
for(int i = 0; i < 3; i++)
{
/* Получение частоты фазы */
@@ -189,8 +189,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
{
if(hpm == NULL)
return;
- float u_base = u2f(PARAM_INTERNAL.nominal.U, 10);
- float i_base = u2f(PARAM_INTERNAL.nominal.I, 10);
+ float u_base = u2f(PARAM_INTERNAL->nominal.U, 10);
+ float i_base = u2f(PARAM_INTERNAL->nominal.I, 10);
PowerMonitor_Measured_t *meas = &hpm->measured;
/* Считываем АЦП с пересчетами и медианой фильтрацией от выбросов */
@@ -233,8 +233,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
}
else // если уже запущена - ставим overrun slow calc
{
- ERR_PRIVATE.overrun_slow_calc = 1;
- ERR_PRIVATE_CNT.overrun_slow_calc++;
+ ERR_PRIVATE->overrun_slow_calc = 1;
+ ERR_PRIVATE_CNT->overrun_slow_calc++;
}
}
else
@@ -258,21 +258,21 @@ int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running)
return 1;
PowerMonitor_Measured_t *measure = &hpm->measured;
- UPP_PUI_Params_t *protect = &PARAM_PUI;
- UPP_ParamsNominal_t *nominal = &PARAM_INTERNAL.nominal;
+ UPP_PUI_Params_t *params = PARAM_PUI;
+ UPP_ParamsNominal_t *nominal = &PARAM_INTERNAL->nominal;
/*=============== ЗАЩИТЫ ПО НАПРЯЖЕНИЮ ==================*/
- hpm->f.isU = Protect_Voltages(measure, protect, nominal);
+ hpm->f.isU = Protect_Voltages(measure, params, nominal);
/* Если УПП в работе */
if(Running)
{
/*=============== ЗАЩИТЫ ПО ТОКУ ==================*/
- hpm->f.isI = Protect_Currents(measure, protect, nominal);
+ hpm->f.isI = Protect_Currents(measure, params, nominal);
}
/*=============== ЗАЩИТЫ ВСЯКИЕ ДРУГИЕ ==================*/
- Protect_Misc(measure, protect, nominal);
+ Protect_Misc(measure, params, nominal);
if(errors.prvt.f.all)
diff --git a/UPP/Core/PowerMonitor/power_protect.c b/UPP/Core/PowerMonitor/power_protect.c
index 11ac38b..74e254b 100644
--- a/UPP/Core/PowerMonitor/power_protect.c
+++ b/UPP/Core/PowerMonitor/power_protect.c
@@ -14,40 +14,40 @@
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ
* @return 1 - напряжение есть, 0 - напряжения нет
*/
-int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal)
+int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal)
{
/* Переводим уставки ПУИ в удобный вид */
- float lUmin = u2f(protect->Umin, 100)/**u2f(nominal->U, 10)*/;
- float lUmax = u2f(protect->Umax, 100)/**u2f(nominal->U, 10)*/;
+ float lUmin = u2f(params->Umin, 100)/**u2f(nominal->U, 10)*/;
+ float lUmax = u2f(params->Umax, 100)/**u2f(nominal->U, 10)*/;
float lPhaseSequence = u2f(nominal->PhaseSequence, 100);
/* Общее напряжение */
if(measure->final.Uamp > lUmax)
{
- ERR_PRIVATE.uamp_max = 1;
+ ERR_PRIVATE->uamp_max = 1;
}
else if (measure->final.Uamp < lUmin)
{
- ERR_PRIVATE.uamp_min = 1;
+ ERR_PRIVATE->uamp_min = 1;
}
else
{
- ERR_PRIVATE.uamp_max = 0;
- ERR_PRIVATE.uamp_min = 0;
+ ERR_PRIVATE->uamp_max = 0;
+ ERR_PRIVATE->uamp_min = 0;
}
/* Последовательность фаз */
int realPhaseSequence = 0;
if(realPhaseSequence != lPhaseSequence)
{
- ERR_PRIVATE.interlance = 1;
+ ERR_PRIVATE->interlance = 1;
}
else
{
- ERR_PRIVATE.interlance = 0;
+ ERR_PRIVATE->interlance = 0;
}
- return (ERR_PRIVATE.uamp_min == 0);
+ return (ERR_PRIVATE->uamp_min == 0);
}
/**
@@ -55,72 +55,72 @@ int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect
* @note Заполняет флаги prvt ошибок (приватные).
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ
*/
-int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal)
+int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal)
{
/* Переводим уставки ПУИ в удобный вид */
- float lIref = u2f(protect->Iref, 100)/**u2f(nominal->I, 10)*/;
- float lImin = u2f(protect->Imin, 100)/**u2f(nominal->I, 10)*/;
- float lImax = u2f(protect->Imax, 100) * 50 / u2f(nominal->I, 10); // Imax процентов от 50 А, в о.е. от номинального
+ float lIref = u2f(params->Iref, 100)/**u2f(nominal->I, 10)*/;
+ float lImin = u2f(params->Imin, 100)/**u2f(nominal->I, 10)*/;
+ float lImax = u2f(params->Imax, 100) * 50 / u2f(nominal->I, 10); // Imax процентов от 50 А, в о.е. от номинального
/* Общий ток */
if(measure->final.Iamp > lImax)
{
- ERR_PRIVATE.iamp_max = 1;
+ ERR_PRIVATE->iamp_max = 1;
}
else if (measure->final.Iamp < lImin)
{
- ERR_PRIVATE.iamp_min = 1;
+ ERR_PRIVATE->iamp_min = 1;
}
else
{
- ERR_PRIVATE.iamp_max = 0;
- ERR_PRIVATE.iamp_min = 0;
+ ERR_PRIVATE->iamp_max = 0;
+ ERR_PRIVATE->iamp_min = 0;
}
/* Ток по фазам */
if(measure->final.I[I_A] > lImax)
{
- ERR_PRIVATE.ia_max = 1;
+ ERR_PRIVATE->ia_max = 1;
}
else if (measure->final.I[I_A] < lImin)
{
- ERR_PRIVATE.ia_min = 1;
+ ERR_PRIVATE->ia_min = 1;
}
else
{
- ERR_PRIVATE.ia_max = 0;
- ERR_PRIVATE.ia_min = 0;
+ ERR_PRIVATE->ia_max = 0;
+ ERR_PRIVATE->ia_min = 0;
}
if(measure->final.I[I_B] > lImax)
{
- ERR_PRIVATE.ib_max = 1;
+ ERR_PRIVATE->ib_max = 1;
}
else if (measure->final.I[I_B] < lImin)
{
- ERR_PRIVATE.ib_min = 1;
+ ERR_PRIVATE->ib_min = 1;
}
else
{
- ERR_PRIVATE.ib_max = 0;
- ERR_PRIVATE.ib_min = 0;
+ ERR_PRIVATE->ib_max = 0;
+ ERR_PRIVATE->ib_min = 0;
}
if(measure->final.I[I_C] > lImax)
{
- ERR_PRIVATE.ic_max = 1;
+ ERR_PRIVATE->ic_max = 1;
}
else if (measure->final.I[I_C] < lImin)
{
- ERR_PRIVATE.ic_min = 1;
+ ERR_PRIVATE->ic_min = 1;
}
else
{
- ERR_PRIVATE.ic_max = 0;
- ERR_PRIVATE.ic_min = 0;
+ ERR_PRIVATE->ic_max = 0;
+ ERR_PRIVATE->ic_min = 0;
}
- return (ERR_PRIVATE.iamp_min == 0);
+ return (ERR_PRIVATE->iamp_min == 0);
}
@@ -130,58 +130,58 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect
* @note Заполняет флаги prvt ошибок (приватные).
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ
*/
-void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal)
+void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal)
{
/* Переводим внутренние уставки в удобный вид */
- float lFnom = u2f(PARAM_INTERNAL.nominal.F, 100);
- float lFmin = lFnom - lFnom*u2f(PARAM_INTERNAL.nominal.F_deviation_minus, 10000);
- float lFmax = lFnom + lFnom*u2f(PARAM_INTERNAL.nominal.F_deviation_plus, 10000);
+ float lFnom = u2f(PARAM_INTERNAL->nominal.F, 100);
+ float lFmin = lFnom - lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_minus, 10000);
+ float lFmax = lFnom + lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_plus, 10000);
- float lTwarn = u2f(PARAM_INTERNAL.setpoints.TemperatureWarn, 100);
- float lTerr = u2f(PARAM_INTERNAL.setpoints.TemperatureWarn, 100);
+ float lTwarn = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100);
+ float lTerr = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100);
/*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/
if(measure->final.F[U_CA] > lFmax)
{
- ERR_PRIVATE.fac_max = 1;
+ ERR_PRIVATE->fac_max = 1;
}
else if (measure->final.F[U_CA] < lFmin)
{
- ERR_PRIVATE.fac_min = 1;
+ ERR_PRIVATE->fac_min = 1;
}
else
{
- ERR_PRIVATE.fac_max = 0;
- ERR_PRIVATE.fac_min = 0;
+ ERR_PRIVATE->fac_max = 0;
+ ERR_PRIVATE->fac_min = 0;
}
if(measure->final.F[U_AB] > lFmax)
{
- ERR_PRIVATE.fba_max = 1;
+ ERR_PRIVATE->fba_max = 1;
}
else if (measure->final.F[U_AB] < lFmin)
{
- ERR_PRIVATE.fba_min = 1;
+ ERR_PRIVATE->fba_min = 1;
}
else
{
- ERR_PRIVATE.fba_max = 0;
- ERR_PRIVATE.fba_min = 0;
+ ERR_PRIVATE->fba_max = 0;
+ ERR_PRIVATE->fba_min = 0;
}
if(measure->final.F[U_BC] > lFmax)
{
- ERR_PRIVATE.fbc_max = 1;
+ ERR_PRIVATE->fbc_max = 1;
}
else if (measure->final.F[U_BC] < lFmin)
{
- ERR_PRIVATE.fbc_min = 1;
+ ERR_PRIVATE->fbc_min = 1;
}
else
{
- ERR_PRIVATE.fbc_max = 0;
- ERR_PRIVATE.fbc_min = 0;
+ ERR_PRIVATE->fbc_max = 0;
+ ERR_PRIVATE->fbc_min = 0;
}
@@ -189,15 +189,15 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U
/*=============== ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ==================*/
if(measure->final.T[TEMP_1] > lTerr)
{
- ERR_PRIVATE.temp_err = 1;
+ ERR_PRIVATE->temp_err = 1;
}
else if (measure->final.T[TEMP_1] > lTwarn)
{
- ERR_PRIVATE.temp_warn = 1;
+ ERR_PRIVATE->temp_warn = 1;
}
else
{
- ERR_PRIVATE.temp_err = 0;
- ERR_PRIVATE.temp_warn = 0;
+ ERR_PRIVATE->temp_err = 0;
+ ERR_PRIVATE->temp_warn = 0;
}
}
diff --git a/UPP/Core/PowerMonitor/power_protect.h b/UPP/Core/PowerMonitor/power_protect.h
index c19502b..06114d9 100644
--- a/UPP/Core/PowerMonitor/power_protect.h
+++ b/UPP/Core/PowerMonitor/power_protect.h
@@ -10,9 +10,9 @@
/* Проверяет защиты по напряжению. */
-int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal);
+int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal);
/* Проверяет защиты по току. */
-int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal);
+int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal);
/* Проверяет всякие другие защиты (частота, температура). */
-void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal);
+void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal);
#endif /* _POWER_PROTECT_H_ */
diff --git a/UPP/Core/UPP/upp_errors.c b/UPP/Core/UPP/upp_errors.c
index 090a843..1ea4619 100644
--- a/UPP/Core/UPP/upp_errors.c
+++ b/UPP/Core/UPP/upp_errors.c
@@ -7,10 +7,10 @@
Общая логика:
В программе выставляются всякие внутренние флаги ошибок: ERR_PRIVATE
В этом модуле смотрятся какие флаги выставились и переносят эти флаги
-в структуру ошибок ПУИ ERR_PUI.
+в структуру ошибок ПУИ ERR_PUI->
Исключение: Программные ошибки и ошибки питания плат,
-они пишутся напрямую в ERR_PUI.
+они пишутся напрямую в ERR_PUI->
Также реализована защита от дребезга и в целом задержка на выставление ошибок.
******************************************************************************/
@@ -67,17 +67,17 @@ void UPP_Errors_Power(void)
int err_5Vsi = GPIO_Read_Switch(&UPP_DIN.err_5Vsi);
int err_Va = GPIO_Read_Switch(&UPP_DIN.err_Va);
- ERR_PUI.Power_DIO_24V = err_24Vdio;
- ERR_PUI.Power_24V = err_24V;
- ERR_PUI.Power_Digit_5V = err_5Vd;
- ERR_PUI.Power_SCI_5V = err_5Vsi;
- ERR_PUI.Power_Analog_5V = err_Va;
+ ERR_PUI->Power_DIO_24V = err_24Vdio;
+ ERR_PUI->Power_24V = err_24V;
+ ERR_PUI->Power_Digit_5V = err_5Vd;
+ ERR_PUI->Power_SCI_5V = err_5Vsi;
+ ERR_PUI->Power_Analog_5V = err_Va;
}
void UPP_Errors_Ranges(void)
{
/* Преобразуем уставки в нормальные тики */
- float ticksTiMax = u2f(PARAM_PUI.TiMax, 1)/PM_SLOW_PERIOD_US;
+ float ticksTiMax = u2f(PARAM_PUI->TiMax, 1)/PM_SLOW_PERIOD_US;
/* Счетчики для отсчитывания задержки выставления ошибки */
static int IMaxCnt = 0;
static int UMaxCnt = 0;
@@ -87,48 +87,48 @@ void UPP_Errors_Ranges(void)
static int TMaxCnt = 0;
/* Напряжения */
- ERR_PUI.OverVoltage = setError(ERR_PRIVATE.uamp_max,
- ERR_PUI.OverVoltage,
+ ERR_PUI->OverVoltage = setError(ERR_PRIVATE->uamp_max,
+ ERR_PUI->OverVoltage,
&UMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR));
- ERR_PUI.UnderVoltage = setError(ERR_PRIVATE.uamp_min,
- ERR_PUI.UnderVoltage,
+ ERR_PUI->UnderVoltage = setError(ERR_PRIVATE->uamp_min,
+ ERR_PUI->UnderVoltage,
&UMinCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR));
/* Токи */
- int i_max = ( ERR_PRIVATE.iamp_max ||
- ERR_PRIVATE.ia_max ||
- ERR_PRIVATE.ib_max ||
- ERR_PRIVATE.ic_max);
- ERR_PUI.OverCurrent = setError(i_max,
- ERR_PUI.OverCurrent,
+ int i_max = ( ERR_PRIVATE->iamp_max ||
+ ERR_PRIVATE->ia_max ||
+ ERR_PRIVATE->ib_max ||
+ ERR_PRIVATE->ic_max);
+ ERR_PUI->OverCurrent = setError(i_max,
+ ERR_PUI->OverCurrent,
&IMaxCnt,
ticksTiMax);
/* Частота */
- int f_max = ( ERR_PRIVATE.fac_max ||
- ERR_PRIVATE.fba_max ||
- ERR_PRIVATE.fbc_max);
- int f_min = ( ERR_PRIVATE.fac_min ||
- ERR_PRIVATE.fba_min ||
- ERR_PRIVATE.fbc_min);
- ERR_PUI.OverFrequency = setError(f_max,
- ERR_PUI.OverFrequency,
+ int f_max = ( ERR_PRIVATE->fac_max ||
+ ERR_PRIVATE->fba_max ||
+ ERR_PRIVATE->fbc_max);
+ int f_min = ( ERR_PRIVATE->fac_min ||
+ ERR_PRIVATE->fba_min ||
+ ERR_PRIVATE->fbc_min);
+ ERR_PUI->OverFrequency = setError(f_max,
+ ERR_PUI->OverFrequency,
&FMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR));
- ERR_PUI.UnderFrequency = setError( f_min,
- ERR_PUI.UnderFrequency,
+ ERR_PUI->UnderFrequency = setError( f_min,
+ ERR_PUI->UnderFrequency,
&FMinCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR));
/* Температуры */
- ERR_PUI.OverTemperature = setError(ERR_PRIVATE.temp_err,
- ERR_PUI.OverTemperature,
+ ERR_PUI->OverTemperature = setError(ERR_PRIVATE->temp_err,
+ ERR_PUI->OverTemperature,
&TMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
}
@@ -141,39 +141,39 @@ void UPP_Errors_LossPhase(void)
static int LossPhaseBCnt = 0;
static int LossPhaseCCnt = 0;
- int loss_phases_all = ( ERR_PRIVATE.ia_min &&
- ERR_PRIVATE.ib_min &&
- ERR_PRIVATE.ic_min );
+ int loss_phases_all = ( ERR_PRIVATE->ia_min &&
+ ERR_PRIVATE->ib_min &&
+ ERR_PRIVATE->ic_min );
- ERR_PUI.LossPhaseAll = setError( loss_phases_all,
- ERR_PUI.LossPhaseAll,
+ ERR_PUI->LossPhaseAll = setError( loss_phases_all,
+ ERR_PUI->LossPhaseAll,
&LossPhaseAllCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
/* Если хотя бы одна фаза есть проверяем фазы отдельно */
- if(!ERR_PUI.LossPhaseAll)
+ if(!ERR_PUI->LossPhaseAll)
{
- ERR_PUI.LossPhaseA = setError( ERR_PRIVATE.ia_min,
- ERR_PUI.LossPhaseA,
+ ERR_PUI->LossPhaseA = setError( ERR_PRIVATE->ia_min,
+ ERR_PUI->LossPhaseA,
&LossPhaseACnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
- ERR_PUI.LossPhaseB = setError( ERR_PRIVATE.ib_min,
- ERR_PUI.LossPhaseB,
+ ERR_PUI->LossPhaseB = setError( ERR_PRIVATE->ib_min,
+ ERR_PUI->LossPhaseB,
&LossPhaseBCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
- ERR_PUI.LossPhaseC = setError( ERR_PRIVATE.ic_min,
- ERR_PUI.LossPhaseC,
+ ERR_PUI->LossPhaseC = setError( ERR_PRIVATE->ic_min,
+ ERR_PUI->LossPhaseC,
&LossPhaseCCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
}
/* Если всех фаз нет, то отдельные не смотрим */
else
{
- ERR_PUI.LossPhaseA = 0;
- ERR_PUI.LossPhaseB = 0;
- ERR_PUI.LossPhaseC = 0;
+ ERR_PUI->LossPhaseA = 0;
+ ERR_PUI->LossPhaseB = 0;
+ ERR_PUI->LossPhaseC = 0;
}
}
@@ -182,13 +182,13 @@ void UPP_Errors_Other(void)
static int InterlaceCnt = 0;
- if(ERR_PRIVATE.longstart)
- ERR_PUI.LongStart = 1;
+ if(ERR_PRIVATE->longstart)
+ ERR_PUI->LongStart = 1;
else
- ERR_PUI.LongStart = 0;
+ ERR_PUI->LongStart = 0;
- ERR_PUI.Interlace = setError(ERR_PRIVATE.interlance,
- ERR_PUI.Interlace,
+ ERR_PUI->Interlace = setError(ERR_PRIVATE->interlance,
+ ERR_PUI->Interlace,
&InterlaceCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
//Interlance
diff --git a/UPP/Core/UPP/upp_errors.h b/UPP/Core/UPP/upp_errors.h
index c314ffc..fdebec0 100644
--- a/UPP/Core/UPP/upp_errors.h
+++ b/UPP/Core/UPP/upp_errors.h
@@ -50,7 +50,62 @@ static const uint8_t UPP_ErrorPriority[] =
};
+/**
+ * @brief Приватные ошибки
+ * @details Ииспользуются внутри программы и для определение ошибки для ПУИ
+ */
+typedef struct
+{
+ unsigned uamp_max:1;
+ unsigned uamp_min:1;
+ unsigned iamp_max:1;
+ unsigned iamp_min:1;
+
+ unsigned ic_max:1;
+ unsigned ic_min:1;
+ unsigned ib_max:1;
+ unsigned ib_min:1;
+ unsigned ia_max:1;
+ unsigned ia_min:1;
+
+ unsigned uba_max:1;
+ unsigned uba_min:1;
+ unsigned uac_max:1;
+ unsigned uac_min:1;
+ unsigned ubc_max:1;
+ unsigned ubc_min:1;
+
+ unsigned fba_max:1;
+ unsigned fba_min:1;
+ unsigned fac_max:1;
+ unsigned fac_min:1;
+ unsigned fbc_max:1;
+ unsigned fbc_min:1;
+
+
+ unsigned temp_warn:1;
+ unsigned temp_err:1;
+
+ unsigned longstart:1;
+ unsigned interlance:3;
+
+ unsigned overrun_slow_calc:1;
+ unsigned overrun_fast_calc:1;
+}UPP_PrvtErrors_t;
+/**
+ * @brief Счетчики ошибок
+ */
+typedef struct
+{
+ uint16_t angle_reinit_err;
+ uint16_t adc_reinit_err;
+ uint16_t zc_reinit_err;
+ uint16_t pwm_reinit_err;
+ uint16_t overrun_slow_calc;
+ uint16_t overrun_fast_calc;
+}UPP_ErrorsCnt_t;
+
/**
* @brief Структура с всеми ошибками УПП
*/
@@ -61,97 +116,18 @@ typedef struct
union
{
uint32_t all;
- struct
- {
- /* Програмные ошибки */
- unsigned Internal_1:1; ///< Ошибка 1: Внутренняя неисправность УПП 1
- unsigned Internal_2:1; ///< Ошибка 2: Внутренняя неисправность УПП 2
- unsigned Internal_3:1; ///< Ошибка 3: Внутренняя неисправность УПП 3
- unsigned Internal_4:1; ///< Ошибка 4: Внутренняя неисправность УПП 4
- unsigned Internal_5:1; ///< Ошибка 5: Внутренняя неисправность УПП 5
- unsigned Internal_6:1; ///< Ошибка 6: Внутренняя неисправность УПП 6
-
- /* Ошибки по питанию */
- unsigned Power_Digit_5V:1; ///< Ошибка 7: Неисправность цифрового источника питания (5 В)
- unsigned Power_24V:1; ///< Ошибка 8: Неисправность источника питания 24 В
- unsigned Power_Analog_5V:1; ///< Ошибка 9: Неисправность аналогового источника питания микроконтроллера (± 5 В)
- unsigned Power_SCI_5V:1; ///< Ошибка 10: Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В)
- unsigned Power_DIO_24V:1; ///< Ошибка 11: Неисправность источника питания дискретных входов/выходов (24 В)
-
- /* Ошибки по допустимым пределам Наряжений/Токов/Температуры */
- unsigned OverCurrent:1; ///< Ошибка 12: Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t)
- unsigned OverVoltage:1; ///< Ошибка 13: Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
- unsigned OverTemperature:1; ///< Ошибка 14: Температура выше допустимой (плюс 85 °C)
- unsigned UnderVoltage:1; ///< Ошибка 15: Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
-
- /* Ошибки по обрывам фаз */
- unsigned LossPhaseAll:1; ///< Ошибка 16: Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t)
- unsigned LossPhaseA:1; ///< Ошибка 17: Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t)
- unsigned LossPhaseB:1; ///< Ошибка 18: Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t)
- unsigned LossPhaseC:1; ///< Ошибка 19: Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t)
-
- /* Другие ошибки */
- unsigned LongStart:1; ///< Ошибка 20: Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
- unsigned Interlace:1; ///< Ошибка 21: Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
- unsigned OverFrequency:1; ///< Ошибка 22: Частота сети выше допустимой
- unsigned UnderFrequency:1; ///< Ошибка 23: Частота сети ниже допустимой
- }err;
- }pui;
+ UPP_PUI_Error_t err;
+ }pui; ///< Ошибки ПУИ
struct
{
union
{
uint64_t all;
- struct
- {
- unsigned uamp_max:1;
- unsigned uamp_min:1;
- unsigned iamp_max:1;
- unsigned iamp_min:1;
-
- unsigned ic_max:1;
- unsigned ic_min:1;
- unsigned ib_max:1;
- unsigned ib_min:1;
- unsigned ia_max:1;
- unsigned ia_min:1;
-
- unsigned uba_max:1;
- unsigned uba_min:1;
- unsigned uac_max:1;
- unsigned uac_min:1;
- unsigned ubc_max:1;
- unsigned ubc_min:1;
-
- unsigned fba_max:1;
- unsigned fba_min:1;
- unsigned fac_max:1;
- unsigned fac_min:1;
- unsigned fbc_max:1;
- unsigned fbc_min:1;
-
-
- unsigned temp_warn:1;
- unsigned temp_err:1;
-
- unsigned longstart:1;
- unsigned interlance:3;
-
- unsigned overrun_slow_calc:1;
- unsigned overrun_fast_calc:1;
- }err;
+ UPP_PrvtErrors_t err;
}f;
- struct
- {
- uint16_t angle_reinit_err;
- uint16_t adc_reinit_err;
- uint16_t zc_reinit_err;
- uint16_t pwm_reinit_err;
- uint16_t overrun_slow_calc;
- uint16_t overrun_fast_calc;
- }cnt;
+ UPP_ErrorsCnt_t cnt;
}prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ
}UPP_Errors_t;
diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c
index 092f558..6a94ed9 100644
--- a/UPP/Core/UPP/upp_main.c
+++ b/UPP/Core/UPP/upp_main.c
@@ -30,7 +30,7 @@ int UPP_App_Init(void)
BenchTime_Init();
// Подключение указателей
upp.errors = &errors;
- upp.PUI.params = &PARAM_PUI;
+ upp.PUI.params = &MB_DATA.HoldRegs.pui_params;
upp.PUI.values = &MB_DATA.InRegs.pui;
upp.call = &MB_INTERNAL.FuncCalls;
@@ -45,7 +45,7 @@ int UPP_App_Init(void)
if(PWM_Init(&upp.hpwm) != HAL_OK)
{
return 1;
- }
+ }
if(Angle_Init(&upp.hangle) != HAL_OK)
{
return 1;
@@ -89,13 +89,14 @@ int UPP_While(void)
{
static uint32_t slow_cnt = 0;
upp.Timings.slow_calc_prd_us = BenchTime_Period(BT_SLOWCALC_PRD, angletim.Instance->CNT, HAL_MAX_DELAY)/ANGLE_TIM2_FREQ_MHZ;
- BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY);
+ BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY);
res = HAL_IWDG_Refresh(&hiwdg); // если не вызываются медленные расчеты - что-то не то сбрасываемся по watchdog
+
+ int razgon_done = (fabsf(upp.hangle.Iref - u2f(PARAM_PUI->Iref, 100)) < 0.1);
+
// Медленные расчеты
- PowerMonitor_SlowCalc(&upp.pm);
-
- int razgon_done = (fabsf(upp.hangle.Iref - u2f(PARAM_PUI.Iref, 100)) < 0.1);
-
+ PowerMonitor_SlowCalc(&upp.pm);
+
#ifdef UPP_SIMULATE_I // симулируем токи
upp.pm.measured.final.Iamp = upp.hangle.Iref/2;
// При симуляции тока не включаем его проверку
@@ -110,8 +111,6 @@ int UPP_While(void)
UPP_Params_Control();
-
-
#ifndef UPP_DISABLE_ERROR_BLOCK
// если ошибка вызываем СТОП
upp.call->stop = (errors.common != Err_None);
@@ -129,6 +128,7 @@ int UPP_While(void)
// Если СТОП - переходим в ошибку
if (upp.call->stop)
upp.workmode = UPP_Error;
+
// Автомат состояний УПП
switch(upp.workmode)
{
@@ -146,8 +146,8 @@ int UPP_While(void)
}
if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS))
- { // конец инициализации - сбрасываем чтобы потом еще раз инициализироватся
- slow_cnt = 0;
+ { // конец инициализации
+ slow_cnt = 0; // сбрасываем счетчик для следующей инициализации
upp.workmode = UPP_Ready;
}
else
@@ -188,16 +188,16 @@ int UPP_While(void)
// Коррекция для отсчета угла открытия
// 30 градусов - сдвиг между линейными и фазными напряжениями
- // 30 градусов - фазовое смщеение эксп. фильтра АЦП для сглаживания напряжений
+ // 0 градусов - фазовое смщеение эксп. фильтра АЦП для сглаживания напряжений
float Correction = 30 + 0;
// Регулирование тиристоров
- Angle_PID(&upp.hangle, u2f(PARAM_PUI.Iref,100), upp.pm.measured.final.Iamp, Correction);
+ Angle_PID(&upp.hangle, u2f(PARAM_PUI->Iref,100), upp.pm.measured.final.Iamp, Correction);
// если слишком долгий запуск
if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000))
{
- ERR_PRIVATE.longstart = 1;
+ ERR_PRIVATE->longstart = 1;
}
break;
@@ -272,8 +272,8 @@ void UPP_ADC_Handle(void)
if(upp.pm.f.inIsr)
{
- ERR_PRIVATE.overrun_fast_calc = 1;
- ERR_PRIVATE_CNT.overrun_fast_calc++;
+ ERR_PRIVATE->overrun_fast_calc = 1;
+ ERR_PRIVATE_CNT->overrun_fast_calc++;
return;
}
upp.pm.f.inIsr = 1;
diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c
index 35ce7ca..fe85ad3 100644
--- a/UPP/Core/UPP/upp_params.c
+++ b/UPP/Core/UPP/upp_params.c
@@ -23,7 +23,7 @@
*
* // В UPP_Params_ControlInternal():
* float new_param = module.param;
-* if(__CheckParamF(&new_param, PARAM_INTERNAL.new_param, 1000))
+* if(__CheckParamF(&new_param, PARAM_INTERNAL->new_param, 1000))
* {
* module_update = 1;
* }
@@ -36,7 +36,7 @@
* }
*
* // В UPP_Params_SetDefault():
-* PARAM_INTERNAL.new_param = NEW_PARAM_DEFAULT * 1000;
+* PARAM_INTERNAL->new_param = NEW_PARAM_DEFAULT * 1000;
*
******************************************************************************
*/
@@ -75,7 +75,7 @@ void UPP_Params_ControlPUI(void)
return;
/* Tnt - Уставка на скорость нарастания пускового тока */
- float angle_ref_alphaPUI = PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US);
+ float angle_ref_alphaPUI = PUI_Tnt_CalcAlpha(u2f(PARAM_PUI->Tnt, 1000), PM_SLOW_PERIOD_US);
float angle_ref_alpha = upp.hangle.refFilter.alpha;
if(angle_ref_alpha != angle_ref_alphaPUI)
{
@@ -85,7 +85,7 @@ void UPP_Params_ControlPUI(void)
upp.hangle.pid.Ki,
upp.hangle.pid.Kd,
angle_ref_alpha) != HAL_OK)
- ERR_PRIVATE_CNT.angle_reinit_err++;
+ ERR_PRIVATE_CNT->angle_reinit_err++;
}
@@ -133,23 +133,23 @@ void UPP_Params_ControlInternal(void)
// Параметры регулятора Угла открытия
- if(__CheckParamF(&angle_max, PARAM_INTERNAL.angle.Angle_Max, 65535))
+ if(__CheckParamF(&angle_max, PARAM_INTERNAL->angle.Angle_Max, 65535))
{
alpha_update = 1;
}
- if(__CheckParamF(&angle_min, PARAM_INTERNAL.angle.Angle_Min, 65535))
+ if(__CheckParamF(&angle_min, PARAM_INTERNAL->angle.Angle_Min, 65535))
{
alpha_update = 1;
}
- if(__CheckParamF(&angle_pid_kp, PARAM_INTERNAL.angle.PID_Kp, 10000))
+ if(__CheckParamF(&angle_pid_kp, PARAM_INTERNAL->angle.PID_Kp, 10000))
{
alpha_update = 1;
}
- if(__CheckParamF(&angle_pid_ki, PARAM_INTERNAL.angle.PID_Ki, 10000))
+ if(__CheckParamF(&angle_pid_ki, PARAM_INTERNAL->angle.PID_Ki, 10000))
{
alpha_update = 1;
}
- if(__CheckParamF(&angle_pid_kd, PARAM_INTERNAL.angle.PID_Kd, 10000))
+ if(__CheckParamF(&angle_pid_kd, PARAM_INTERNAL->angle.PID_Kd, 10000))
{
alpha_update = 1;
}
@@ -162,47 +162,47 @@ void UPP_Params_ControlInternal(void)
adc_channel_zero[i] = upp.pm.adc.Coefs[i].lZero;
// Максимальное измеряемое напряжение
- if(__CheckParamF(&adc_channel_max[i], PARAM_INTERNAL.adc.ADC_Max[i], 10))
+ if(__CheckParamF(&adc_channel_max[i], PARAM_INTERNAL->adc.ADC_Max[i], 10))
{
adc_channel_update[i] = 1;
}
// Значение АЦП при нулевом входе
- if(__CheckParamU16(&adc_channel_zero[i], PARAM_INTERNAL.adc.ADC_Zero[i]))
+ if(__CheckParamU16(&adc_channel_zero[i], PARAM_INTERNAL->adc.ADC_Zero[i]))
{
adc_channel_update[i] = 1;
}
}
// Параметры алгоритма перехода через ноль
- if(__CheckParamF(&zc_hysteresis, PARAM_INTERNAL.zc.Hysteresis, 10000))
+ if(__CheckParamF(&zc_hysteresis, PARAM_INTERNAL->zc.Hysteresis, 10000))
{
zc_update = 1;
}
- if(__CheckParamU16(&zc_debounce, PARAM_INTERNAL.zc.DebouneCouner))
+ if(__CheckParamU16(&zc_debounce, PARAM_INTERNAL->zc.DebouneCouner))
{
zc_update = 1;
}
// Параметры ШИМ
- if(__CheckParamU8(&pwm_phase_mask, PARAM_INTERNAL.pwm.PhaseMask, 1))
+ if(__CheckParamU8(&pwm_phase_mask, PARAM_INTERNAL->pwm.PhaseMask, 1))
{
pwm_update = 1;
}
- if(__CheckParamU16(&pwm_freq, PARAM_INTERNAL.pwm.Frequency))
+ if(__CheckParamU16(&pwm_freq, PARAM_INTERNAL->pwm.Frequency))
{
pwm_update = 1;
}
- if(__CheckParamF(&pwm_duty, PARAM_INTERNAL.pwm.Duty, 100))
+ if(__CheckParamF(&pwm_duty, PARAM_INTERNAL->pwm.Duty, 100))
{
pwm_update = 1;
}
- if(__CheckParamF(&pwm_pulse_len, PARAM_INTERNAL.pwm.PulseLength, 65535))
+ if(__CheckParamF(&pwm_pulse_len, PARAM_INTERNAL->pwm.PulseLength, 65535))
{
pwm_update = 1;
}
// Параметры мониторинга
- if(__CheckParamU16(&pm_rms_widnow_size, PARAM_INTERNAL.pm.rms_window_size))
+ if(__CheckParamU16(&pm_rms_widnow_size, PARAM_INTERNAL->pm.rms_window_size))
{
for(int i = 0; i < RMS_ALL; i++)
{
@@ -210,7 +210,7 @@ void UPP_Params_ControlInternal(void)
Filter_Start(&upp.pm.rms[i]);
}
}
- if(__CheckParamF(&pm_rms_exp_alpha, PARAM_INTERNAL.pm.rms_exp_alpha, 65535))
+ if(__CheckParamF(&pm_rms_exp_alpha, PARAM_INTERNAL->pm.rms_exp_alpha, 65535))
{
for(int i = 0; i < RMS_EXP_ALL; i++)
{
@@ -234,10 +234,10 @@ void UPP_Params_ControlInternal(void)
alpha_update = 0;
}
else
- ERR_PRIVATE_CNT.angle_reinit_err++;
+ ERR_PRIVATE_CNT->angle_reinit_err++;
}
else
- ERR_PRIVATE_CNT.angle_reinit_err++;
+ ERR_PRIVATE_CNT->angle_reinit_err++;
}
// Обновление АЦП конфигов
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
@@ -247,7 +247,7 @@ void UPP_Params_ControlInternal(void)
if(ADC_ConfigChannel(&upp.pm.adc, i, adc_channel_zero[i], adc_channel_max[i], 4095) == HAL_OK)
adc_channel_update[i] = 0;
else
- ERR_PRIVATE_CNT.adc_reinit_err++;
+ ERR_PRIVATE_CNT->adc_reinit_err++;
}
}
// Обновление Zero-Cross конфигов
@@ -256,7 +256,7 @@ void UPP_Params_ControlInternal(void)
if(ZC_Init(&upp.pm.zc, upp.pm.zc.Config.NumChannels, zc_hysteresis, zc_debounce) == HAL_OK)
zc_update = 0;
else
- ERR_PRIVATE_CNT.zc_reinit_err++;
+ ERR_PRIVATE_CNT->zc_reinit_err++;
}
// Обновление ШИМ конфигов
if(pwm_update)
@@ -266,7 +266,7 @@ void UPP_Params_ControlInternal(void)
pwm_update = 0;
}
else
- ERR_PRIVATE_CNT.pwm_reinit_err++;
+ ERR_PRIVATE_CNT->pwm_reinit_err++;
}
}
@@ -282,16 +282,16 @@ HAL_StatusTypeDef UPP_Params_Init(void)
/*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ angle_control ======*/
// Инициализация ПИД
if(Angle_PID_Init(&upp.hangle,
- u2f(PARAM_INTERNAL.angle.PID_Kp, 10000),
- u2f(PARAM_INTERNAL.angle.PID_Ki, 10000)*((float)PM_SLOW_PERIOD_US/1000000),
- u2f(PARAM_INTERNAL.angle.PID_Kd, 10000),
- PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US)) != HAL_OK)
+ u2f(PARAM_INTERNAL->angle.PID_Kp, 10000),
+ u2f(PARAM_INTERNAL->angle.PID_Ki, 10000)*((float)PM_SLOW_PERIOD_US/1000000),
+ u2f(PARAM_INTERNAL->angle.PID_Kd, 10000),
+ PUI_Tnt_CalcAlpha(u2f(PARAM_PUI->Tnt, 1000), PM_SLOW_PERIOD_US)) != HAL_OK)
return HAL_ERROR;
// Инициализация углов
if(Angle_SetRange(&upp.hangle,
- u2f(PARAM_INTERNAL.angle.Angle_Min, 65535),
- u2f(PARAM_INTERNAL.angle.Angle_Max, 65535)) != HAL_OK)
+ u2f(PARAM_INTERNAL->angle.Angle_Min, 65535),
+ u2f(PARAM_INTERNAL->angle.Angle_Max, 65535)) != HAL_OK)
return HAL_ERROR;
@@ -299,46 +299,46 @@ HAL_StatusTypeDef UPP_Params_Init(void)
/*===== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ power_monitor ======*/
/* Инициализация каналов АЦП */
if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_UBA,
- PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UBA],
- u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA], 10),
+ PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UBA],
+ u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UBA], 10),
4095) != HAL_OK)
return HAL_ERROR;
if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_UAC,
- PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC],
- u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC], 10),
+ PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC],
+ u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UAC], 10),
4095) != HAL_OK)
return HAL_ERROR;
if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_IC,
- PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IC],
- u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC], 10),
+ PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC],
+ u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IC], 10),
4095) != HAL_OK)
return HAL_ERROR;
if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_IA,
- PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IA],
- u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA], 10),
+ PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA],
+ u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IA], 10),
4095) != HAL_OK)
return HAL_ERROR;
/* Инициализация алгоритма перехода через ноль */
- if(ZC_Init(&upp.pm.zc, 3, u2f(PARAM_INTERNAL.zc.Hysteresis, 100), PARAM_INTERNAL.zc.DebouneCouner) != HAL_OK)
+ if(ZC_Init(&upp.pm.zc, 3, u2f(PARAM_INTERNAL->zc.Hysteresis, 100), PARAM_INTERNAL->zc.DebouneCouner) != HAL_OK)
return HAL_ERROR;
/* Инициализация RMS фильтра медленного алга */
for(int i = 0; i < RMS_ALL; i++)
{
- if(FilterRMS_Init(&upp.pm.rms[i], PARAM_INTERNAL.pm.rms_window_size))
+ if(FilterRMS_Init(&upp.pm.rms[i], PARAM_INTERNAL->pm.rms_window_size))
return HAL_ERROR;
Filter_Start(&upp.pm.rms[i]);
}
/* Инициализация экпоненциального фильтра медленного алга */
for(int i = 0; i < RMS_EXP_ALL; i++)
{
- if(FilterExp_Init(&upp.pm.rms_exp[i], u2f(PARAM_INTERNAL.pm.rms_exp_alpha, 65535)))
+ if(FilterExp_Init(&upp.pm.rms_exp[i], u2f(PARAM_INTERNAL->pm.rms_exp_alpha, 65535)))
return HAL_ERROR;
Filter_Start(&upp.pm.rms_exp[i]);
}
@@ -346,10 +346,10 @@ HAL_StatusTypeDef UPP_Params_Init(void)
/*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ pwm_thyristors ======*/
- if(PWM_SetConfig(&upp.hpwm, PARAM_INTERNAL.pwm.PhaseMask,
- PARAM_INTERNAL.pwm.Frequency,
- u2f(PARAM_INTERNAL.pwm.Duty, 100),
- PARAM_INTERNAL.pwm.PulseLength) != HAL_OK)
+ if(PWM_SetConfig(&upp.hpwm, PARAM_INTERNAL->pwm.PhaseMask,
+ PARAM_INTERNAL->pwm.Frequency,
+ u2f(PARAM_INTERNAL->pwm.Duty, 100),
+ PARAM_INTERNAL->pwm.PulseLength) != HAL_OK)
return HAL_ERROR;
return HAL_OK;
@@ -362,45 +362,45 @@ HAL_StatusTypeDef UPP_Params_Init(void)
*/
void UPP_Params_Saturate(void)
{
- SATURATE_U16(PARAM_PUI.Iref, 100, 500);
-// SATURATE_U16(PARAM_PUI.Tnt, 50, 5000);
- SATURATE_U16(PARAM_PUI.Umin, 5, 99);
- SATURATE_U16(PARAM_PUI.Umax, 100, 120);
- SATURATE_U16(PARAM_PUI.Imax, 5, 99);
- SATURATE_U16(PARAM_PUI.Imin, 0, 40);
- SATURATE_U16(PARAM_PUI.TiMax, 500, 10000);
- SATURATE_U16(PARAM_PUI.Tdelay, 5, 60);
- SATURATE_U16(PARAM_PUI.Interlace, 0, 1);
+ SATURATE_U16(PARAM_PUI->Iref, 100, 500);
+// SATURATE_U16(PARAM_PUI->Tnt, 50, 5000);
+ SATURATE_U16(PARAM_PUI->Umin, 5, 99);
+ SATURATE_U16(PARAM_PUI->Umax, 100, 120);
+ SATURATE_U16(PARAM_PUI->Imax, 5, 99);
+ SATURATE_U16(PARAM_PUI->Imin, 0, 40);
+ SATURATE_U16(PARAM_PUI->TiMax, 500, 10000);
+ SATURATE_U16(PARAM_PUI->Tdelay, 5, 60);
+ SATURATE_U16(PARAM_PUI->Interlace, 0, 1);
- SATURATE_U16(PARAM_INTERNAL.setpoints.TemperatureWarn, 0, 90);
- SATURATE_U16(PARAM_INTERNAL.setpoints.TemperatureErr, 0, 90);
+ SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureWarn, 0, 90);
+ SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureErr, 0, 90);
- SATURATE_U16(PARAM_INTERNAL.nominal.PhaseNumber, 0, 3);
- SATURATE_U16(PARAM_INTERNAL.nominal.U, 0, ADC_U_MAX_V_DEFAULT*10);
- SATURATE_U16(PARAM_INTERNAL.nominal.U_deviation_plus, 0, 100*100);
- SATURATE_U16(PARAM_INTERNAL.nominal.U_deviation_minus, 0, 100*100);
- SATURATE_U16(PARAM_INTERNAL.nominal.F, 40*100, 60*100);
- SATURATE_U16(PARAM_INTERNAL.nominal.F_deviation_plus, 0, 100*100);
- SATURATE_U16(PARAM_INTERNAL.nominal.F_deviation_minus, 0, 100*100);
- SATURATE_U16(PARAM_INTERNAL.nominal.I, 0, ADC_I_MAX_A_DEFAULT*10);
+ SATURATE_U16(PARAM_INTERNAL->nominal.PhaseNumber, 0, 3);
+ SATURATE_U16(PARAM_INTERNAL->nominal.U, 0, ADC_U_MAX_V_DEFAULT*10);
+ SATURATE_U16(PARAM_INTERNAL->nominal.U_deviation_plus, 0, 100*100);
+ SATURATE_U16(PARAM_INTERNAL->nominal.U_deviation_minus, 0, 100*100);
+ SATURATE_U16(PARAM_INTERNAL->nominal.F, 40*100, 60*100);
+ SATURATE_U16(PARAM_INTERNAL->nominal.F_deviation_plus, 0, 100*100);
+ SATURATE_U16(PARAM_INTERNAL->nominal.F_deviation_minus, 0, 100*100);
+ SATURATE_U16(PARAM_INTERNAL->nominal.I, 0, ADC_I_MAX_A_DEFAULT*10);
- SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA], 0, 5000*10);
- SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC], 0, 5000*10);
- SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC], 0, 1000*10);
- SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA], 0, 1000*10);
- SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UBA], 1848, 2248);
- SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC], 1848, 2248);
- SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IC], 1848, 2248);
- SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IA], 1848, 2248);
+ SATURATE_U16(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UBA], 0, 5000*10);
+ SATURATE_U16(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UAC], 0, 5000*10);
+ SATURATE_U16(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IC], 0, 1000*10);
+ SATURATE_U16(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IA], 0, 1000*10);
+ SATURATE_U16(PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UBA], 1848, 2248);
+ SATURATE_U16(PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC], 1848, 2248);
+ SATURATE_U16(PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC], 1848, 2248);
+ SATURATE_U16(PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA], 1848, 2248);
- SATURATE_U16(PARAM_INTERNAL.pwm.PhaseMask, 0, 7);
- SATURATE_U16(PARAM_INTERNAL.pwm.Frequency, 1000, 40000);
+ SATURATE_U16(PARAM_INTERNAL->pwm.PhaseMask, 0, 7);
+ SATURATE_U16(PARAM_INTERNAL->pwm.Frequency, 1000, 40000);
- SATURATE_U16(PARAM_INTERNAL.zc.Hysteresis, 0, 0.1*100);
- SATURATE_U16(PARAM_INTERNAL.zc.DebouneCouner, 0, 1000);
+ SATURATE_U16(PARAM_INTERNAL->zc.Hysteresis, 0, 0.1*100);
+ SATURATE_U16(PARAM_INTERNAL->zc.DebouneCouner, 0, 1000);
- SATURATE_U16(PARAM_INTERNAL.angle.PulseLengthReserve, 50, 1000);
+ SATURATE_U16(PARAM_INTERNAL->angle.PulseLengthReserve, 50, 1000);
}
/**
@@ -413,58 +413,58 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
{
if(pui_default)
{
- PARAM_PUI.Iref = PUI_Iref_PERCENT_DEFAULT*100;
- PARAM_PUI.Tnt = PUI_Tnt_MS_DEFAULT;
- PARAM_PUI.Umin = PUI_Umin_PERCENT_DEFAULT*100;
- PARAM_PUI.Umax = PUI_Umax_PERCENT_DEFAULT*100;
- PARAM_PUI.Imax = PUI_Imax_PERCENT_DEFAULT*100;
- PARAM_PUI.Imin = PUI_Imin_PERCENT_DEFAULT*100;
- PARAM_PUI.TiMax = PUI_TiMax_US_DEFAULT;
- PARAM_PUI.Tdelay = PUI_Tdelay_SECONDS_DEFAULT;
- PARAM_PUI.Interlace = PUI_Interlace_EN_DEFAULT;
+ PARAM_PUI->Iref = PUI_Iref_PERCENT_DEFAULT*100;
+ PARAM_PUI->Tnt = PUI_Tnt_MS_DEFAULT;
+ PARAM_PUI->Umin = PUI_Umin_PERCENT_DEFAULT*100;
+ PARAM_PUI->Umax = PUI_Umax_PERCENT_DEFAULT*100;
+ PARAM_PUI->Imax = PUI_Imax_PERCENT_DEFAULT*100;
+ PARAM_PUI->Imin = PUI_Imin_PERCENT_DEFAULT*100;
+ PARAM_PUI->TiMax = PUI_TiMax_US_DEFAULT;
+ PARAM_PUI->Tdelay = PUI_Tdelay_SECONDS_DEFAULT;
+ PARAM_PUI->Interlace = PUI_Interlace_EN_DEFAULT;
}
if(internal_default)
{
- PARAM_INTERNAL.setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10;
- PARAM_INTERNAL.setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10;
+ PARAM_INTERNAL->setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10;
+ PARAM_INTERNAL->setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10;
- PARAM_INTERNAL.nominal.PhaseNumber = NOM_PHASE_NUMB;
- PARAM_INTERNAL.nominal.U = NOM_U_V_DEFAULT*10;
- PARAM_INTERNAL.nominal.U_deviation_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100;
- PARAM_INTERNAL.nominal.U_deviation_minus = NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT*100;
- PARAM_INTERNAL.nominal.F = NOM_F_HZ_DEFAULT*100;
- PARAM_INTERNAL.nominal.F_deviation_plus = NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT*100;
- PARAM_INTERNAL.nominal.F_deviation_minus = NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT*100;
- PARAM_INTERNAL.nominal.I = NOM_I_A_DEFAULT*10;
+ PARAM_INTERNAL->nominal.PhaseNumber = NOM_PHASE_NUMB;
+ PARAM_INTERNAL->nominal.U = NOM_U_V_DEFAULT*10;
+ PARAM_INTERNAL->nominal.U_deviation_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100;
+ PARAM_INTERNAL->nominal.U_deviation_minus = NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT*100;
+ PARAM_INTERNAL->nominal.F = NOM_F_HZ_DEFAULT*100;
+ PARAM_INTERNAL->nominal.F_deviation_plus = NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT*100;
+ PARAM_INTERNAL->nominal.F_deviation_minus = NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT*100;
+ PARAM_INTERNAL->nominal.I = NOM_I_A_DEFAULT*10;
- PARAM_INTERNAL.pm.rms_window_size = PM_RMS_WINDOW_PERIOD_US_DEFAULT/PM_SLOW_PERIOD_US;
- PARAM_INTERNAL.pm.rms_exp_alpha = FilterExp_CalcAlpha98(PM_RMS_EXT_TAU_US_DEFAULT, PM_SLOW_PERIOD_US)*65535;
+ PARAM_INTERNAL->pm.rms_window_size = PM_RMS_WINDOW_PERIOD_US_DEFAULT/PM_SLOW_PERIOD_US;
+ PARAM_INTERNAL->pm.rms_exp_alpha = FilterExp_CalcAlpha98(PM_RMS_EXT_TAU_US_DEFAULT, PM_SLOW_PERIOD_US)*65535;
- PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA] = ADC_U_MAX_V_DEFAULT*10;
- PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC] = ADC_U_MAX_V_DEFAULT*10;
- PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC] = ADC_I_MAX_A_DEFAULT*10;
- PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA] = ADC_I_MAX_A_DEFAULT*10;
- PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UBA] = ADC_U_ZERO_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.ADC_Max[ADC_CHANNEL_UBA] = ADC_U_MAX_V_DEFAULT*10;
+ PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UAC] = ADC_U_MAX_V_DEFAULT*10;
+ PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IC] = ADC_I_MAX_A_DEFAULT*10;
+ PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IA] = ADC_I_MAX_A_DEFAULT*10;
+ PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UBA] = ADC_U_ZERO_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.pwm.PhaseMask = 7; // (все три фазы)
- PARAM_INTERNAL.pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT;
- PARAM_INTERNAL.pwm.Duty = PWM_THYR_DUTY_PERCENT_DEFAULT*100;
- PARAM_INTERNAL.pwm.PulseLength = PWM_THYR_PULSE_LENGTH_DEFAULT*65535;
+ PARAM_INTERNAL->pwm.PhaseMask = 7; // (все три фазы)
+ PARAM_INTERNAL->pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT;
+ PARAM_INTERNAL->pwm.Duty = PWM_THYR_DUTY_PERCENT_DEFAULT*100;
+ PARAM_INTERNAL->pwm.PulseLength = PWM_THYR_PULSE_LENGTH_DEFAULT*65535;
- PARAM_INTERNAL.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100;
- PARAM_INTERNAL.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT;
+ PARAM_INTERNAL->zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100;
+ PARAM_INTERNAL->zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT;
- PARAM_INTERNAL.angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*10000;
- PARAM_INTERNAL.angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*10000;
- PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*10000;
- PARAM_INTERNAL.angle.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535;
- PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535;
- PARAM_INTERNAL.angle.PulseLengthReserve = ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT*100;
+ PARAM_INTERNAL->angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*10000;
+ PARAM_INTERNAL->angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*10000;
+ PARAM_INTERNAL->angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*10000;
+ PARAM_INTERNAL->angle.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535;
+ PARAM_INTERNAL->angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535;
+ PARAM_INTERNAL->angle.PulseLengthReserve = ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT*100;
//__AngleSetLimit();
}
}
@@ -475,10 +475,10 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
// Перерасчет максимально допустимого угла
static void __AngleSetLimit(void)
{ // Сколько пачка ипульсов занимает процентов от всего периода
- float pulses_percent_of_period = (((float)PARAM_INTERNAL.pwm.PulseLength / PARAM_INTERNAL.pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(upp.pm.measured.final.Fmean);
+ float pulses_percent_of_period = (((float)PARAM_INTERNAL->pwm.PulseLength / PARAM_INTERNAL->pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(upp.pm.measured.final.Fmean);
// Вычитаем этот процент из 1 - получаем максимально безопасный угол
float angle_limit = 1;
- angle_limit -= pulses_percent_of_period*u2f(PARAM_INTERNAL.angle.PulseLengthReserve, 100); // добавляем запас в PulseLengthReserve процентов от пачки импульсов
+ angle_limit -= pulses_percent_of_period*u2f(PARAM_INTERNAL->angle.PulseLengthReserve, 100); // добавляем запас в PulseLengthReserve процентов от пачки импульсов
Angle_SetLimit(&upp.hangle, angle_limit);
}
diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx
index 2b61035..671ac78 100644
--- a/UPP/MDK-ARM/UPP.uvoptx
+++ b/UPP/MDK-ARM/UPP.uvoptx
@@ -742,30 +742,6 @@
0
0
0
- ..\Core\UPP\pwm_thyristors.c
- pwm_thyristors.c
- 0
- 0
-
-
- 2
- 14
- 5
- 0
- 0
- 0
- ..\Core\UPP\pwm_thyristors.h
- pwm_thyristors.h
- 0
- 0
-
-
- 2
- 15
- 1
- 0
- 0
- 0
..\Core\UPP\angle_control.c
angle_control.c
0
@@ -773,7 +749,7 @@
2
- 16
+ 14
5
0
0
@@ -785,7 +761,7 @@
2
- 17
+ 15
1
0
0
@@ -797,7 +773,7 @@
2
- 18
+ 16
5
0
0
@@ -809,7 +785,7 @@
2
- 19
+ 17
1
0
0
@@ -821,7 +797,7 @@
2
- 20
+ 18
5
0
0
@@ -833,7 +809,7 @@
2
- 21
+ 19
1
0
0
@@ -845,7 +821,7 @@
2
- 22
+ 20
5
0
0
@@ -857,7 +833,7 @@
2
- 23
+ 21
1
0
0
@@ -869,7 +845,7 @@
2
- 24
+ 22
5
0
0
@@ -879,6 +855,30 @@
0
0
+
+ 2
+ 23
+ 1
+ 0
+ 0
+ 0
+ ..\Core\UPP\pwm_thyristors.c
+ pwm_thyristors.c
+ 0
+ 0
+
+
+ 2
+ 24
+ 5
+ 0
+ 0
+ 0
+ ..\Core\UPP\pwm_thyristors.h
+ pwm_thyristors.h
+ 0
+ 0
+
diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx
index 3def99e..b764892 100644
--- a/UPP/MDK-ARM/UPP.uvprojx
+++ b/UPP/MDK-ARM/UPP.uvprojx
@@ -450,16 +450,6 @@
5
..\Core\UPP\upp_main.h
-
- pwm_thyristors.c
- 1
- ..\Core\UPP\pwm_thyristors.c
-
-
- pwm_thyristors.h
- 5
- ..\Core\UPP\pwm_thyristors.h
-
angle_control.c
1
@@ -510,6 +500,16 @@
5
..\Core\UPP\upp_io.h
+
+ pwm_thyristors.c
+ 1
+ ..\Core\UPP\pwm_thyristors.c
+
+
+ pwm_thyristors.h
+ 5
+ ..\Core\UPP\pwm_thyristors.h
+
@@ -1437,16 +1437,6 @@
5
..\Core\UPP\upp_main.h
-
- pwm_thyristors.c
- 1
- ..\Core\UPP\pwm_thyristors.c
-
-
- pwm_thyristors.h
- 5
- ..\Core\UPP\pwm_thyristors.h
-
angle_control.c
1
@@ -1497,6 +1487,16 @@
5
..\Core\UPP\upp_io.h
+
+ pwm_thyristors.c
+ 1
+ ..\Core\UPP\pwm_thyristors.c
+
+
+ pwm_thyristors.h
+ 5
+ ..\Core\UPP\pwm_thyristors.h
+
diff --git a/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx b/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx
new file mode 100644
index 0000000..f2e7e6f
Binary files /dev/null and b/Информация для программиста (УПП СП СЭД)/Modbus Карта.docx differ