Добавлен фильтр на частоту сети

Исправлены баги

Кое как работает:
- с периодом АЦП 30 мкс
- с периодом while 600 мкс
This commit is contained in:
Razvalyaev 2025-11-19 17:06:28 +03:00
parent 5090ddfd48
commit 0e950148c5
8 changed files with 71 additions and 49 deletions

View File

@ -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
/* Частоты таймеров в МГц*/

View File

@ -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 прерываний */

View File

@ -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;

View File

@ -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)

View File

@ -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);
@ -68,7 +69,6 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm)
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);
}

View File

@ -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;
}

View File

@ -331,7 +331,7 @@
<Type>0</Type>
<LineNumber>407</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134233290</Address>
<Address>134233366</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
@ -354,7 +354,7 @@
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\Core\Src\DBG_stm32f417_support.c</Filename>
<Filename>.\startup_stm32f417xx.s</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
@ -393,25 +393,20 @@
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>htim14.Instance-&gt;PSC,0x0A</ItemText>
<ItemText>htim5.Instance-&gt;PSC,0x0A</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>htim5.Instance-&gt;PSC,0x0A</ItemText>
<ItemText>SystemCoreClock,0x0A</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>SystemCoreClock,0x0A</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>1</WinNumber>
<ItemText>sysclockfreq,0x0A</ItemText>
</Ww>
<Ww>
<count>10</count>
<count>9</count>
<WinNumber>1</WinNumber>
<ItemText>\\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing</ItemText>
</Ww>
@ -435,7 +430,7 @@
<Ww>
<count>3</count>
<WinNumber>2</WinNumber>
<ItemText>errors.prvt.cnt</ItemText>
<ItemText>errors.prvt.cnt,0x0A</ItemText>
</Ww>
<Ww>
<count>4</count>
@ -472,6 +467,11 @@
<WinNumber>2</WinNumber>
<ItemText>htim5.Instance,0x0A</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>2</WinNumber>
<ItemText>iref_dbg</ItemText>
</Ww>
</WatchWindow2>
<Tracepoint>
<THDelay>0</THDelay>
@ -537,6 +537,10 @@
<Name>System Viewer\DBG</Name>
<WinId>35902</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM1</Name>
<WinId>35901</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM14</Name>
<WinId>35903</WinId>

View File

@ -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