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

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)
} UPP_ErrorType_t;
/**
* @brief Структура аварий УПП для ПУИ
*/
typedef struct
{
/* Програмные ошибки */
unsigned Internal_1:1; ///< Ошибка 1: Внутренняя неисправность УПП 1
unsigned Internal_2:1; ///< Ошибка 2: Внутренняя неисправность УПП 2
unsigned Internal_3:1; ///< Ошибка 3: Внутренняя неисправность УПП 3
unsigned Internal_4:1; ///< Ошибка 4: Внутренняя неисправность УПП 4
unsigned Internal_5:1; ///< Ошибка 5: Внутренняя неисправность УПП 5
unsigned Internal_6:1; ///< Ошибка 6: Внутренняя неисправность УПП 6
/* Ошибки по питанию */
unsigned Power_Digit_5V:1; ///< Ошибка 7: Неисправность цифрового источника питания (5 В)
unsigned Power_24V:1; ///< Ошибка 8: Неисправность источника питания 24 В
unsigned Power_Analog_5V:1; ///< Ошибка 9: Неисправность аналогового источника питания микроконтроллера (± 5 В)
unsigned Power_SCI_5V:1; ///< Ошибка 10: Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В)
unsigned Power_DIO_24V:1; ///< Ошибка 11: Неисправность источника питания дискретных входов/выходов (24 В)
/* Ошибки по допустимым пределам Наряжений/Токов/Температуры */
unsigned OverCurrent:1; ///< Ошибка 12: Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t)
unsigned OverVoltage:1; ///< Ошибка 13: Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
unsigned OverTemperature:1; ///< Ошибка 14: Температура выше допустимой (плюс 85 °C)
unsigned UnderVoltage:1; ///< Ошибка 15: Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
/* Ошибки по обрывам фаз */
unsigned LossPhaseAll:1; ///< Ошибка 16: Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t)
unsigned LossPhaseA:1; ///< Ошибка 17: Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t)
unsigned LossPhaseB:1; ///< Ошибка 18: Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t)
unsigned LossPhaseC:1; ///< Ошибка 19: Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t)
/* Другие ошибки */
unsigned LongStart:1; ///< Ошибка 20: Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
unsigned Interlace:1; ///< Ошибка 21: Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
unsigned OverFrequency:1; ///< Ошибка 22: Частота сети выше допустимой
unsigned UnderFrequency:1; ///< Ошибка 23: Частота сети ниже допустимой
}UPP_PUI_Error_t;
/**
* @brief Структура предупреждений УПП для ПУИ
*/
typedef struct
{
}UPP_PUI_Warnings_t;
/**
* @brief Структура данных от УПП передаваемых в ПУИ
@@ -85,13 +130,32 @@ typedef struct {
uint16_t WorkMode; /** @brief Адрес 1: Режим работы
@details «Готовность» или «Работа» */
uint16_t Voltage; /** @brief Адрес 2: Напряжение на входе УПП, Вольты */
uint16_t Uall; /** @brief Адрес 2: Среднее напряжение по трем фазам на входе УПП (RMS), Вольты */
uint16_t Uab; /** @brief Адрес 3: Напряжение фазы AB (RMS), Вольты */
uint16_t Ubc; /** @brief Адрес 4: Напряжение фазы BC (RMS), Вольты */
uint16_t Uca; /** @brief Адрес 5: Напряжение фазы CA (RMS), Вольты */
uint16_t Current; /** @brief Адрес 3: Ток на входе УПП, Амперы */
uint16_t Iall; /** @brief Адрес 6: Средний ток по трем фазам на входе УПП (RMS), Амперы */
uint16_t Ia; /** @brief Адрес 7: Ток фазы A (RMS), Амперы */
uint16_t Ib; /** @brief Адрес 8: Ток фазы B (RMS), Амперы */
uint16_t Ic; /** @brief Адрес 9: Ток фазы C (RMS), Амперы */
uint16_t Frequency; /** @brief Адрес 4: Частота напряжения на входе УПП */
uint16_t Fall; /** @brief Адрес 10: Средняя частота напряжений по трем фазам на входе УПП, Герцы */
uint16_t Fab; /** @brief Адрес 11: Частота напряжения фазы AB, Герцы */
uint16_t Fbc; /** @brief Адрес 12: Частота напряжения фазы BC, Герцы */
uint16_t Fca; /** @brief Адрес 13: Частота напряжения фазы CA, Герцы */
uint16_t Temperature; /** @brief Адрес 5: Температура радиатора тиристоров, Градусы Цельсия */
uint16_t Temperature1; /** @brief Адрес 14: Температура радиатора тиристоров, Градусы Цельсия */
uint16_t Temperature2; /** @brief Адрес 15: Температура радиатора тиристоров, Градусы Цельсия */
uint16_t reserved[10]; /** @brief Адрес 16-49: Зарезервированны*/
union
{
uint16_t all;
UPP_PUI_Warnings_t warn;
}Warnings; /** @brief Адрес 4: Частота напряжения на входе УПП */
} UPP_PUI_Values_t;
/**
@@ -180,11 +244,12 @@ typedef struct {
#define SQRT2 1.4142135
/* Дефайны для "удобного" доступа к структурам */
#define PARAM_INTERNAL MB_INTERNAL.param
#define PARAM_PUI MB_DATA.HoldRegs.pui_params
#define ERR_PUI errors.pui.err
#define ERR_PRIVATE errors.prvt.f.err
#define ERR_PRIVATE_CNT errors.prvt.cnt
//#define PARAM_INTERNAL MB_INTERNAL.param
//#define PARAM_PUI MB_DATA.HoldRegs.pui_params
//#define ERR_PUI errors.pui.err
//#define ERR_PRIVATE errors.prvt.f.err
//#define ERR_PRIVATE_CNT errors.prvt.cnt
/* Enum'ы УПП */
/**

View File

@@ -52,6 +52,12 @@ extern "C" {
/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */
/* Дефайны для "удобного" доступа к структурам */
static UPP_PrvtParams_t *PARAM_INTERNAL = &MB_INTERNAL.param;
static UPP_PUI_Params_t *PARAM_PUI = &MB_DATA.HoldRegs.pui_params;
static UPP_PUI_Error_t *ERR_PUI = &errors.pui.err;
static UPP_PrvtErrors_t *ERR_PRIVATE = &errors.prvt.f.err;
static UPP_ErrorsCnt_t *ERR_PRIVATE_CNT = &errors.prvt.cnt;
/* USER CODE END EM */
/* Exported functions prototypes ---------------------------------------------*/

View File

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

View File

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

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_ */

View File

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

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 Структура с всеми ошибками УПП
*/
@@ -61,97 +116,18 @@ typedef struct
union
{
uint32_t all;
struct
{
/* Програмные ошибки */
unsigned Internal_1:1; ///< Ошибка 1: Внутренняя неисправность УПП 1
unsigned Internal_2:1; ///< Ошибка 2: Внутренняя неисправность УПП 2
unsigned Internal_3:1; ///< Ошибка 3: Внутренняя неисправность УПП 3
unsigned Internal_4:1; ///< Ошибка 4: Внутренняя неисправность УПП 4
unsigned Internal_5:1; ///< Ошибка 5: Внутренняя неисправность УПП 5
unsigned Internal_6:1; ///< Ошибка 6: Внутренняя неисправность УПП 6
/* Ошибки по питанию */
unsigned Power_Digit_5V:1; ///< Ошибка 7: Неисправность цифрового источника питания (5 В)
unsigned Power_24V:1; ///< Ошибка 8: Неисправность источника питания 24 В
unsigned Power_Analog_5V:1; ///< Ошибка 9: Неисправность аналогового источника питания микроконтроллера (± 5 В)
unsigned Power_SCI_5V:1; ///< Ошибка 10: Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В)
unsigned Power_DIO_24V:1; ///< Ошибка 11: Неисправность источника питания дискретных входов/выходов (24 В)
/* Ошибки по допустимым пределам Наряжений/Токов/Температуры */
unsigned OverCurrent:1; ///< Ошибка 12: Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t)
unsigned OverVoltage:1; ///< Ошибка 13: Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
unsigned OverTemperature:1; ///< Ошибка 14: Температура выше допустимой (плюс 85 °C)
unsigned UnderVoltage:1; ///< Ошибка 15: Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
/* Ошибки по обрывам фаз */
unsigned LossPhaseAll:1; ///< Ошибка 16: Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t)
unsigned LossPhaseA:1; ///< Ошибка 17: Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t)
unsigned LossPhaseB:1; ///< Ошибка 18: Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t)
unsigned LossPhaseC:1; ///< Ошибка 19: Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t)
/* Другие ошибки */
unsigned LongStart:1; ///< Ошибка 20: Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
unsigned Interlace:1; ///< Ошибка 21: Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
unsigned OverFrequency:1; ///< Ошибка 22: Частота сети выше допустимой
unsigned UnderFrequency:1; ///< Ошибка 23: Частота сети ниже допустимой
}err;
}pui;
UPP_PUI_Error_t err;
}pui; ///< Ошибки ПУИ
struct
{
union
{
uint64_t all;
struct
{
unsigned uamp_max:1;
unsigned uamp_min:1;
unsigned iamp_max:1;
unsigned iamp_min:1;
unsigned ic_max:1;
unsigned ic_min:1;
unsigned ib_max:1;
unsigned ib_min:1;
unsigned ia_max:1;
unsigned ia_min:1;
unsigned uba_max:1;
unsigned uba_min:1;
unsigned uac_max:1;
unsigned uac_min:1;
unsigned ubc_max:1;
unsigned ubc_min:1;
unsigned fba_max:1;
unsigned fba_min:1;
unsigned fac_max:1;
unsigned fac_min:1;
unsigned fbc_max:1;
unsigned fbc_min:1;
unsigned temp_warn:1;
unsigned temp_err:1;
unsigned longstart:1;
unsigned interlance:3;
unsigned overrun_slow_calc:1;
unsigned overrun_fast_calc:1;
}err;
UPP_PrvtErrors_t err;
}f;
struct
{
uint16_t angle_reinit_err;
uint16_t adc_reinit_err;
uint16_t zc_reinit_err;
uint16_t pwm_reinit_err;
uint16_t overrun_slow_calc;
uint16_t overrun_fast_calc;
}cnt;
UPP_ErrorsCnt_t cnt;
}prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ
}UPP_Errors_t;

View File

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

View File

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

View File

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

View File

@@ -450,16 +450,6 @@
<FileType>5</FileType>
<FilePath>..\Core\UPP\upp_main.h</FilePath>
</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>
<FileName>angle_control.c</FileName>
<FileType>1</FileType>
@@ -510,6 +500,16 @@
<FileType>5</FileType>
<FilePath>..\Core\UPP\upp_io.h</FilePath>
</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>
</Group>
<Group>
@@ -1437,16 +1437,6 @@
<FileType>5</FileType>
<FilePath>..\Core\UPP\upp_main.h</FilePath>
</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>
<FileName>angle_control.c</FileName>
<FileType>1</FileType>
@@ -1497,6 +1487,16 @@
<FileType>5</FileType>
<FilePath>..\Core\UPP\upp_io.h</FilePath>
</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>
</Group>
<Group>