diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 4766238..d517fd9 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -35,19 +35,19 @@ void Write_UPP_Outputs(real_T* Buffer, int ind_port) //int pwm4_pin = PIN_READ(PWM4); //int pwm5_pin = PIN_READ(PWM5); //int pwm6_pin = PIN_READ(PWM6); - int pwm1_pin = (upp.hpwm.AllPhases[PHASE_A_POS].State == PWM_THYR_TIM_ACTIVE); - int pwm2_pin = (upp.hpwm.AllPhases[PHASE_A_NEG].State == PWM_THYR_TIM_ACTIVE); - int pwm3_pin = (upp.hpwm.AllPhases[PHASE_B_POS].State == PWM_THYR_TIM_ACTIVE); - int pwm4_pin = (upp.hpwm.AllPhases[PHASE_B_NEG].State == PWM_THYR_TIM_ACTIVE); - int pwm5_pin = (upp.hpwm.AllPhases[PHASE_C_POS].State == PWM_THYR_TIM_ACTIVE); - int pwm6_pin = (upp.hpwm.AllPhases[PHASE_C_NEG].State == PWM_THYR_TIM_ACTIVE); + //int pwm1_pin = (upp.hpwm.AllPhases[PHASE_A_POS].State == PWM_THYR_TIM_ACTIVE); + //int pwm2_pin = (upp.hpwm.AllPhases[PHASE_A_NEG].State == PWM_THYR_TIM_ACTIVE); + //int pwm3_pin = (upp.hpwm.AllPhases[PHASE_B_POS].State == PWM_THYR_TIM_ACTIVE); + //int pwm4_pin = (upp.hpwm.AllPhases[PHASE_B_NEG].State == PWM_THYR_TIM_ACTIVE); + //int pwm5_pin = (upp.hpwm.AllPhases[PHASE_C_POS].State == PWM_THYR_TIM_ACTIVE); + //int pwm6_pin = (upp.hpwm.AllPhases[PHASE_C_NEG].State == PWM_THYR_TIM_ACTIVE); - //pwm_wtf(upp.hpwm.AllPhases[PHASE_A_POS].State, upp.hpwm.AllPhases[PHASE_A_NEG].State, &pwm1_pin); - //pwm_wtf(upp.hpwm.AllPhases[PHASE_A_NEG].State, upp.hpwm.AllPhases[PHASE_A_POS].State, &pwm2_pin); - //pwm_wtf(upp.hpwm.AllPhases[PHASE_B_POS].State, upp.hpwm.AllPhases[PHASE_B_NEG].State, &pwm3_pin); - //pwm_wtf(upp.hpwm.AllPhases[PHASE_B_NEG].State, upp.hpwm.AllPhases[PHASE_B_POS].State, &pwm4_pin); - //pwm_wtf(upp.hpwm.AllPhases[PHASE_C_POS].State, upp.hpwm.AllPhases[PHASE_C_NEG].State, &pwm5_pin); - //pwm_wtf(upp.hpwm.AllPhases[PHASE_C_NEG].State, upp.hpwm.AllPhases[PHASE_C_POS].State, &pwm6_pin); + pwm_wtf(upp.hpwm.AllPhases[PHASE_A_POS].State, upp.hpwm.AllPhases[PHASE_A_NEG].State, &pwm1_pin); + pwm_wtf(upp.hpwm.AllPhases[PHASE_A_NEG].State, upp.hpwm.AllPhases[PHASE_A_POS].State, &pwm2_pin); + pwm_wtf(upp.hpwm.AllPhases[PHASE_B_POS].State, upp.hpwm.AllPhases[PHASE_B_NEG].State, &pwm3_pin); + pwm_wtf(upp.hpwm.AllPhases[PHASE_B_NEG].State, upp.hpwm.AllPhases[PHASE_B_POS].State, &pwm4_pin); + pwm_wtf(upp.hpwm.AllPhases[PHASE_C_POS].State, upp.hpwm.AllPhases[PHASE_C_NEG].State, &pwm5_pin); + pwm_wtf(upp.hpwm.AllPhases[PHASE_C_NEG].State, upp.hpwm.AllPhases[PHASE_C_POS].State, &pwm6_pin); int err = PIN_READ(RDO1); int work = PIN_READ(RDO2); int ready = PIN_READ(RDO3); diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 079c8d8..e2c6d88 100644 Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 17730c6..e6eff5e 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -14,34 +14,58 @@ #define _UPP_CONFIG_H_ #include "stm32f4xx_hal.h" -// Проверка корректности структуры -#define assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized) - -/* Дефайны для индексов */ -/* Линейные напряжения */ -#define U_AB 0 -#define U_CA 1 -#define U_BC 2 -/* Токи фаз */ -#define I_C 0 -#define I_A 1 -#define I_B 2 -/* Температуры */ -#define TEMP_1 0 -#define TEMP_2 1 +/** + * @addtogroup UPP_PARAMS_TEST Params for tests + * @ingroup UPP_CONFIG + * @brief Параметры для тестирования УПП. Отключение всякого и включение всяких специфичных режимов + * @{ + */ #define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках -//#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП +#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП #define UPP_DISABLE_PROTECT_BOARDPOWER ///< Отключить проверки питания плат (+24, +5 В) #define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы //#define UPP_ANGLE_COSINE ///< Расчет угла через acos, а не линейно +/** //UPP_PARAMS_TEST + * @} + */ + + + + +/** + * @addtogroup UPP_COMPILED_PARAMS Fixed params + * @ingroup UPP_CONFIG + * @brief Параметры устанавливаемые на этапе компиляции. Без перепрошивки их не поменять + * @{ + */ + + /* Периоды обновления всякого */ +#define PM_ADC_PERIOD_US 25 ///< Период опроса АЦП в мкс +#define PM_SLOW_PERIOD_US 500 ///< Период обновления медленных расчетов в мкс (чтобы делилось на @ref PM_ADC_PERIOD_US) +#define PM_TEMP_SLOW_PERIOD_MS 1000 ///< Период обновлениия (фильтрации) датчиков температуры в мс +#define PM_F_SLOW_PERIOD_MS 40 ///< Период обновления (фильтрации) частоты в мс +#define UPP_INIT_BEFORE_READY_MS 2000 ///< Сколько сканировать сеть, перед выставлением состояния готовности + +/* Частоты таймеров в МГц*/ +#define PWM_TIM1_FREQ_MHZ 180 ///< Частота тактирования таймера ШИМ (1-4 каналы) +#define PWM_TIM8_FREQ_MHZ 180 ///< Частота тактирования таймера ШИМ (5-6 каналы) +#define ADC_TIM3_FREQ_MZH 90 ///< Частота тактирования таймера АЦП +#define ANGLE_TIM2_FREQ_MHZ 90 ///< Частота тактирования таймера для отсчета угла открытия тиристоров +#define US_TIM5_FREQ_MHZ 90 ///< Частота тактирования микросекундного таймера + +/** //UPP_COMPILED_PARAMS + * @} + */ + + + /** * @addtogroup UPP_PARAMS_DEFAULT Default params for external flash * @ingroup UPP_CONFIG * @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке - * @details Префиксы * @{ */ @@ -110,32 +134,6 @@ */ -/** - * @addtogroup UPP_COMPILED_PARAMS Fixed params - * @ingroup UPP_CONFIG - * @brief Параметры устанавливаемые на этапе компиляции. Без перепрошивки их не поменять - * @{ - */ - -/* Периоды обновления всякого */ -#define PM_ADC_PERIOD_US 25 ///< Период опроса АЦП в мкс -#define PM_SLOW_PERIOD_US 500 ///< Период обновления медленных расчетов в мкс (чтобы делилось на @ref PM_ADC_PERIOD_US) -#define PM_TEMP_SLOW_PERIOD_MS 1000 ///< Период обновлениия (фильтрации) датчиков температуры в мс -#define PM_F_SLOW_PERIOD_MS 40 ///< Период обновления (фильтрации) частоты в мс -#define UPP_INIT_BEFORE_READY_MS 2000 ///< Сколько сканировать сеть, перед выставлением состояния готовности - -/* Частоты таймеров в МГц*/ -#define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы) -#define PWM_TIM8_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (5-6 каналы) -#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков микросекундного таймера -#define ADC_TIM3_FREQ_MZH 90 ///< Частота тиков таймера АЦП -#define ANGLE_TIM2_FREQ_MHZ 90 ///< Частота тиков таймера отсчета угла открытия тиристоров - -/** //UPP_COMPILED_PARAMS - * @} - */ - - // ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 417 ====== diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h index c0afca5..5013e20 100644 --- a/UPP/Core/Configs/upp_defs.h +++ b/UPP/Core/Configs/upp_defs.h @@ -149,14 +149,31 @@ typedef struct { * @brief Дефайны УПП которые используютяс исключительно внутри программы * @{ */ -/* Перерасчеты в тики */ -#define PM_SLOW_PERIOD_CNT (PM_SLOW_PERIOD_US/PM_ADC_PERIOD_US) ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US -#define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US) -#define MS_TO_SLOW_TICKS(_ms_) US_TO_SLOW_TICKS((_ms_)*1000) -#define PM_F_SLOW_PERIOD_CNT (MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS)) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT + +// Проверка корректности структуры +#define assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized) + + +/* Дефайны для индексов */ +/* Линейные напряжения */ +#define U_AB 0 +#define U_CA 1 +#define U_BC 2 +/* Токи фаз */ +#define I_C 0 +#define I_A 1 +#define I_B 2 +/* Температуры */ +#define TEMP_1 0 +#define TEMP_2 1 /* Перерасчеты в тики */ -#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT +#define PM_SLOW_PERIOD_CNT (PM_SLOW_PERIOD_US/PM_ADC_PERIOD_US) ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US +#define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US) ///< Пересчитать мкс в тики медленных расчетов +#define MS_TO_SLOW_TICKS(_ms_) US_TO_SLOW_TICKS((_ms_)*1000) ///< Пересчитать мс в тики медленных расчетов + +/* Перерасчеты в тики */ +#define PM_F_SLOW_PERIOD_CNT (MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS)) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT #define SQRT2 1.4142135 diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index c506607..ceba124 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -202,8 +202,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) /* Расчет амплитуд трехфазной сети */ float uamp = vector_abs_linear_calc(meas->slow.U[U_AB], meas->slow.U[U_CA])/SQRT2; /* SQRT2 - получить действующее */ float iamp = vector_abs_phase_calc(meas->slow.I[I_A], meas->slow.I[I_C])/SQRT2; /* SQRT2 - получить действующее */ - meas->final.Uamp = Filter_Process(&hpm->rms_exp[RMS_EXP_U], uamp);;//Filter_Process(&hpm->rms[RMS_U], uamp); - meas->final.Iamp = Filter_Process(&hpm->rms_exp[RMS_EXP_I], iamp);;//Filter_Process(&hpm->rms[RMS_I], iamp); + meas->final.Uamp = Filter_Process(&hpm->rms_exp[RMS_EXP_U], uamp); + meas->final.Iamp = Filter_Process(&hpm->rms_exp[RMS_EXP_I], iamp); hpm->slow_cnt++; diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index 6370775..fa1ad0f 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -44,7 +44,7 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle) float kd = u2f(PARAM_INTERNAL.angle.PID_Kd, 10000); float ref_alpha = PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US); - return Angle_PID_Init(hangle, kp, ki, kd, ref_alpha);; + return Angle_PID_Init(hangle, kp, ki, kd, ref_alpha); } diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c index e92eae6..14139ed 100644 --- a/UPP/Core/UPP/upp_params.c +++ b/UPP/Core/UPP/upp_params.c @@ -385,13 +385,14 @@ void UPP_Params_SetDefault(int pui_default, int internal_default) } +#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) // Перерасчет максимально допустимого угла static void __AngleSetLimit(void) { // Сколько пачка ипульсов занимает процентов от всего периода float pulses_percent_of_period = (((float)PARAM_INTERNAL.pwm.PulseNumber / PARAM_INTERNAL.pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(upp.pm.measured.final.Fmean); // Вычитаем этот процент из 1 - получаем максимально безопасный угол - float angle_limit = 1 - pulses_percent_of_period; + float angle_limit = 1; angle_limit -= pulses_percent_of_period*u2f(PARAM_INTERNAL.angle.PulseLengthReserve, 100); // добавляем запас в PulseLengthReserve процентов от пачки импульсов Angle_SetLimit(&upp.hangle, angle_limit); }