From b236975f9b03b7c5228838396db3539411af514f Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 17 Nov 2025 01:38:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=B0=D0=BA=D0=B8=D0=B5-=D1=82=D0=BE=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B8=20=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=BB=D0=B3?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D1=82=D0=BC=D0=B0.=20=D0=9D=D0=BE=20=D0=BD?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D0=B3=D0=BE=20=D0=BF=D1=80=D1=8F=D0=BC=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=B5=D1=81=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Drivers/STM32_SIMULINK/stm32_matlab_adc.h | 2 +- MATLAB/MCU_Wrapper/mcu_wrapper_conf.h | 2 +- MATLAB/app_wrapper/app_io.c | 24 ++-- MATLAB/upp_init.m | 2 +- MATLAB/upp_r2023.slx | Bin 66601 -> 68979 bytes UPP/AllLibs/MyLibs | 2 +- UPP/Core/Configs/modbus_data.c | 2 +- UPP/Core/Configs/mylibs_config.h | 11 +- UPP/Core/Configs/upp_config.h | 37 +++-- UPP/Core/Configs/upp_defs.h | 6 +- UPP/Core/PowerMonitor/adc_tools.c | 14 +- UPP/Core/PowerMonitor/adc_tools.h | 2 +- UPP/Core/PowerMonitor/power_monitor.c | 132 ++++++++++++++++-- UPP/Core/PowerMonitor/power_monitor.h | 56 +++++++- UPP/Core/UPP/pwm_thyristors.c | 75 ++++------ UPP/Core/UPP/pwm_thyristors.h | 2 - UPP/Core/UPP/upp_control.c | 36 ++++- UPP/Core/UPP/upp_control.h | 44 ++++-- UPP/Core/UPP/upp_errors.h | 3 +- UPP/Core/UPP/upp_main.c | 31 +++- UPP/Core/UPP/upp_main.h | 7 + UPP/MDK-ARM/UPP.uvprojx | 51 ------- 22 files changed, 349 insertions(+), 192 deletions(-) diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_adc.h b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_adc.h index a0f7b24..c837ef3 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_adc.h +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_adc.h @@ -9,7 +9,7 @@ #endif #ifdef STM32F4 -#define ADC_NOISE_LSB 10 // Шум в LSB (квантах АЦП) +#define ADC_NOISE_LSB 3 // Шум в LSB (квантах АЦП) #endif /////////////////////////////---STRUCTURES---/////////////////////////// diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h index ab4f3d5..8108130 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h +++ b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h @@ -59,7 +59,7 @@ #define OUT_PORT_NUMB 3 #define THYR_PORT_1_WIDTH 6 -#define PM_PORT_2_WIDTH 16 +#define PM_PORT_2_WIDTH 32 #define OUT_PORT_3_WIDTH 16 // INPUT/OUTPUTS PARAMS END diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 97e301b..cd56554 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -32,25 +32,31 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port) { int nn = 0; for (int i = 0; i < 3; i++) - { - WriteOutputArray(upp.pm.U[i], ind_port, nn++); + { //0-2 + WriteOutputArray(upp.pm.measured.Ureal[i], ind_port, nn++); } for (int i = 0; i < 3; i++) - { + { //3-5 WriteOutputArray(upp.pm.zc.Channel[i].HalfWave, ind_port, nn++); } for (int i = 0; i < 3; i++) - { - WriteOutputArray(upp.pm.F[i], ind_port, nn++); + { //6-8 + WriteOutputArray(upp.pm.measured.F[i], ind_port, nn++); } for (int i = 0; i < 3; i++) - { - WriteOutputArray(upp.pm.I[i], ind_port, nn++); + { //9-11 + WriteOutputArray(upp.pm.measured.Ireal[i], ind_port, nn++); } for (int i = 0; i < 2; i++) - { - WriteOutputArray(upp.pm.T[i], ind_port, nn++); + { //12-13 + WriteOutputArray(upp.pm.measured.T[i], ind_port, nn++); } + { //14-16 + WriteOutputArray(upp.pm.measured.U_mean, ind_port, nn++); + WriteOutputArray(upp.pm.measured.I_mean, ind_port, nn++); + WriteOutputArray(upp.pm.measured.F_mean, ind_port, nn++); + } + } /** * @brief Функция для записи входов в приложение МК diff --git a/MATLAB/upp_init.m b/MATLAB/upp_init.m index 7618676..15834cb 100644 --- a/MATLAB/upp_init.m +++ b/MATLAB/upp_init.m @@ -1,7 +1,7 @@ clear all Ts = 5e-6; -Vnom = 380; +Vnom = 690; Fnom = 50; Temperature1 = 2.22; % 20 градусов diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 1685338da56c07177a2992097c19506c408cb81d..d0868f16b074a07557db2ab2f06092d7e8bf0318 100644 GIT binary patch delta 53610 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 delta 51303 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.Initialized) /* Дефайны для индексов */ -#define U_BA 0 -#define U_AC 1 -#define U_BC 2 -#define I_C 0 -#define I_A 1 -#define I_B 2 +#define U_BA 0 +#define U_AC 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 @@ -34,6 +34,19 @@ * @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке * @{ */ +/* Параметри мониторинга сети */ +#define PM_EXP_ALPHA_COEF_DEFAULT 0.01 + +/* Номинальные параметры */ +#define NOM_PHASE_NUMB 3 +#define NOM_U_V_DEFAULT 690 +#define NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT 6 +#define NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT 10 +#define NOM_F_HZ_DEFAULT 50 +#define NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT 5 +#define NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT 5 +#define NOM_I_A_DEFAULT 5 + /* Параметры ПУИ */ #define PUI_Iref_PERCENT_DEFAULT 150 #define PUI_Tnt_MS_DEFAULT 300 @@ -52,8 +65,8 @@ #define ADC_I_ZERO_DEFAULT 2048 /* Параметры определения перехода через ноль */ -#define ZERO_CROSS_HYSTERESIS_V_DEFAULT 10.0 -#define ZERO_CROSS_DEBOUNCE_10US_DEFAULT 2.5*100 // (2.5 * 100 = 2.5 мс) +#define ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT 2.0 +#define ZERO_CROSS_DEBOUNCE_10US_DEFAULT 2*100 // (2.5 * 100 = 2.5 мс) /* Параметры ШИМ для тиристоров */ #define PWM_THYR_FREQUENCY_HZ_DEFAULT 20000 @@ -70,11 +83,11 @@ * @brief Параметры устанавливаемые на этапе компиляции. Без перепрошивки их не поменять * @{ */ -#define PM_U_NOM_V 690 -#define PM_I_NOM_V 5 -#define PM_F_NOM_HZ 50 +/* Периоды вызова всякого */ +#define PM_ADC_PERIOD_US 10 ///< Период опроса АЦП в мкс +#define PM_SLOW_PERIOD_10US 50 ///< Период обновление медленных расчетов в 10мкс +#define PM_TEMP_PERIOD_10US 5000 ///< Период обновление датчиков температуры в 10мкс -#define PM_ADC_PERIOD_MKS 10 ///< Период опроса АЦП в мкс /* Частоты таймеров в МГц*/ #define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП #define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы) diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h index 5d9ae19..b1ce9bd 100644 --- a/UPP/Core/Configs/upp_defs.h +++ b/UPP/Core/Configs/upp_defs.h @@ -29,7 +29,8 @@ typedef enum { WM_Not_Init = 0, ///< УПП не инициализирован WM_Ready = 1, ///< УПП в готовности WM_Running = 2, ///< УПП в работе, управляет тиристорами - WM_Error = 3, ///< УПП в аварии + WM_Done = 3, ///< УПП закончил свою работу + WM_Error = 4, ///< УПП в аварии } UPP_WorkModeType_t; /** @@ -147,7 +148,8 @@ typedef struct { * @brief Дефайны УПП которые используютяс исключительно внутри программы * @{ */ -#define ANGLE_PERIOD_MS (((float)1/(PM_F_NOM_HZ*2))*1000) +#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) + /** * @brief Состояния полуволны */ diff --git a/UPP/Core/PowerMonitor/adc_tools.c b/UPP/Core/PowerMonitor/adc_tools.c index 2a8b7eb..3ac7560 100644 --- a/UPP/Core/PowerMonitor/adc_tools.c +++ b/UPP/Core/PowerMonitor/adc_tools.c @@ -156,7 +156,7 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc) { ADC_Coefs_t *coefs = &adc->Coefs[i]; data[i] = ((float)(raw[i])-coefs->lZero) * coefs->vMax / (coefs->lMax-coefs->lZero); - ADC_UpdateStatistics(adc, i, ADC_LEVEL_AC); +// ADC_UpdateStatistics(adc, i, ADC_LEVEL_AC); } // Фильтрация от шумов для всех каналов @@ -169,19 +169,15 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc) } } - // Преобразования температуры по таблице for (int i = ADC_TEMP_CHANNELS_START; i < ADC_NUMB_OF_CHANNELS; i++) { data[i] = Filter_Process(&adc->temp_map[i-ADC_TEMP_CHANNELS_START], raw[i]); - ADC_UpdateStatistics(adc, i, ADC_LEVEL_BASE); +// ADC_UpdateStatistics(adc, i, ADC_LEVEL_BASE); } - - - - - adc->f.DataReady = 1; + if(Filter_isDataReady(&adc->filter[0])) + adc->f.DataReady = 1; return HAL_OK; } @@ -221,7 +217,7 @@ void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t } // Накопление для Avg/RMS - stat->Sum += value; + stat->Sum += ABS(value); stat->SumSquares += value * value; stat->SampleCount++; diff --git a/UPP/Core/PowerMonitor/adc_tools.h b/UPP/Core/PowerMonitor/adc_tools.h index 7a47e57..9e7d307 100644 --- a/UPP/Core/PowerMonitor/adc_tools.h +++ b/UPP/Core/PowerMonitor/adc_tools.h @@ -67,7 +67,7 @@ typedef struct typedef enum { - ADC_LEVEL_DISABLE=0, ///< Базовая статистика - Max/Min + ADC_LEVEL_DISABLE=0, ///< Статистика отключена ADC_LEVEL_BASE, ///< Базовая статистика - Max/Min ADC_LEVEL_AC, ///< Статистика для переменных сигналов - AVG, RMS }ADC_StatLevel_t; diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index ff8c982..fa0e51e 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -12,9 +12,14 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) { + if(hpm == NULL) + return HAL_ERROR; + + /* Инициализация АЦП */ if(ADC_Init(&hpm->adc, &adc_tim, &hadc3) != HAL_OK) return HAL_ERROR; + /* Инициализация каналов АЦП */ if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UBA, MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_UBA], MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UBA], @@ -40,9 +45,11 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) return HAL_ERROR; + /* Инициализация алгоритма перехода через ноль */ if(ZC_Init(&hpm->zc, 3, (float)MB_INTERNAL.param.zc.Hysteresis/100, MB_INTERNAL.param.zc.DebouneCouner) != HAL_OK) return HAL_ERROR; + /* Инициализация каналов алгоритма перехода через ноль */ if(ZC_ConfigChannel(&hpm->zc, U_BA, ZC_BOTH_EDGES) != HAL_OK) return HAL_ERROR; if(ZC_ConfigChannel(&hpm->zc, U_AC, ZC_BOTH_EDGES) != HAL_OK) @@ -50,41 +57,136 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) if(ZC_ConfigChannel(&hpm->zc, U_BC, ZC_BOTH_EDGES) != HAL_OK) return HAL_ERROR; + + /* Инициализация экпоненциального фильтра медленного алга */ + for(int i = 0; i < 3; i++) + { + if(FilterExp_Init(&hpm->measured.exp[i], (float)MB_INTERNAL.param.pm.mean_alpha/65535)) + return HAL_ERROR; + Filter_Start(&hpm->measured.exp[i]); + } + + /* Инициализация среднего фильтра медленного алга */ + for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) + { + if(FilterAverage_Init(&hpm->measured.avg[i], PM_SLOW_PERIOD_10US, FILTER_MODE_DEFAULT)) + return HAL_ERROR; + + Filter_Start(&hpm->measured.avg[i]); + } + for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; i++) + { + if(FilterAverage_Init(&hpm->measured.avg[ADC_TEMP_CHANNELS_START+i], PM_TEMP_PERIOD_10US, FILTER_MODE_DEFAULT)) + return HAL_ERROR; + + Filter_Start(&hpm->measured.avg[ADC_TEMP_CHANNELS_START+i]); + } + return HAL_OK; } HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm) { - if(ADC_Start(&hpm->adc, PM_ADC_PERIOD_MKS) != HAL_OK) - return HAL_ERROR; + if(hpm == NULL) + return HAL_ERROR; + + if(ADC_Start(&hpm->adc, PM_ADC_PERIOD_US) != HAL_OK) + return HAL_ERROR; return HAL_OK; } +void PowerMonitor_SlowHandle(PowerMonitor_t *hpm) +{ + if(hpm == NULL) + return; + if(!hpm->f.runSlow) + return; + hpm->f.runSlow = 0; + PowerMonitor_Measured_t *meas = &hpm->measured; + + meas->Uslow[U_BC] = -meas->Uslow[U_BA] - meas->Uslow[U_AC]; + meas->Islow[I_B] = -meas->Islow[I_A] - meas->Islow[I_C]; + + float umean = 0; + float imean = 0; + float fmean = 0; + for(int i = 0; i < 3; i++) + { + umean += ABS(meas->Uslow[i]); + imean += ABS(meas->Islow[i]); + fmean += ABS(meas->F[i]); + } + umean /=3; + imean /=3; + fmean /=3; + + meas->U_mean = Filter_Process(&meas->exp[0], umean); + meas->I_mean = Filter_Process(&meas->exp[1], imean); + meas->F_mean = Filter_Process(&meas->exp[2], fmean); +} void PowerMonitor_Handle(PowerMonitor_t *hpm) { + if(hpm == NULL) + return; /* Считываем АЦП */ - static uint32_t last_zc_cnt[ADC_NUMB_OF_U_CHANNELS] = {0}; ADC_Handle(&hpm->adc); - hpm->U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA]; - hpm->U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC]; - hpm->U[U_BC] = -hpm->U[U_BA] - hpm->U[U_AC]; - hpm->I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC]; - hpm->I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]; - hpm->I[I_B] = -hpm->I[I_A] - hpm->I[I_C]; + /* Заполняем величины */ + PowerMonitor_Measured_t *meas = &hpm->measured; + meas->Ureal[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA]; + meas->Ureal[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC]; + meas->Ureal[U_BC] = -meas->Ureal[U_BA] - meas->Ureal[U_AC]; + meas->Ireal[I_C] = hpm->adc.Data[ADC_CHANNEL_IC]; + meas->Ireal[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]; + meas->Ireal[I_B] = -meas->Ireal[I_A] - meas->Ireal[I_C]; + meas->T[TEMP_1] = hpm->adc.Data[ADC_CHANNEL_TEMP1]; + meas->T[TEMP_2] = hpm->adc.Data[ADC_CHANNEL_TEMP2]; - hpm->T[TEMP_1] = hpm->adc.Data[ADC_CHANNEL_TEMP1]; - hpm->T[TEMP_2] = hpm->adc.Data[ADC_CHANNEL_TEMP2]; - - ZC_ProcessAllChannels(&hpm->zc, hpm->U, usTick); + /* Преобразуем в относительные единицы (о.е.) */ for(int i = 0; i < 3; i++) { - - hpm->F[i] = ZC_GetFrequency(&hpm->zc, i) / 2; + meas->U[i] = 10*meas->Ureal[i]/MB_INTERNAL.param.nominal.U; + meas->I[i] = 10*meas->Ireal[i]/MB_INTERNAL.param.nominal.I; + } + + /* Ищем переход через ноль */ + ZC_ProcessAllChannels(&hpm->zc, meas->U, usTick); + for(int i = 0; i < 3; i++) + { + meas->F[i] = ZC_GetFrequency(&hpm->zc, i) / 2; + } + + /* Накопление Average для медленной фильтрации */ + meas->Uslow[U_BA] = Filter_Process(&meas->avg[0], meas->U[U_BA]); + meas->Uslow[U_AC] = Filter_Process(&meas->avg[1], meas->U[U_AC]); + meas->Islow[I_C] = Filter_Process(&meas->avg[2], meas->I[I_C]); + meas->Islow[I_A] = Filter_Process(&meas->avg[3], meas->I[I_A]); + meas->T[TEMP_1] = Filter_Process(&meas->avg[4], meas->T[TEMP_1]); + meas->T[TEMP_2] = Filter_Process(&meas->avg[5], meas->T[TEMP_2]); + + /* Запускаем медленную обработку через slow_period прерываний */ +// if(hpm->isr_cnt == PM_SLOW_PERIOD_10US) + /* Запускаем медленную когда фильтры среднего зациклились */ + if(Filter_isDataReady(&meas->avg[0])) + { + hpm->isr_cnt = 0; + if(!hpm->f.runSlow) + { + hpm->f.runSlow = 1; + } + else // если уже запущена - ставим overrun slow calc + { + errors.prvt.f.err.slow_calc_overrun = 1; + errors.prvt.cnt.slow_calc_overrun++; + } + } + else + { + hpm->isr_cnt++; } } \ No newline at end of file diff --git a/UPP/Core/PowerMonitor/power_monitor.h b/UPP/Core/PowerMonitor/power_monitor.h index 56bf1cd..3a0d378 100644 --- a/UPP/Core/PowerMonitor/power_monitor.h +++ b/UPP/Core/PowerMonitor/power_monitor.h @@ -13,14 +13,55 @@ typedef struct { - ADC_Periodic_t adc; - ZeroCross_Handle_t zc; - UPP_HalfWave_t CurrentHalfWave[3]; + unsigned runSlow:1; ///< Запустить медленный алгоритм в while(1) - float U[3]; - float F[3]; - float I[3]; - float T[2]; + unsigned isU:1; ///< Есть ли напряжение + unsigned isI:1; ///< Есть ли ток + + unsigned protectUmax:1; ///< Отработка защиты по макс. напряжению + unsigned protectUmin:1; ///< Отработка защиты по мак с. напряжению + unsigned protectImax:1; ///< Отработка защиты по макс. току + unsigned protectImin:1; ///< Отработка защиты по мин. току +}PowerMonitor_Flags_t; + + +typedef struct +{ + float U_mean; ///< Среднее Напряжение по трем фазам + float I_mean; ///< Средний Ток по трем фазам + float F_mean; ///< Средняя Частота по трем фазам + float Uslow[3]; ///< Напряжение от АЦП (в о.е.) + float Islow[3]; ///< Ток от АЦП (в о.е.) + + + float U[3]; ///< Напряжение от АЦП (в о.е.) + float I[3]; ///< Ток от АЦП (в о.е.) + float F[3]; ///< Частота от Zero Cross + float T[2]; ///< Температура от АЦП + + + float Ureal[3]; ///< Напряжение от АЦП + float Ireal[3]; ///< Ток от АЦП + + FilterExp_t exp[3]; ///< Фильтры для mean + FilterAverage_t avg[6]; ///< Фильтры для avg +}PowerMonitor_Measured_t; + +typedef struct +{ +}PowerMonitor_Filters_t; + +typedef struct +{ + ADC_Periodic_t adc; ///< Хендл периодического АЦП + ZeroCross_Handle_t zc; ///< Хендл перехода через ноль + PowerMonitor_Filters_t fltr; + PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины + PowerMonitor_Flags_t f; ///< Флаги мониторинга + + + uint32_t slow_period; + uint32_t isr_cnt; }PowerMonitor_t; extern PowerMonitor_t pm; @@ -28,6 +69,7 @@ extern PowerMonitor_t pm; HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm); HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm); +void PowerMonitor_SlowHandle(PowerMonitor_t *hpm); void PowerMonitor_Handle(PowerMonitor_t *hpm); #endif /* _POWER_MONITOR_H_ */ diff --git a/UPP/Core/UPP/pwm_thyristors.c b/UPP/Core/UPP/pwm_thyristors.c index 2d6daba..25a7abc 100644 --- a/UPP/Core/UPP/pwm_thyristors.c +++ b/UPP/Core/UPP/pwm_thyristors.c @@ -15,6 +15,9 @@ static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state * @brief Инициализация ШИМ тиристоров. * @param hpwm Указатель на хендл ШИМ тиристоров * @return HAL Status. + * @details Инициализируется 6 структур на каждый канал ШИМ для тиристора. + * И одна dummy структура для безопасной инициализации неизвестной фазы. + * В конце запускаются все каналы ШИМ (с запрещенным выходом). */ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm) { @@ -75,6 +78,7 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm) * @param hpwm Указатель на хендл ШИМ тиристоров * @param Phase На какой фазе надо запустить ШИМ * @return HAL Status. + * @details Переводит автомат канала ШИМ в состояние запуска ШИМ. */ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) { @@ -91,6 +95,7 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) switch(hpwm->Phase[Phase]->State) { + // Если мы НЕ в режиме ожидание - ошибка case PWM_THYR_DISABLED: case PWM_THYR_TIM_START: case PWM_THYR_TIM_ACTIVE: @@ -103,7 +108,7 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) return HAL_OK; default: - return HAL_ERROR;; + return HAL_ERROR; } return HAL_ERROR; @@ -113,7 +118,11 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase) * @brief Остановить ШИМ. * @param hpwm Указатель на хендл ШИМ тиристоров * @param Phase На какой фазе надо остановить ШИМ + * @param force_stop_all Принудительно остановить ВЕСЬ ШИМ * @return HAL Status. + * @details Переводит автомат канала ШИМ в состояние отключенного ШИМ и + * включает канал в режим форсированного неактивного выхода. + * При передаче 1 в force_stop_all, отключаются все каналы ШИМ и выдается дискрет на запрет ШИМ */ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_stop_all) { @@ -148,6 +157,7 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_ * @brief Хендл ШИМ тиристоров. * @param hpwm Указатель на хендл ШИМ тиристоров * @return HAL Status. + * @details Автомат состояний, который определяет поведение каналов ШИМ */ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) { @@ -165,22 +175,22 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) switch (hPhase->State) { - case PWM_THYR_DISABLED: + case PWM_THYR_DISABLED: // канал отключен __PWM_SetOutputState(hPhase, PWM_DISABLE); break; - case PWM_THYR_TIM_WAIT: + case PWM_THYR_TIM_WAIT: // канал ожидает команды __PWM_SetOutputState(hPhase, PWM_DISABLE); break; - case PWM_THYR_TIM_START: + case PWM_THYR_TIM_START: // начать ШИМ (пачка импульсов) __PWM_SetOutputState(hPhase, PWM_ENABLE); hPhase->PulseCnt = hpwm->Config.PulseNumber; hPhase->State = PWM_THYR_TIM_ACTIVE; hpwm->f.Running++; break; - case PWM_THYR_TIM_ACTIVE: + case PWM_THYR_TIM_ACTIVE: // управление пачкой импульсов ШИМ hPhase->PulseCnt--; if (hPhase->PulseCnt <= 0) { @@ -189,13 +199,13 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) } break; - case PWM_THYR_TIM_DONE: + case PWM_THYR_TIM_DONE: // пачка импульсов отправлена - отключение hPhase->State = PWM_THYR_TIM_WAIT; if(hpwm->f.Running) hpwm->f.Running--; break; - default: + default: // чзх __PWM_SetOutputState(hPhase, PWM_DISABLE); break; } @@ -204,7 +214,7 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm) } /** - * @brief Установка частоты ШИМ. + * @brief Установка параметров ШИМ. * @param hpwm Указатель на хендл ШИМ тиристоров * @param Frequency Частота в ГЦ * @return HAL Status. @@ -213,16 +223,19 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t { if(assert_upp(hpwm)) return HAL_ERROR; - if(hpwm->f.Running) + if(hpwm->f.Running) // Если есть активные каналы - ниче не меняем return HAL_BUSY; - HAL_TIM_Base_Stop(&hpwm1); + // Остановка таймера + HAL_TIM_Base_Stop_IT(&hpwm1); hpwm->Config.PhaseMask.all = PhaseMask; hpwm->Config.PulseNumber = PulseNumber; hpwm->Config.Frequency = Frequency; + // Высставление периодов __HAL_TIM_SET_AUTORELOAD(&hpwm1, TIM_FreqToTick(Frequency, PWM_TIM1_FREQ_MHZ)); __HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM3_FREQ_MHZ)); + // Скважности 50/50 __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_1, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_2, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_3, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); @@ -230,6 +243,10 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t __HAL_TIM_SET_COMPARE(&hpwm2, PWM_CHANNEL_5, __HAL_TIM_GET_AUTORELOAD(&hpwm2)/2); __HAL_TIM_SET_COMPARE(&hpwm2, PWM_CHANNEL_6, __HAL_TIM_GET_AUTORELOAD(&hpwm2)/2); + + // Сброс счетчиков таймера и запуск заного + __HAL_TIM_SET_COUNTER(&hpwm1, 0); + __HAL_TIM_SET_COUNTER(&hpwm2, 0); return HAL_TIM_Base_Start_IT(&hpwm1); } @@ -240,13 +257,13 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t * @param Phase Для какой фазы надо установить полуволну * @param halfwave Какую полуволну установить * @return HAL Status. + * @details Меняет указатель канала фазы на канал соответствующей полуволны */ HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_HalfWave_t halfwave) { if(assert_upp(hpwm)) return HAL_ERROR; - // Сбрасываем текущий канал PWM_Stop(hpwm, Phase, 0); @@ -315,39 +332,3 @@ static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state } return HAL_OK; } - - -/** - * @brief Установка полуволны для слежения. - * @param hpwm Указатель на хендл ШИМ тиристоров - * @param Phase Для какой фазы надо установить полуволну - * @param halfwave Какую полуволну установить - * @return HAL Status. - */ -UPP_HalfWave_t PWM_GetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase) -{ - if(assert_upp(hpwm)) - return UPP_WAVE_UNKNOWED; - // Если канал дурацкий - возвращаем UNKNOWED - if (Phase >= 3) - { - return UPP_WAVE_UNKNOWED; - } - if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN]) - return UPP_WAVE_UNKNOWED; - - - // Выставляем канал - if(hpwm->Phase[Phase] == &hpwm->AllPhases[Phase]) - { - return UPP_WAVE_POSITIVE; - } - else if(hpwm->Phase[Phase] == &hpwm->AllPhases[Phase+3]) - { - return UPP_WAVE_NEGATIVE; - } - else - { - return UPP_WAVE_UNKNOWED; - } -} \ No newline at end of file diff --git a/UPP/Core/UPP/pwm_thyristors.h b/UPP/Core/UPP/pwm_thyristors.h index 5908225..8780a92 100644 --- a/UPP/Core/UPP/pwm_thyristors.h +++ b/UPP/Core/UPP/pwm_thyristors.h @@ -96,8 +96,6 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t Frequency, uint8_t PulseNumber); /* Установка полуволны для слежения. */ HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_HalfWave_t halfwave); -/* Установка полуволны для слежения. */ -UPP_HalfWave_t PWM_GetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase); /* Хендл ШИМ тиристоров. */ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm); diff --git a/UPP/Core/UPP/upp_control.c b/UPP/Core/UPP/upp_control.c index dec4727..d0265bd 100644 --- a/UPP/Core/UPP/upp_control.c +++ b/UPP/Core/UPP/upp_control.c @@ -12,7 +12,7 @@ static int __CheckSimpleParamF(float *paramDist, uint16_t paramSrc, float Coef); static int __CheckSimpleParamU32(uint32_t *paramDist, uint16_t paramSrc, float Coef); static int __CheckSimpleParamU16(uint16_t *paramDist, uint16_t paramSrc); static int __CheckSimpleParamU8(uint8_t *paramDist, uint16_t paramSrc, float Coef); -static int __AngleSetLimit(void); +static void __AngleSetLimit(void); /** * @brief Контроль внутренних параметров УПП. @@ -38,6 +38,8 @@ void UPP_Control_InternalParams(void) uint8_t pwm_phase_mask = upp.hpwm.Config.PhaseMask.all; uint16_t pwm_freq = upp.hpwm.Config.Frequency; uint8_t pwm_pulse_num = upp.hpwm.Config.PulseNumber; + // временная переменная для параметров Мониторинга сети + float pm_alpha = upp.pm.measured.exp[0].alpha; for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) @@ -58,11 +60,11 @@ void UPP_Control_InternalParams(void) } // Параметры алгоритма перехода через ноль - if(__CheckSimpleParamF(&zc_hysteresis, MB_INTERNAL.param.zc.Hysteresis, 100)) + if(__CheckSimpleParamF(&zc_hysteresis, MB_INTERNAL.param.zc.Hysteresis, 10000)) { zc_update = 1; } - if(__CheckSimpleParamU16(&zc_debounce, MB_INTERNAL.param.zc.Hysteresis)) + if(__CheckSimpleParamU16(&zc_debounce, MB_INTERNAL.param.zc.DebouneCouner)) { zc_update = 1; } @@ -79,7 +81,16 @@ void UPP_Control_InternalParams(void) if(__CheckSimpleParamU8(&pwm_pulse_num, MB_INTERNAL.param.pwm.PulseNumber, 1)) { pwm_update = 1; - } + } + // Параметры мониторинга + if(__CheckSimpleParamF(&pm_alpha, MB_INTERNAL.param.pm.mean_alpha, 65535)) + { + for(int i = 0; i < 3; i++) + { + Filter_ReInit(&upp.pm.measured.exp[i], pm_alpha); + } + } + // Обновление АЦП конфигов @@ -142,6 +153,17 @@ void UPP_SetDefault(int pui_default, int internal_default) if(internal_default) { + MB_INTERNAL.param.nominal.PhaseNumber = NOM_PHASE_NUMB; + MB_INTERNAL.param.nominal.U = NOM_U_V_DEFAULT*10; + MB_INTERNAL.param.nominal.U_deviation_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100; + MB_INTERNAL.param.nominal.U_deviation_minus = NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT*100; + MB_INTERNAL.param.nominal.F = NOM_F_HZ_DEFAULT*100; + MB_INTERNAL.param.nominal.F_deviation_plus = NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT*100; + MB_INTERNAL.param.nominal.F_deviation_minus = NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT*100; + MB_INTERNAL.param.nominal.I = NOM_I_A_DEFAULT*10; + + MB_INTERNAL.param.pm.mean_alpha = PM_EXP_ALPHA_COEF_DEFAULT*65535; + MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UBA] = ADC_U_MAX_V_DEFAULT*10; MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UAC] = ADC_U_MAX_V_DEFAULT*10; MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IC] = ADC_I_MAX_A_DEFAULT*10; @@ -155,7 +177,7 @@ void UPP_SetDefault(int pui_default, int internal_default) MB_INTERNAL.param.pwm.Frequency = (float)PWM_THYR_FREQUENCY_HZ_DEFAULT; MB_INTERNAL.param.pwm.PulseNumber = PWM_THYR_PULSE_NUMBER_DEFAULT; - MB_INTERNAL.param.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_V_DEFAULT*100; + MB_INTERNAL.param.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100; MB_INTERNAL.param.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_10US_DEFAULT; //__AngleSetLimit(); } @@ -163,10 +185,10 @@ void UPP_SetDefault(int pui_default, int internal_default) -static int __AngleSetLimit(void) +static void __AngleSetLimit(void) { // Перерасчет максимально допустимого угла - float pulses_percent_of_period = ((MB_INTERNAL.param.pwm.PulseNumber / MB_INTERNAL.param.pwm.Frequency) * 1000) / ANGLE_PERIOD_MS; + float pulses_percent_of_period = ((MB_INTERNAL.param.pwm.PulseNumber / MB_INTERNAL.param.pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(NOM_F_HZ_DEFAULT); float angle_limit = 1 - pulses_percent_of_period; Angle_SetLimit(&upp.hangle, angle_limit); } diff --git a/UPP/Core/UPP/upp_control.h b/UPP/Core/UPP/upp_control.h index 6404411..45f5b48 100644 --- a/UPP/Core/UPP/upp_control.h +++ b/UPP/Core/UPP/upp_control.h @@ -12,10 +12,10 @@ typedef struct { - unsigned set_default_pui:1; - unsigned set_default_internal:1; - unsigned go:1; - unsigned stop:1; + unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные + unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные + unsigned go:1; ///< Запустить УПП + unsigned stop:1; ///< Выставить внутренние настройки в дефолтные unsigned reserved:11; @@ -25,33 +25,51 @@ typedef struct typedef struct { + + struct + { + uint16_t mean_alpha; ///< Коэф альфа x10000 для эксп. фильтра Umean, Imean, Fmean + }pm; + + struct + { + uint16_t PhaseNumber; ///< Количество + uint16_t U; ///< В x 10 + uint16_t U_deviation_plus; ///< Проценты x 100 + uint16_t U_deviation_minus; ///< Проценты x 100 + uint16_t F; ///< Гц x 100 + uint16_t F_deviation_plus; ///< Проценты x 100 + uint16_t F_deviation_minus; ///< Проценты x 100 + uint16_t I; ///< Амперы x 10 + }nominal; + /* Параметры АЦП */ struct { - uint16_t ADC_Max[4]; - uint16_t ADC_Zero[4]; + uint16_t ADC_Max[4]; ///< В x 10 + uint16_t ADC_Zero[4]; ///< Кванты АЦП }adc; /* Параметры ШИМ */ struct { - uint16_t PhaseMask; - uint16_t Frequency; - uint16_t PulseNumber; + uint16_t PhaseMask; ///< Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c + uint16_t Frequency; ///< Частота ШИМ для пачки импульсов на тиристоры + uint16_t PulseNumber; ///< Количесво импульсов в пачке }pwm; /* Параметры Угла */ struct { - uint16_t Hysteresis; - uint16_t DebouneCouner; + uint16_t Hysteresis; ///< Гистерезис для определения перехода через ноль + uint16_t DebouneCouner; ///< Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль }zc; /* Параметры Угла */ struct { - uint16_t Angle_Max; - uint16_t Angle_Min; + uint16_t Angle_Max; ///< Максимальный угол открытия тиристора + uint16_t Angle_Min; ///< Минимальный угол открытия тиристора }angle; diff --git a/UPP/Core/UPP/upp_errors.h b/UPP/Core/UPP/upp_errors.h index 9bed663..ac04ca6 100644 --- a/UPP/Core/UPP/upp_errors.h +++ b/UPP/Core/UPP/upp_errors.h @@ -104,7 +104,7 @@ typedef struct uint64_t all; struct { - unsigned :1; + unsigned slow_calc_overrun:1; }err; }f; @@ -113,6 +113,7 @@ typedef struct uint16_t adc_reinit_err; uint16_t zc_reinit_err; uint16_t pwm_reinit_err; + uint16_t slow_calc_overrun; }cnt; }prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 9356f6e..6ca39aa 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -6,6 +6,7 @@ * @details ******************************************************************************/ #include "upp_main.h" // всё остальное по работе с УПП +#include "tim.h" UPP_t upp; float alpha_dbg = 0.5; @@ -17,6 +18,7 @@ float alpha_dbg = 0.5; */ int UPP_Init(void) { + BenchTime_Init(); // Подключение указателей upp.errors = &errors; upp.PUI.params = &MB_DATA.HoldRegs.pui_params; @@ -60,8 +62,6 @@ int UPP_While(void) { upp.call->stop = 0; } - - // Сброс на дефолтные по запросу if(upp.call->set_default_pui) { @@ -73,7 +73,9 @@ int UPP_While(void) } - + + + PowerMonitor_SlowHandle(&upp.pm); // Если СТОП - переходим в ошибку if (upp.call->stop) upp.workmode = WM_Error; @@ -107,6 +109,13 @@ int UPP_While(void) PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ break; + + case WM_Done: + PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ + break; + + default: + break; } @@ -132,6 +141,8 @@ void UPP_Tick(void) void UPP_ADC_Handle(void) { + BenchTime_Start(BT_ADC, angletim.Instance->CNT, HAL_MAX_DELAY); + PowerMonitor_Handle(&upp.pm); for(int phase = 0; phase < 3; phase++) @@ -152,10 +163,14 @@ void UPP_ADC_Handle(void) } // Проверяем на ошибки + + upp.Timings.isr_adc = BenchTime_End(BT_ADC, angletim.Instance->CNT); } void UPP_PWM_Handle(void) { + BenchTime_Start(BT_PWM, angletim.Instance->CNT, HAL_MAX_DELAY); PWM_Handle(&upp.hpwm); + upp.Timings.isr_pwm = BenchTime_End(BT_PWM, angletim.Instance->CNT); } void UPP_Angle_Handle(void) @@ -184,8 +199,10 @@ void UPP_Angle_Handle(void) void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) { - if (htim == upp.hangle.htim) - { - UPP_Angle_Handle(); - } + if (htim == upp.hangle.htim) + { + BenchTime_Start(BT_SYSTICK, angletim.Instance->CNT, HAL_MAX_DELAY); + UPP_Angle_Handle(); + upp.Timings.isr_systick = BenchTime_End(BT_SYSTICK, angletim.Instance->CNT); + } } \ No newline at end of file diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h index 62bc657..976e2f3 100644 --- a/UPP/Core/UPP/upp_main.h +++ b/UPP/Core/UPP/upp_main.h @@ -38,6 +38,13 @@ typedef struct UPP_Errors_t *errors; ///< Ошибки УПП uint32_t StartTick; + + struct + { + uint32_t isr_adc; + uint32_t isr_pwm; + uint32_t isr_systick; + }Timings; }UPP_t; extern UPP_t upp; diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index ff631f5..5045ead 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -564,57 +564,6 @@ dma.c 1 ../Core/Src/dma.c - - - 2 - 0 - 0 - 0 - 0 - 1 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - iwdg.c