Чуть рефакторинга
This commit is contained in:
Binary file not shown.
@@ -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'ы УПП */
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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 ---------------------------------------------*/
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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_ */
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -50,61 +50,12 @@ static const uint8_t UPP_ErrorPriority[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Структура с всеми ошибками УПП
|
* @brief Приватные ошибки
|
||||||
|
* @details Ииспользуются внутри программы и для определение ошибки для ПУИ
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UPP_ErrorType_t common; ///< Общая ошибка @ref UPP_ErrorType_t;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
uint64_t all;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned uamp_max:1;
|
unsigned uamp_max:1;
|
||||||
unsigned uamp_min:1;
|
unsigned uamp_min:1;
|
||||||
unsigned iamp_max:1;
|
unsigned iamp_max:1;
|
||||||
@@ -140,18 +91,43 @@ typedef struct
|
|||||||
|
|
||||||
unsigned overrun_slow_calc:1;
|
unsigned overrun_slow_calc:1;
|
||||||
unsigned overrun_fast_calc:1;
|
unsigned overrun_fast_calc:1;
|
||||||
}err;
|
}UPP_PrvtErrors_t;
|
||||||
}f;
|
|
||||||
|
|
||||||
struct
|
/**
|
||||||
{
|
* @brief Счетчики ошибок
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
uint16_t angle_reinit_err;
|
uint16_t angle_reinit_err;
|
||||||
uint16_t adc_reinit_err;
|
uint16_t adc_reinit_err;
|
||||||
uint16_t zc_reinit_err;
|
uint16_t zc_reinit_err;
|
||||||
uint16_t pwm_reinit_err;
|
uint16_t pwm_reinit_err;
|
||||||
uint16_t overrun_slow_calc;
|
uint16_t overrun_slow_calc;
|
||||||
uint16_t overrun_fast_calc;
|
uint16_t overrun_fast_calc;
|
||||||
}cnt;
|
}UPP_ErrorsCnt_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Структура с всеми ошибками УПП
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
UPP_ErrorType_t common; ///< Общая ошибка @ref UPP_ErrorType_t;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint32_t all;
|
||||||
|
UPP_PUI_Error_t err;
|
||||||
|
}pui; ///< Ошибки ПУИ
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
uint64_t all;
|
||||||
|
UPP_PrvtErrors_t err;
|
||||||
|
}f;
|
||||||
|
|
||||||
|
UPP_ErrorsCnt_t cnt;
|
||||||
|
|
||||||
}prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ
|
}prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ
|
||||||
}UPP_Errors_t;
|
}UPP_Errors_t;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
@@ -91,11 +91,12 @@ int UPP_While(void)
|
|||||||
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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
BIN
Информация для программиста (УПП СП СЭД)/Modbus Карта.docx
Normal file
BIN
Информация для программиста (УПП СП СЭД)/Modbus Карта.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user