From 0e950148c5313606698f3c7a91bdf47492ba29ec Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Wed, 19 Nov 2025 17:06:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=BE=D1=82=D1=83=20=D1=81=D0=B5=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлены баги Кое как работает: - с периодом АЦП 30 мкс - с периодом while 600 мкс --- UPP/Core/Configs/upp_config.h | 3 ++- UPP/Core/PowerMonitor/power_monitor.c | 25 ++++++++++++++------- UPP/Core/PowerMonitor/power_monitor.h | 12 +++++++++- UPP/Core/Src/tim.c | 4 ---- UPP/Core/UPP/pwm_thyristors.c | 5 ++++- UPP/Core/UPP/upp_main.c | 13 ++++++----- UPP/MDK-ARM/UPP.uvoptx | 26 +++++++++++++--------- UPP/UPP.ioc | 32 ++++++++++++--------------- 8 files changed, 71 insertions(+), 49 deletions(-) diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index db3e6fd..cdb6f93 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -111,8 +111,9 @@ /* Периоды вызова всякого */ #define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс -#define PM_SLOW_PERIOD_CNT 50 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US +#define PM_SLOW_PERIOD_CNT 20 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US #define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT +#define PM_F_SLOW_PERIOD_CNT 2000 ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT /* Частоты таймеров в МГц*/ diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index e293f6a..52582c4 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -85,13 +85,22 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) Filter_Start(&hpm->avg[i]); } + /* Инициализация среднего фильтра для температур */ for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; i++) { - if(FilterAverage_Init(&hpm->avg[ADC_TEMP_CHANNELS_START+i], PM_TEMP_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT)) + if(FilterAverage_Init(&hpm->avg[AVG_TEMP1+i], PM_TEMP_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT)) return HAL_ERROR; Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]); } + /* Инициализация среднего фильтра для частот */ + for(int i = 0; i < 3; i++) + { + if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], PM_F_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT)) + return HAL_ERROR; + + Filter_Start(&hpm->avg[AVG_FBA+i]); + } return HAL_OK; } @@ -130,8 +139,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) /* Обработка температур */ float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1]; float t2 = hpm->adc.Data[ADC_CHANNEL_TEMP2]; - meas->final.T[TEMP_1] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP1], t1); - meas->final.T[TEMP_2] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP2], t2); + meas->final.T[TEMP_1] = Filter_Process(&hpm->avg[AVG_TEMP1], t1); + meas->final.T[TEMP_2] = Filter_Process(&hpm->avg[AVG_TEMP2], t2); /* Расчет третьей фазы */ meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_BA], meas->slow.U[U_AC]); @@ -147,7 +156,7 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) for(int i = 0; i < 3; i++) { /* Получение частоты фазы */ - meas->final.F[i] = ZC_GetFrequency(&hpm->zc, i); + meas->final.F[i] = Filter_Process(&hpm->avg[AVG_FBA+i], ZC_GetFrequency(&hpm->zc, i)); meas->final.Offset[i] = ZC_GetOffset(&hpm->zc, i); fmean += meas->final.F[i]; @@ -218,10 +227,10 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm) //__SynchAvgFilters(hpm); /* Average для медленной фильтрации */ - meas->slow.U[U_BA] = Filter_Process(&hpm->avg[ADC_CHANNEL_UBA], meas->fast.U[U_BA]); - meas->slow.U[U_AC] = Filter_Process(&hpm->avg[ADC_CHANNEL_UAC], meas->fast.U[U_AC]); - meas->slow.I[I_C] = Filter_Process(&hpm->avg[ADC_CHANNEL_IC], meas->fast.I[I_C]); - meas->slow.I[I_A] = Filter_Process(&hpm->avg[ADC_CHANNEL_IA], meas->fast.I[I_A]); + meas->slow.U[U_BA] = Filter_Process(&hpm->avg[AVG_UBA], meas->fast.U[U_BA]); + meas->slow.U[U_AC] = Filter_Process(&hpm->avg[AVG_UAC], meas->fast.U[U_AC]); + meas->slow.I[I_C] = Filter_Process(&hpm->avg[AVG_IC], meas->fast.I[I_C]); + meas->slow.I[I_A] = Filter_Process(&hpm->avg[AVG_IA], meas->fast.I[I_A]); /* Запускаем медленную обработку через slow_period прерываний */ diff --git a/UPP/Core/PowerMonitor/power_monitor.h b/UPP/Core/PowerMonitor/power_monitor.h index 551316b..14518cb 100644 --- a/UPP/Core/PowerMonitor/power_monitor.h +++ b/UPP/Core/PowerMonitor/power_monitor.h @@ -21,6 +21,16 @@ #define EXP_IA 6 #define EXP_IB 7 +#define AVG_ALL 9 +#define AVG_UBA 0 +#define AVG_UAC 1 +#define AVG_IC 2 +#define AVG_IA 3 +#define AVG_TEMP1 4 +#define AVG_TEMP2 5 +#define AVG_FBA 6 +#define AVG_FAC 7 +#define AVG_FBC 8 /** * @brief Флаги Мониторинга сети @@ -88,7 +98,7 @@ typedef struct PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины FilterExp_t exp[EXP_ALL]; ///< Фильтры для сглаживания мговенного значения Напряжения/Токов - FilterAverage_t avg[ADC_NUMB_OF_CHANNELS]; ///< Фильтры для сглаживания медленных величин АЦП + FilterAverage_t avg[AVG_ALL]; ///< Фильтры для сглаживания медленных величин АЦП PowerMonitor_Flags_t f; ///< Флаги мониторинга uint32_t isr_cnt; diff --git a/UPP/Core/Src/tim.c b/UPP/Core/Src/tim.c index 5742d7e..9d46689 100644 --- a/UPP/Core/Src/tim.c +++ b/UPP/Core/Src/tim.c @@ -68,10 +68,6 @@ void MX_TIM1_Init(void) { Error_Handler(); } - if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK) - { - Error_Handler(); - } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) diff --git a/UPP/Core/UPP/pwm_thyristors.c b/UPP/Core/UPP/pwm_thyristors.c index 1b2038d..355d226 100644 --- a/UPP/Core/UPP/pwm_thyristors.c +++ b/UPP/Core/UPP/pwm_thyristors.c @@ -60,6 +60,7 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm) PWM_SetConfig(hpwm, PARAM_INTERNAL.pwm.PhaseMask, PARAM_INTERNAL.pwm.Frequency, PARAM_INTERNAL.pwm.PulseNumber); + PWM_Stop(hpwm, 0, 1); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_1); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_2); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_3); @@ -67,7 +68,6 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm) HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_5); HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_6); HAL_TIM_Base_Start_IT(&hpwm1); - return HAL_OK; } @@ -246,6 +246,9 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t // Сброс счетчиков таймера и запуск заного __HAL_TIM_SET_COUNTER(&hpwm1, 0); __HAL_TIM_SET_COUNTER(&hpwm2, 0); + + PWM_Stop(hpwm, 0, 1); + return HAL_TIM_Base_Start_IT(&hpwm1); } diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 7c86712..466c74b 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -172,6 +172,11 @@ int UPP_While(void) break; } + + UPP_Errors_Handle(); + UPP_Params_InternalControl(); + + upp.pm.f.runSlow = 0; upp.Timings.slow_calc_us = BenchTime_End(BT_SLOWCALC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; }//if(upp.pm.f.runSlow) @@ -191,8 +196,6 @@ void UPP_Tick(void) { if(upp.workmode == UPP_Not_Init) return; - UPP_Errors_Handle(); - UPP_Params_InternalControl(); } @@ -274,8 +277,8 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) } void HAL_IncTick(void) { - //BenchTime_Start(BT_SYSTICK, angletim.Instance->CNT, HAL_MAX_DELAY); + BenchTime_Start(BT_SYSTICK, angletim.Instance->CNT, HAL_MAX_DELAY); uwTick += uwTickFreq; - //UPP_Tick(); - //upp.Timings.isr_systick_us = BenchTime_End(BT_SYSTICK, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; + UPP_Tick(); + upp.Timings.isr_systick_us = BenchTime_End(BT_SYSTICK, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; } \ No newline at end of file diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index bc35c46..d174165 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -331,7 +331,7 @@ 0 407 1 -
134233290
+
134233366
0 0 0 @@ -354,7 +354,7 @@ 0 0 0 - ..\Core\Src\DBG_stm32f417_support.c + .\startup_stm32f417xx.s @@ -393,25 +393,20 @@ 6 1 - htim14.Instance->PSC,0x0A + htim5.Instance->PSC,0x0A 7 1 - htim5.Instance->PSC,0x0A + SystemCoreClock,0x0A 8 1 - SystemCoreClock,0x0A - - - 9 - 1 sysclockfreq,0x0A - 10 + 9 1 \\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing @@ -435,7 +430,7 @@ 3 2 - errors.prvt.cnt + errors.prvt.cnt,0x0A 4 @@ -472,6 +467,11 @@ 2 htim5.Instance,0x0A + + 11 + 2 + iref_dbg + 0 @@ -537,6 +537,10 @@ System Viewer\DBG 35902 + + System Viewer\TIM1 + 35901 + System Viewer\TIM14 35903 diff --git a/UPP/UPP.ioc b/UPP/UPP.ioc index aca7cbf..54bd3a7 100644 --- a/UPP/UPP.ioc +++ b/UPP/UPP.ioc @@ -128,24 +128,23 @@ Mcu.Pin54=VP_RTC_VS_RTC_Activate Mcu.Pin55=VP_RTC_VS_RTC_Calendar Mcu.Pin56=VP_SYS_VS_tim14 Mcu.Pin57=VP_TIM1_VS_ClockSourceINT -Mcu.Pin58=VP_TIM1_VS_OPM -Mcu.Pin59=VP_TIM2_VS_ClockSourceINT +Mcu.Pin58=VP_TIM2_VS_ClockSourceINT +Mcu.Pin59=VP_TIM2_VS_no_output1 Mcu.Pin6=PC14/OSC32_IN -Mcu.Pin60=VP_TIM2_VS_no_output1 -Mcu.Pin61=VP_TIM2_VS_no_output2 -Mcu.Pin62=VP_TIM2_VS_no_output3 -Mcu.Pin63=VP_TIM3_VS_ControllerModeTrigger -Mcu.Pin64=VP_TIM3_VS_ClockSourceINT -Mcu.Pin65=VP_TIM3_VS_ClockSourceITR -Mcu.Pin66=VP_TIM3_VS_OPM -Mcu.Pin67=VP_TIM5_VS_ClockSourceINT -Mcu.Pin68=VP_TIM8_VS_ClockSourceINT -Mcu.Pin69=VP_TIM11_VS_ClockSourceINT +Mcu.Pin60=VP_TIM2_VS_no_output2 +Mcu.Pin61=VP_TIM2_VS_no_output3 +Mcu.Pin62=VP_TIM3_VS_ControllerModeTrigger +Mcu.Pin63=VP_TIM3_VS_ClockSourceINT +Mcu.Pin64=VP_TIM3_VS_ClockSourceITR +Mcu.Pin65=VP_TIM3_VS_OPM +Mcu.Pin66=VP_TIM5_VS_ClockSourceINT +Mcu.Pin67=VP_TIM8_VS_ClockSourceINT +Mcu.Pin68=VP_TIM11_VS_ClockSourceINT +Mcu.Pin69=VP_TIM12_VS_ClockSourceINT Mcu.Pin7=PC15/OSC32_OUT -Mcu.Pin70=VP_TIM12_VS_ClockSourceINT Mcu.Pin8=PF6 Mcu.Pin9=PF7 -Mcu.PinsNb=71 +Mcu.PinsNb=70 Mcu.ThirdPartyNb=0 Mcu.UserConstants=mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim8;usTick,ustim.Instance->CNT;hpwm2,htim3;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1;ANGLE_CHANNEL_1,TIM_CHANNEL_1;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;angletim,htim2 Mcu.UserName=STM32F427ZGTx @@ -470,12 +469,11 @@ SPI3.Direction=SPI_DIRECTION_2LINES SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate SPI3.Mode=SPI_MODE_MASTER SPI3.VirtualType=VM_MASTER -TIM1.Channel-Output\ Compare2\ CH2=TIM_CHANNEL_2 TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 -TIM1.IPParameters=Prescaler,Channel-Output Compare2 CH2,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger +TIM1.IPParameters=Prescaler,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger TIM1.Prescaler=0 TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE TIM11.IPParameters=Prescaler @@ -519,8 +517,6 @@ VP_TIM12_VS_ClockSourceINT.Mode=Internal VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT -VP_TIM1_VS_OPM.Mode=OPM_bit -VP_TIM1_VS_OPM.Signal=TIM1_VS_OPM VP_TIM2_VS_ClockSourceINT.Mode=Internal VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT VP_TIM2_VS_no_output1.Mode=Output Compare1 No Output