Чуть рефакторинга

This commit is contained in:
2026-01-24 15:30:19 +03:00
parent 8e75c38c90
commit 9f9af482cf
13 changed files with 445 additions and 398 deletions

Binary file not shown.

View File

@@ -74,6 +74,51 @@ typedef enum {
Err_Interlace = 21, ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t) Err_Interlace = 21, ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
} UPP_ErrorType_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 Структура данных от УПП передаваемых в ПУИ * @brief Структура данных от УПП передаваемых в ПУИ
@@ -85,13 +130,32 @@ typedef struct {
uint16_t WorkMode; /** @brief Адрес 1: Режим работы uint16_t WorkMode; /** @brief Адрес 1: Режим работы
@details «Готовность» или «Работа» */ @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; } UPP_PUI_Values_t;
/** /**
@@ -180,11 +244,12 @@ typedef struct {
#define SQRT2 1.4142135 #define SQRT2 1.4142135
/* Дефайны для "удобного" доступа к структурам */ /* Дефайны для "удобного" доступа к структурам */
#define PARAM_INTERNAL MB_INTERNAL.param //#define PARAM_INTERNAL MB_INTERNAL.param
#define PARAM_PUI MB_DATA.HoldRegs.pui_params //#define PARAM_PUI MB_DATA.HoldRegs.pui_params
#define ERR_PUI errors.pui.err //#define ERR_PUI errors.pui.err
#define ERR_PRIVATE errors.prvt.f.err //#define ERR_PRIVATE errors.prvt.f.err
#define ERR_PRIVATE_CNT errors.prvt.cnt //#define ERR_PRIVATE_CNT errors.prvt.cnt
/* Enum'ы УПП */ /* Enum'ы УПП */
/** /**

View File

@@ -52,6 +52,12 @@ extern "C" {
/* Exported macro ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */ /* 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 */ /* USER CODE END EM */
/* Exported functions prototypes ---------------------------------------------*/ /* Exported functions prototypes ---------------------------------------------*/

View File

@@ -130,8 +130,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
float iphase_mean = 0; // средний ток каждой фазы float iphase_mean = 0; // средний ток каждой фазы
float uphase_mean = 0; // среднее напряжение каждой фазы float uphase_mean = 0; // среднее напряжение каждой фазы
// Дополнительно посчитаем значения в реальных Вольтах/Амперах // Дополнительно посчитаем значения в реальных Вольтах/Амперах
float u_base = u2f(PARAM_INTERNAL.nominal.U, 10); float u_base = u2f(PARAM_INTERNAL->nominal.U, 10);
float i_base = u2f(PARAM_INTERNAL.nominal.I, 10); float i_base = u2f(PARAM_INTERNAL->nominal.I, 10);
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
{ {
/* Получение частоты фазы */ /* Получение частоты фазы */
@@ -189,8 +189,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
{ {
if(hpm == NULL) if(hpm == NULL)
return; return;
float u_base = u2f(PARAM_INTERNAL.nominal.U, 10); float u_base = u2f(PARAM_INTERNAL->nominal.U, 10);
float i_base = u2f(PARAM_INTERNAL.nominal.I, 10); float i_base = u2f(PARAM_INTERNAL->nominal.I, 10);
PowerMonitor_Measured_t *meas = &hpm->measured; PowerMonitor_Measured_t *meas = &hpm->measured;
/* Считываем АЦП с пересчетами и медианой фильтрацией от выбросов */ /* Считываем АЦП с пересчетами и медианой фильтрацией от выбросов */
@@ -233,8 +233,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
} }
else // если уже запущена - ставим overrun slow calc else // если уже запущена - ставим overrun slow calc
{ {
ERR_PRIVATE.overrun_slow_calc = 1; ERR_PRIVATE->overrun_slow_calc = 1;
ERR_PRIVATE_CNT.overrun_slow_calc++; ERR_PRIVATE_CNT->overrun_slow_calc++;
} }
} }
else else
@@ -258,21 +258,21 @@ int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running)
return 1; return 1;
PowerMonitor_Measured_t *measure = &hpm->measured; PowerMonitor_Measured_t *measure = &hpm->measured;
UPP_PUI_Params_t *protect = &PARAM_PUI; UPP_PUI_Params_t *params = PARAM_PUI;
UPP_ParamsNominal_t *nominal = &PARAM_INTERNAL.nominal; 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) 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) if(errors.prvt.f.all)

View File

@@ -14,40 +14,40 @@
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ * Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ
* @return 1 - напряжение есть, 0 - напряжения нет * @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 lUmin = u2f(params->Umin, 100)/**u2f(nominal->U, 10)*/;
float lUmax = u2f(protect->Umax, 100)/**u2f(nominal->U, 10)*/; float lUmax = u2f(params->Umax, 100)/**u2f(nominal->U, 10)*/;
float lPhaseSequence = u2f(nominal->PhaseSequence, 100); float lPhaseSequence = u2f(nominal->PhaseSequence, 100);
/* Общее напряжение */ /* Общее напряжение */
if(measure->final.Uamp > lUmax) if(measure->final.Uamp > lUmax)
{ {
ERR_PRIVATE.uamp_max = 1; ERR_PRIVATE->uamp_max = 1;
} }
else if (measure->final.Uamp < lUmin) else if (measure->final.Uamp < lUmin)
{ {
ERR_PRIVATE.uamp_min = 1; ERR_PRIVATE->uamp_min = 1;
} }
else else
{ {
ERR_PRIVATE.uamp_max = 0; ERR_PRIVATE->uamp_max = 0;
ERR_PRIVATE.uamp_min = 0; ERR_PRIVATE->uamp_min = 0;
} }
/* Последовательность фаз */ /* Последовательность фаз */
int realPhaseSequence = 0; int realPhaseSequence = 0;
if(realPhaseSequence != lPhaseSequence) if(realPhaseSequence != lPhaseSequence)
{ {
ERR_PRIVATE.interlance = 1; ERR_PRIVATE->interlance = 1;
} }
else 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 ошибок (приватные). * @note Заполняет флаги prvt ошибок (приватные).
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ * Потом в @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 lIref = u2f(params->Iref, 100)/**u2f(nominal->I, 10)*/;
float lImin = u2f(protect->Imin, 100)/**u2f(nominal->I, 10)*/; float lImin = u2f(params->Imin, 100)/**u2f(nominal->I, 10)*/;
float lImax = u2f(protect->Imax, 100) * 50 / u2f(nominal->I, 10); // Imax процентов от 50 А, в о.е. от номинального float lImax = u2f(params->Imax, 100) * 50 / u2f(nominal->I, 10); // Imax процентов от 50 А, в о.е. от номинального
/* Общий ток */ /* Общий ток */
if(measure->final.Iamp > lImax) if(measure->final.Iamp > lImax)
{ {
ERR_PRIVATE.iamp_max = 1; ERR_PRIVATE->iamp_max = 1;
} }
else if (measure->final.Iamp < lImin) else if (measure->final.Iamp < lImin)
{ {
ERR_PRIVATE.iamp_min = 1; ERR_PRIVATE->iamp_min = 1;
} }
else else
{ {
ERR_PRIVATE.iamp_max = 0; ERR_PRIVATE->iamp_max = 0;
ERR_PRIVATE.iamp_min = 0; ERR_PRIVATE->iamp_min = 0;
} }
/* Ток по фазам */ /* Ток по фазам */
if(measure->final.I[I_A] > lImax) 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) else if (measure->final.I[I_A] < lImin)
{ {
ERR_PRIVATE.ia_min = 1; ERR_PRIVATE->ia_min = 1;
} }
else else
{ {
ERR_PRIVATE.ia_max = 0; ERR_PRIVATE->ia_max = 0;
ERR_PRIVATE.ia_min = 0; ERR_PRIVATE->ia_min = 0;
} }
if(measure->final.I[I_B] > lImax) 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) else if (measure->final.I[I_B] < lImin)
{ {
ERR_PRIVATE.ib_min = 1; ERR_PRIVATE->ib_min = 1;
} }
else else
{ {
ERR_PRIVATE.ib_max = 0; ERR_PRIVATE->ib_max = 0;
ERR_PRIVATE.ib_min = 0; ERR_PRIVATE->ib_min = 0;
} }
if(measure->final.I[I_C] > lImax) 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) else if (measure->final.I[I_C] < lImin)
{ {
ERR_PRIVATE.ic_min = 1; ERR_PRIVATE->ic_min = 1;
} }
else else
{ {
ERR_PRIVATE.ic_max = 0; ERR_PRIVATE->ic_max = 0;
ERR_PRIVATE.ic_min = 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 ошибок (приватные). * @note Заполняет флаги prvt ошибок (приватные).
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ * Потом в @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 lFnom = u2f(PARAM_INTERNAL->nominal.F, 100);
float lFmin = lFnom - lFnom*u2f(PARAM_INTERNAL.nominal.F_deviation_minus, 10000); 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 lFmax = lFnom + lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_plus, 10000);
float lTwarn = u2f(PARAM_INTERNAL.setpoints.TemperatureWarn, 100); float lTwarn = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100);
float lTerr = u2f(PARAM_INTERNAL.setpoints.TemperatureWarn, 100); float lTerr = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100);
/*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/ /*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/
if(measure->final.F[U_CA] > lFmax) 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) else if (measure->final.F[U_CA] < lFmin)
{ {
ERR_PRIVATE.fac_min = 1; ERR_PRIVATE->fac_min = 1;
} }
else else
{ {
ERR_PRIVATE.fac_max = 0; ERR_PRIVATE->fac_max = 0;
ERR_PRIVATE.fac_min = 0; ERR_PRIVATE->fac_min = 0;
} }
if(measure->final.F[U_AB] > lFmax) 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) else if (measure->final.F[U_AB] < lFmin)
{ {
ERR_PRIVATE.fba_min = 1; ERR_PRIVATE->fba_min = 1;
} }
else else
{ {
ERR_PRIVATE.fba_max = 0; ERR_PRIVATE->fba_max = 0;
ERR_PRIVATE.fba_min = 0; ERR_PRIVATE->fba_min = 0;
} }
if(measure->final.F[U_BC] > lFmax) 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) else if (measure->final.F[U_BC] < lFmin)
{ {
ERR_PRIVATE.fbc_min = 1; ERR_PRIVATE->fbc_min = 1;
} }
else else
{ {
ERR_PRIVATE.fbc_max = 0; ERR_PRIVATE->fbc_max = 0;
ERR_PRIVATE.fbc_min = 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) 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) else if (measure->final.T[TEMP_1] > lTwarn)
{ {
ERR_PRIVATE.temp_warn = 1; ERR_PRIVATE->temp_warn = 1;
} }
else else
{ {
ERR_PRIVATE.temp_err = 0; ERR_PRIVATE->temp_err = 0;
ERR_PRIVATE.temp_warn = 0; ERR_PRIVATE->temp_warn = 0;
} }
} }

View File

@@ -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_ */ #endif /* _POWER_PROTECT_H_ */

View File

@@ -7,10 +7,10 @@
Общая логика: Общая логика:
В программе выставляются всякие внутренние флаги ошибок: ERR_PRIVATE В программе выставляются всякие внутренние флаги ошибок: 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_5Vsi = GPIO_Read_Switch(&UPP_DIN.err_5Vsi);
int err_Va = GPIO_Read_Switch(&UPP_DIN.err_Va); int err_Va = GPIO_Read_Switch(&UPP_DIN.err_Va);
ERR_PUI.Power_DIO_24V = err_24Vdio; ERR_PUI->Power_DIO_24V = err_24Vdio;
ERR_PUI.Power_24V = err_24V; ERR_PUI->Power_24V = err_24V;
ERR_PUI.Power_Digit_5V = err_5Vd; ERR_PUI->Power_Digit_5V = err_5Vd;
ERR_PUI.Power_SCI_5V = err_5Vsi; ERR_PUI->Power_SCI_5V = err_5Vsi;
ERR_PUI.Power_Analog_5V = err_Va; ERR_PUI->Power_Analog_5V = err_Va;
} }
void UPP_Errors_Ranges(void) 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 IMaxCnt = 0;
static int UMaxCnt = 0; static int UMaxCnt = 0;
@@ -87,48 +87,48 @@ void UPP_Errors_Ranges(void)
static int TMaxCnt = 0; static int TMaxCnt = 0;
/* Напряжения */ /* Напряжения */
ERR_PUI.OverVoltage = setError(ERR_PRIVATE.uamp_max, ERR_PUI->OverVoltage = setError(ERR_PRIVATE->uamp_max,
ERR_PUI.OverVoltage, ERR_PUI->OverVoltage,
&UMaxCnt, &UMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR));
ERR_PUI.UnderVoltage = setError(ERR_PRIVATE.uamp_min, ERR_PUI->UnderVoltage = setError(ERR_PRIVATE->uamp_min,
ERR_PUI.UnderVoltage, ERR_PUI->UnderVoltage,
&UMinCnt, &UMinCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR));
/* Токи */ /* Токи */
int i_max = ( ERR_PRIVATE.iamp_max || int i_max = ( ERR_PRIVATE->iamp_max ||
ERR_PRIVATE.ia_max || ERR_PRIVATE->ia_max ||
ERR_PRIVATE.ib_max || ERR_PRIVATE->ib_max ||
ERR_PRIVATE.ic_max); ERR_PRIVATE->ic_max);
ERR_PUI.OverCurrent = setError(i_max, ERR_PUI->OverCurrent = setError(i_max,
ERR_PUI.OverCurrent, ERR_PUI->OverCurrent,
&IMaxCnt, &IMaxCnt,
ticksTiMax); ticksTiMax);
/* Частота */ /* Частота */
int f_max = ( ERR_PRIVATE.fac_max || int f_max = ( ERR_PRIVATE->fac_max ||
ERR_PRIVATE.fba_max || ERR_PRIVATE->fba_max ||
ERR_PRIVATE.fbc_max); ERR_PRIVATE->fbc_max);
int f_min = ( ERR_PRIVATE.fac_min || int f_min = ( ERR_PRIVATE->fac_min ||
ERR_PRIVATE.fba_min || ERR_PRIVATE->fba_min ||
ERR_PRIVATE.fbc_min); ERR_PRIVATE->fbc_min);
ERR_PUI.OverFrequency = setError(f_max, ERR_PUI->OverFrequency = setError(f_max,
ERR_PUI.OverFrequency, ERR_PUI->OverFrequency,
&FMaxCnt, &FMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR));
ERR_PUI.UnderFrequency = setError( f_min, ERR_PUI->UnderFrequency = setError( f_min,
ERR_PUI.UnderFrequency, ERR_PUI->UnderFrequency,
&FMinCnt, &FMinCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR));
/* Температуры */ /* Температуры */
ERR_PUI.OverTemperature = setError(ERR_PRIVATE.temp_err, ERR_PUI->OverTemperature = setError(ERR_PRIVATE->temp_err,
ERR_PUI.OverTemperature, ERR_PUI->OverTemperature,
&TMaxCnt, &TMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
} }
@@ -141,39 +141,39 @@ void UPP_Errors_LossPhase(void)
static int LossPhaseBCnt = 0; static int LossPhaseBCnt = 0;
static int LossPhaseCCnt = 0; static int LossPhaseCCnt = 0;
int loss_phases_all = ( ERR_PRIVATE.ia_min && int loss_phases_all = ( ERR_PRIVATE->ia_min &&
ERR_PRIVATE.ib_min && ERR_PRIVATE->ib_min &&
ERR_PRIVATE.ic_min ); ERR_PRIVATE->ic_min );
ERR_PUI.LossPhaseAll = setError( loss_phases_all, ERR_PUI->LossPhaseAll = setError( loss_phases_all,
ERR_PUI.LossPhaseAll, ERR_PUI->LossPhaseAll,
&LossPhaseAllCnt, &LossPhaseAllCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); 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 = setError( ERR_PRIVATE->ia_min,
ERR_PUI.LossPhaseA, ERR_PUI->LossPhaseA,
&LossPhaseACnt, &LossPhaseACnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
ERR_PUI.LossPhaseB = setError( ERR_PRIVATE.ib_min, ERR_PUI->LossPhaseB = setError( ERR_PRIVATE->ib_min,
ERR_PUI.LossPhaseB, ERR_PUI->LossPhaseB,
&LossPhaseBCnt, &LossPhaseBCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
ERR_PUI.LossPhaseC = setError( ERR_PRIVATE.ic_min, ERR_PUI->LossPhaseC = setError( ERR_PRIVATE->ic_min,
ERR_PUI.LossPhaseC, ERR_PUI->LossPhaseC,
&LossPhaseCCnt, &LossPhaseCCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
} }
/* Если всех фаз нет, то отдельные не смотрим */ /* Если всех фаз нет, то отдельные не смотрим */
else else
{ {
ERR_PUI.LossPhaseA = 0; ERR_PUI->LossPhaseA = 0;
ERR_PUI.LossPhaseB = 0; ERR_PUI->LossPhaseB = 0;
ERR_PUI.LossPhaseC = 0; ERR_PUI->LossPhaseC = 0;
} }
} }
@@ -182,13 +182,13 @@ void UPP_Errors_Other(void)
static int InterlaceCnt = 0; static int InterlaceCnt = 0;
if(ERR_PRIVATE.longstart) if(ERR_PRIVATE->longstart)
ERR_PUI.LongStart = 1; ERR_PUI->LongStart = 1;
else else
ERR_PUI.LongStart = 0; ERR_PUI->LongStart = 0;
ERR_PUI.Interlace = setError(ERR_PRIVATE.interlance, ERR_PUI->Interlace = setError(ERR_PRIVATE->interlance,
ERR_PUI.Interlace, ERR_PUI->Interlace,
&InterlaceCnt, &InterlaceCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT)); MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
//Interlance //Interlance

View File

@@ -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 Структура с всеми ошибками УПП * @brief Структура с всеми ошибками УПП
*/ */
@@ -61,97 +116,18 @@ typedef struct
union union
{ {
uint32_t all; uint32_t all;
struct UPP_PUI_Error_t err;
{ }pui; ///< Ошибки ПУИ
/* Програмные ошибки */
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;
struct struct
{ {
union union
{ {
uint64_t all; uint64_t all;
struct UPP_PrvtErrors_t err;
{
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;
}f; }f;
struct UPP_ErrorsCnt_t cnt;
{
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;
}prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ }prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ
}UPP_Errors_t; }UPP_Errors_t;

View File

@@ -30,7 +30,7 @@ int UPP_App_Init(void)
BenchTime_Init(); BenchTime_Init();
// Подключение указателей // Подключение указателей
upp.errors = &errors; upp.errors = &errors;
upp.PUI.params = &PARAM_PUI; upp.PUI.params = &MB_DATA.HoldRegs.pui_params;
upp.PUI.values = &MB_DATA.InRegs.pui; upp.PUI.values = &MB_DATA.InRegs.pui;
upp.call = &MB_INTERNAL.FuncCalls; upp.call = &MB_INTERNAL.FuncCalls;
@@ -45,7 +45,7 @@ int UPP_App_Init(void)
if(PWM_Init(&upp.hpwm) != HAL_OK) if(PWM_Init(&upp.hpwm) != HAL_OK)
{ {
return 1; return 1;
} }
if(Angle_Init(&upp.hangle) != HAL_OK) if(Angle_Init(&upp.hangle) != HAL_OK)
{ {
return 1; return 1;
@@ -89,13 +89,14 @@ int UPP_While(void)
{ {
static uint32_t slow_cnt = 0; 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; 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 res = HAL_IWDG_Refresh(&hiwdg); // если не вызываются медленные расчеты - что-то не то сбрасываемся по watchdog
int razgon_done = (fabsf(upp.hangle.Iref - u2f(PARAM_PUI->Iref, 100)) < 0.1);
// Медленные расчеты // Медленные расчеты
PowerMonitor_SlowCalc(&upp.pm); PowerMonitor_SlowCalc(&upp.pm);
int razgon_done = (fabsf(upp.hangle.Iref - u2f(PARAM_PUI.Iref, 100)) < 0.1);
#ifdef UPP_SIMULATE_I // симулируем токи #ifdef UPP_SIMULATE_I // симулируем токи
upp.pm.measured.final.Iamp = upp.hangle.Iref/2; upp.pm.measured.final.Iamp = upp.hangle.Iref/2;
// При симуляции тока не включаем его проверку // При симуляции тока не включаем его проверку
@@ -110,8 +111,6 @@ int UPP_While(void)
UPP_Params_Control(); UPP_Params_Control();
#ifndef UPP_DISABLE_ERROR_BLOCK #ifndef UPP_DISABLE_ERROR_BLOCK
// если ошибка вызываем СТОП // если ошибка вызываем СТОП
upp.call->stop = (errors.common != Err_None); upp.call->stop = (errors.common != Err_None);
@@ -129,6 +128,7 @@ int UPP_While(void)
// Если СТОП - переходим в ошибку // Если СТОП - переходим в ошибку
if (upp.call->stop) if (upp.call->stop)
upp.workmode = UPP_Error; upp.workmode = UPP_Error;
// Автомат состояний УПП // Автомат состояний УПП
switch(upp.workmode) switch(upp.workmode)
{ {
@@ -146,8 +146,8 @@ int UPP_While(void)
} }
if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS)) if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS))
{ // конец инициализации - сбрасываем чтобы потом еще раз инициализироватся { // конец инициализации
slow_cnt = 0; slow_cnt = 0; // сбрасываем счетчик для следующей инициализации
upp.workmode = UPP_Ready; upp.workmode = UPP_Ready;
} }
else else
@@ -188,16 +188,16 @@ int UPP_While(void)
// Коррекция для отсчета угла открытия // Коррекция для отсчета угла открытия
// 30 градусов - сдвиг между линейными и фазными напряжениями // 30 градусов - сдвиг между линейными и фазными напряжениями
// 30 градусов - фазовое смщеение эксп. фильтра АЦП для сглаживания напряжений // 0 градусов - фазовое смщеение эксп. фильтра АЦП для сглаживания напряжений
float Correction = 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)) if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000))
{ {
ERR_PRIVATE.longstart = 1; ERR_PRIVATE->longstart = 1;
} }
break; break;
@@ -272,8 +272,8 @@ void UPP_ADC_Handle(void)
if(upp.pm.f.inIsr) if(upp.pm.f.inIsr)
{ {
ERR_PRIVATE.overrun_fast_calc = 1; ERR_PRIVATE->overrun_fast_calc = 1;
ERR_PRIVATE_CNT.overrun_fast_calc++; ERR_PRIVATE_CNT->overrun_fast_calc++;
return; return;
} }
upp.pm.f.inIsr = 1; upp.pm.f.inIsr = 1;

View File

@@ -23,7 +23,7 @@
* *
* // В UPP_Params_ControlInternal(): * // В UPP_Params_ControlInternal():
* float new_param = module.param; * 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; * module_update = 1;
* } * }
@@ -36,7 +36,7 @@
* } * }
* *
* // В UPP_Params_SetDefault(): * // В 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; return;
/* Tnt - Уставка на скорость нарастания пускового тока */ /* 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; float angle_ref_alpha = upp.hangle.refFilter.alpha;
if(angle_ref_alpha != angle_ref_alphaPUI) if(angle_ref_alpha != angle_ref_alphaPUI)
{ {
@@ -85,7 +85,7 @@ void UPP_Params_ControlPUI(void)
upp.hangle.pid.Ki, upp.hangle.pid.Ki,
upp.hangle.pid.Kd, upp.hangle.pid.Kd,
angle_ref_alpha) != HAL_OK) 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; 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; 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; 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; 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; alpha_update = 1;
} }
@@ -162,47 +162,47 @@ void UPP_Params_ControlInternal(void)
adc_channel_zero[i] = upp.pm.adc.Coefs[i].lZero; 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; 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; 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; zc_update = 1;
} }
if(__CheckParamU16(&zc_debounce, PARAM_INTERNAL.zc.DebouneCouner)) if(__CheckParamU16(&zc_debounce, PARAM_INTERNAL->zc.DebouneCouner))
{ {
zc_update = 1; 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; pwm_update = 1;
} }
if(__CheckParamU16(&pwm_freq, PARAM_INTERNAL.pwm.Frequency)) if(__CheckParamU16(&pwm_freq, PARAM_INTERNAL->pwm.Frequency))
{ {
pwm_update = 1; pwm_update = 1;
} }
if(__CheckParamF(&pwm_duty, PARAM_INTERNAL.pwm.Duty, 100)) if(__CheckParamF(&pwm_duty, PARAM_INTERNAL->pwm.Duty, 100))
{ {
pwm_update = 1; 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; 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++) for(int i = 0; i < RMS_ALL; i++)
{ {
@@ -210,7 +210,7 @@ void UPP_Params_ControlInternal(void)
Filter_Start(&upp.pm.rms[i]); 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++) for(int i = 0; i < RMS_EXP_ALL; i++)
{ {
@@ -234,10 +234,10 @@ void UPP_Params_ControlInternal(void)
alpha_update = 0; alpha_update = 0;
} }
else else
ERR_PRIVATE_CNT.angle_reinit_err++; ERR_PRIVATE_CNT->angle_reinit_err++;
} }
else else
ERR_PRIVATE_CNT.angle_reinit_err++; ERR_PRIVATE_CNT->angle_reinit_err++;
} }
// Обновление АЦП конфигов // Обновление АЦП конфигов
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) 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) if(ADC_ConfigChannel(&upp.pm.adc, i, adc_channel_zero[i], adc_channel_max[i], 4095) == HAL_OK)
adc_channel_update[i] = 0; adc_channel_update[i] = 0;
else else
ERR_PRIVATE_CNT.adc_reinit_err++; ERR_PRIVATE_CNT->adc_reinit_err++;
} }
} }
// Обновление Zero-Cross конфигов // Обновление 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) if(ZC_Init(&upp.pm.zc, upp.pm.zc.Config.NumChannels, zc_hysteresis, zc_debounce) == HAL_OK)
zc_update = 0; zc_update = 0;
else else
ERR_PRIVATE_CNT.zc_reinit_err++; ERR_PRIVATE_CNT->zc_reinit_err++;
} }
// Обновление ШИМ конфигов // Обновление ШИМ конфигов
if(pwm_update) if(pwm_update)
@@ -266,7 +266,7 @@ void UPP_Params_ControlInternal(void)
pwm_update = 0; pwm_update = 0;
} }
else 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 ======*/ /*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ angle_control ======*/
// Инициализация ПИД // Инициализация ПИД
if(Angle_PID_Init(&upp.hangle, if(Angle_PID_Init(&upp.hangle,
u2f(PARAM_INTERNAL.angle.PID_Kp, 10000), 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_Ki, 10000)*((float)PM_SLOW_PERIOD_US/1000000),
u2f(PARAM_INTERNAL.angle.PID_Kd, 10000), u2f(PARAM_INTERNAL->angle.PID_Kd, 10000),
PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US)) != HAL_OK) PUI_Tnt_CalcAlpha(u2f(PARAM_PUI->Tnt, 1000), PM_SLOW_PERIOD_US)) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
// Инициализация углов // Инициализация углов
if(Angle_SetRange(&upp.hangle, if(Angle_SetRange(&upp.hangle,
u2f(PARAM_INTERNAL.angle.Angle_Min, 65535), u2f(PARAM_INTERNAL->angle.Angle_Min, 65535),
u2f(PARAM_INTERNAL.angle.Angle_Max, 65535)) != HAL_OK) u2f(PARAM_INTERNAL->angle.Angle_Max, 65535)) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
@@ -299,46 +299,46 @@ HAL_StatusTypeDef UPP_Params_Init(void)
/*===== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ power_monitor ======*/ /*===== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ power_monitor ======*/
/* Инициализация каналов АЦП */ /* Инициализация каналов АЦП */
if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_UBA, if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_UBA,
PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UBA], PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UBA],
u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA], 10), u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UBA], 10),
4095) != HAL_OK) 4095) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_UAC, if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_UAC,
PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC], PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC],
u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC], 10), u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_UAC], 10),
4095) != HAL_OK) 4095) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_IC, if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_IC,
PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IC], PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC],
u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IC], 10), u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IC], 10),
4095) != HAL_OK) 4095) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_IA, if(ADC_ConfigChannel(&upp.pm.adc, ADC_CHANNEL_IA,
PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IA], PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA],
u2f(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA], 10), u2f(PARAM_INTERNAL->adc.ADC_Max[ADC_CHANNEL_IA], 10),
4095) != HAL_OK) 4095) != HAL_OK)
return HAL_ERROR; 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; return HAL_ERROR;
/* Инициализация RMS фильтра медленного алга */ /* Инициализация RMS фильтра медленного алга */
for(int i = 0; i < RMS_ALL; i++) 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; return HAL_ERROR;
Filter_Start(&upp.pm.rms[i]); Filter_Start(&upp.pm.rms[i]);
} }
/* Инициализация экпоненциального фильтра медленного алга */ /* Инициализация экпоненциального фильтра медленного алга */
for(int i = 0; i < RMS_EXP_ALL; 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; return HAL_ERROR;
Filter_Start(&upp.pm.rms_exp[i]); Filter_Start(&upp.pm.rms_exp[i]);
} }
@@ -346,10 +346,10 @@ HAL_StatusTypeDef UPP_Params_Init(void)
/*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ pwm_thyristors ======*/ /*====== ИНИЦИАЛИЗАЦИЯ МОДУЛЯ pwm_thyristors ======*/
if(PWM_SetConfig(&upp.hpwm, PARAM_INTERNAL.pwm.PhaseMask, if(PWM_SetConfig(&upp.hpwm, PARAM_INTERNAL->pwm.PhaseMask,
PARAM_INTERNAL.pwm.Frequency, PARAM_INTERNAL->pwm.Frequency,
u2f(PARAM_INTERNAL.pwm.Duty, 100), u2f(PARAM_INTERNAL->pwm.Duty, 100),
PARAM_INTERNAL.pwm.PulseLength) != HAL_OK) PARAM_INTERNAL->pwm.PulseLength) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
return HAL_OK; return HAL_OK;
@@ -362,45 +362,45 @@ HAL_StatusTypeDef UPP_Params_Init(void)
*/ */
void UPP_Params_Saturate(void) void UPP_Params_Saturate(void)
{ {
SATURATE_U16(PARAM_PUI.Iref, 100, 500); SATURATE_U16(PARAM_PUI->Iref, 100, 500);
// SATURATE_U16(PARAM_PUI.Tnt, 50, 5000); // SATURATE_U16(PARAM_PUI->Tnt, 50, 5000);
SATURATE_U16(PARAM_PUI.Umin, 5, 99); SATURATE_U16(PARAM_PUI->Umin, 5, 99);
SATURATE_U16(PARAM_PUI.Umax, 100, 120); SATURATE_U16(PARAM_PUI->Umax, 100, 120);
SATURATE_U16(PARAM_PUI.Imax, 5, 99); SATURATE_U16(PARAM_PUI->Imax, 5, 99);
SATURATE_U16(PARAM_PUI.Imin, 0, 40); SATURATE_U16(PARAM_PUI->Imin, 0, 40);
SATURATE_U16(PARAM_PUI.TiMax, 500, 10000); SATURATE_U16(PARAM_PUI->TiMax, 500, 10000);
SATURATE_U16(PARAM_PUI.Tdelay, 5, 60); SATURATE_U16(PARAM_PUI->Tdelay, 5, 60);
SATURATE_U16(PARAM_PUI.Interlace, 0, 1); SATURATE_U16(PARAM_PUI->Interlace, 0, 1);
SATURATE_U16(PARAM_INTERNAL.setpoints.TemperatureWarn, 0, 90); SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureWarn, 0, 90);
SATURATE_U16(PARAM_INTERNAL.setpoints.TemperatureErr, 0, 90); SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureErr, 0, 90);
SATURATE_U16(PARAM_INTERNAL.nominal.PhaseNumber, 0, 3); 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, 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_plus, 0, 100*100);
SATURATE_U16(PARAM_INTERNAL.nominal.U_deviation_minus, 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, 40*100, 60*100);
SATURATE_U16(PARAM_INTERNAL.nominal.F_deviation_plus, 0, 100*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.F_deviation_minus, 0, 100*100);
SATURATE_U16(PARAM_INTERNAL.nominal.I, 0, ADC_I_MAX_A_DEFAULT*10); 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_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_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_IC], 0, 1000*10);
SATURATE_U16(PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_IA], 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_UBA], 1848, 2248);
SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC], 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_IC], 1848, 2248);
SATURATE_U16(PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IA], 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.PhaseMask, 0, 7);
SATURATE_U16(PARAM_INTERNAL.pwm.Frequency, 1000, 40000); SATURATE_U16(PARAM_INTERNAL->pwm.Frequency, 1000, 40000);
SATURATE_U16(PARAM_INTERNAL.zc.Hysteresis, 0, 0.1*100); SATURATE_U16(PARAM_INTERNAL->zc.Hysteresis, 0, 0.1*100);
SATURATE_U16(PARAM_INTERNAL.zc.DebouneCouner, 0, 1000); 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) if(pui_default)
{ {
PARAM_PUI.Iref = PUI_Iref_PERCENT_DEFAULT*100; PARAM_PUI->Iref = PUI_Iref_PERCENT_DEFAULT*100;
PARAM_PUI.Tnt = PUI_Tnt_MS_DEFAULT; PARAM_PUI->Tnt = PUI_Tnt_MS_DEFAULT;
PARAM_PUI.Umin = PUI_Umin_PERCENT_DEFAULT*100; PARAM_PUI->Umin = PUI_Umin_PERCENT_DEFAULT*100;
PARAM_PUI.Umax = PUI_Umax_PERCENT_DEFAULT*100; PARAM_PUI->Umax = PUI_Umax_PERCENT_DEFAULT*100;
PARAM_PUI.Imax = PUI_Imax_PERCENT_DEFAULT*100; PARAM_PUI->Imax = PUI_Imax_PERCENT_DEFAULT*100;
PARAM_PUI.Imin = PUI_Imin_PERCENT_DEFAULT*100; PARAM_PUI->Imin = PUI_Imin_PERCENT_DEFAULT*100;
PARAM_PUI.TiMax = PUI_TiMax_US_DEFAULT; PARAM_PUI->TiMax = PUI_TiMax_US_DEFAULT;
PARAM_PUI.Tdelay = PUI_Tdelay_SECONDS_DEFAULT; PARAM_PUI->Tdelay = PUI_Tdelay_SECONDS_DEFAULT;
PARAM_PUI.Interlace = PUI_Interlace_EN_DEFAULT; PARAM_PUI->Interlace = PUI_Interlace_EN_DEFAULT;
} }
if(internal_default) if(internal_default)
{ {
PARAM_INTERNAL.setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10; PARAM_INTERNAL->setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10;
PARAM_INTERNAL.setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10; PARAM_INTERNAL->setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10;
PARAM_INTERNAL.nominal.PhaseNumber = NOM_PHASE_NUMB; PARAM_INTERNAL->nominal.PhaseNumber = NOM_PHASE_NUMB;
PARAM_INTERNAL.nominal.U = NOM_U_V_DEFAULT*10; 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_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100;
PARAM_INTERNAL.nominal.U_deviation_minus = NOM_U_DEVIATION_MINUS_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 = NOM_F_HZ_DEFAULT*100;
PARAM_INTERNAL.nominal.F_deviation_plus = NOM_F_DEVIATION_PLUS_PERCENT_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.F_deviation_minus = NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT*100;
PARAM_INTERNAL.nominal.I = NOM_I_A_DEFAULT*10; 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_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_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_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_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_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_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_UBA] = ADC_U_ZERO_DEFAULT;
PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_UAC] = 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_IC] = ADC_I_ZERO_DEFAULT;
PARAM_INTERNAL.adc.ADC_Zero[ADC_CHANNEL_IA] = ADC_I_ZERO_DEFAULT; PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA] = ADC_I_ZERO_DEFAULT;
PARAM_INTERNAL.pwm.PhaseMask = 7; // (все три фазы) PARAM_INTERNAL->pwm.PhaseMask = 7; // (все три фазы)
PARAM_INTERNAL.pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT; PARAM_INTERNAL->pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT;
PARAM_INTERNAL.pwm.Duty = PWM_THYR_DUTY_PERCENT_DEFAULT*100; PARAM_INTERNAL->pwm.Duty = PWM_THYR_DUTY_PERCENT_DEFAULT*100;
PARAM_INTERNAL.pwm.PulseLength = PWM_THYR_PULSE_LENGTH_DEFAULT*65535; PARAM_INTERNAL->pwm.PulseLength = PWM_THYR_PULSE_LENGTH_DEFAULT*65535;
PARAM_INTERNAL.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100; PARAM_INTERNAL->zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100;
PARAM_INTERNAL.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT; PARAM_INTERNAL->zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT;
PARAM_INTERNAL.angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*10000; 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_Ki = ANGLE_PID_KI_COEF_DEFAULT*10000;
PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_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_Max = ANGLE_MAX_PERCENT_DEFAULT*65535;
PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_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.PulseLengthReserve = ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT*100;
//__AngleSetLimit(); //__AngleSetLimit();
} }
} }
@@ -475,10 +475,10 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
// Перерасчет максимально допустимого угла // Перерасчет максимально допустимого угла
static void __AngleSetLimit(void) 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 - получаем максимально безопасный угол // Вычитаем этот процент из 1 - получаем максимально безопасный угол
float angle_limit = 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); Angle_SetLimit(&upp.hangle, angle_limit);
} }

View File

@@ -742,30 +742,6 @@
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\pwm_thyristors.c</PathWithFileName>
<FilenameWithoutPath>pwm_thyristors.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\pwm_thyristors.h</PathWithFileName>
<FilenameWithoutPath>pwm_thyristors.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\angle_control.c</PathWithFileName> <PathWithFileName>..\Core\UPP\angle_control.c</PathWithFileName>
<FilenameWithoutPath>angle_control.c</FilenameWithoutPath> <FilenameWithoutPath>angle_control.c</FilenameWithoutPath>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
@@ -773,7 +749,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>16</FileNumber> <FileNumber>14</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -785,7 +761,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>17</FileNumber> <FileNumber>15</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -797,7 +773,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>18</FileNumber> <FileNumber>16</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -809,7 +785,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>19</FileNumber> <FileNumber>17</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -821,7 +797,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>20</FileNumber> <FileNumber>18</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -833,7 +809,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>21</FileNumber> <FileNumber>19</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -845,7 +821,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>22</FileNumber> <FileNumber>20</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -857,7 +833,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>23</FileNumber> <FileNumber>21</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -869,7 +845,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>24</FileNumber> <FileNumber>22</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -879,6 +855,30 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\pwm_thyristors.c</PathWithFileName>
<FilenameWithoutPath>pwm_thyristors.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\UPP\pwm_thyristors.h</PathWithFileName>
<FilenameWithoutPath>pwm_thyristors.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>

View File

@@ -450,16 +450,6 @@
<FileType>5</FileType> <FileType>5</FileType>
<FilePath>..\Core\UPP\upp_main.h</FilePath> <FilePath>..\Core\UPP\upp_main.h</FilePath>
</File> </File>
<File>
<FileName>pwm_thyristors.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.c</FilePath>
</File>
<File>
<FileName>pwm_thyristors.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.h</FilePath>
</File>
<File> <File>
<FileName>angle_control.c</FileName> <FileName>angle_control.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@@ -510,6 +500,16 @@
<FileType>5</FileType> <FileType>5</FileType>
<FilePath>..\Core\UPP\upp_io.h</FilePath> <FilePath>..\Core\UPP\upp_io.h</FilePath>
</File> </File>
<File>
<FileName>pwm_thyristors.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.c</FilePath>
</File>
<File>
<FileName>pwm_thyristors.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.h</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
@@ -1437,16 +1437,6 @@
<FileType>5</FileType> <FileType>5</FileType>
<FilePath>..\Core\UPP\upp_main.h</FilePath> <FilePath>..\Core\UPP\upp_main.h</FilePath>
</File> </File>
<File>
<FileName>pwm_thyristors.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.c</FilePath>
</File>
<File>
<FileName>pwm_thyristors.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.h</FilePath>
</File>
<File> <File>
<FileName>angle_control.c</FileName> <FileName>angle_control.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@@ -1497,6 +1487,16 @@
<FileType>5</FileType> <FileType>5</FileType>
<FilePath>..\Core\UPP\upp_io.h</FilePath> <FilePath>..\Core\UPP\upp_io.h</FilePath>
</File> </File>
<File>
<FileName>pwm_thyristors.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.c</FilePath>
</File>
<File>
<FileName>pwm_thyristors.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.h</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>