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

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

Кое как работает:
- с периодом АЦП 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_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_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]); Filter_Start(&hpm->avg[i]);
} }
/* Инициализация среднего фильтра для температур */
for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; 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; return HAL_ERROR;
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]); 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; return HAL_OK;
} }
@ -130,8 +139,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
/* Обработка температур */ /* Обработка температур */
float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1]; float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1];
float t2 = hpm->adc.Data[ADC_CHANNEL_TEMP2]; 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_1] = Filter_Process(&hpm->avg[AVG_TEMP1], t1);
meas->final.T[TEMP_2] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP2], t2); 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]); 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++) 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); meas->final.Offset[i] = ZC_GetOffset(&hpm->zc, i);
fmean += meas->final.F[i]; fmean += meas->final.F[i];
@ -218,10 +227,10 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
//__SynchAvgFilters(hpm); //__SynchAvgFilters(hpm);
/* Average для медленной фильтрации */ /* Average для медленной фильтрации */
meas->slow.U[U_BA] = Filter_Process(&hpm->avg[ADC_CHANNEL_UBA], meas->fast.U[U_BA]); 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[ADC_CHANNEL_UAC], meas->fast.U[U_AC]); 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[ADC_CHANNEL_IC], meas->fast.I[I_C]); 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[ADC_CHANNEL_IA], meas->fast.I[I_A]); meas->slow.I[I_A] = Filter_Process(&hpm->avg[AVG_IA], meas->fast.I[I_A]);
/* Запускаем медленную обработку через slow_period прерываний */ /* Запускаем медленную обработку через slow_period прерываний */

View File

@ -21,6 +21,16 @@
#define EXP_IA 6 #define EXP_IA 6
#define EXP_IB 7 #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 Флаги Мониторинга сети * @brief Флаги Мониторинга сети
@ -88,7 +98,7 @@ typedef struct
PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины
FilterExp_t exp[EXP_ALL]; ///< Фильтры для сглаживания мговенного значения Напряжения/Токов FilterExp_t exp[EXP_ALL]; ///< Фильтры для сглаживания мговенного значения Напряжения/Токов
FilterAverage_t avg[ADC_NUMB_OF_CHANNELS]; ///< Фильтры для сглаживания медленных величин АЦП FilterAverage_t avg[AVG_ALL]; ///< Фильтры для сглаживания медленных величин АЦП
PowerMonitor_Flags_t f; ///< Флаги мониторинга PowerMonitor_Flags_t f; ///< Флаги мониторинга
uint32_t isr_cnt; uint32_t isr_cnt;

View File

@ -68,10 +68,6 @@ void MX_TIM1_Init(void)
{ {
Error_Handler(); Error_Handler();
} }
if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) 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_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_1);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_2); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_2);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_3); 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_5);
HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_6); HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_6);
HAL_TIM_Base_Start_IT(&hpwm1); HAL_TIM_Base_Start_IT(&hpwm1);
return HAL_OK; 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(&hpwm1, 0);
__HAL_TIM_SET_COUNTER(&hpwm2, 0); __HAL_TIM_SET_COUNTER(&hpwm2, 0);
PWM_Stop(hpwm, 0, 1);
return HAL_TIM_Base_Start_IT(&hpwm1); return HAL_TIM_Base_Start_IT(&hpwm1);
} }

View File

@ -172,6 +172,11 @@ int UPP_While(void)
break; break;
} }
UPP_Errors_Handle();
UPP_Params_InternalControl();
upp.pm.f.runSlow = 0; upp.pm.f.runSlow = 0;
upp.Timings.slow_calc_us = BenchTime_End(BT_SLOWCALC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; upp.Timings.slow_calc_us = BenchTime_End(BT_SLOWCALC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ;
}//if(upp.pm.f.runSlow) }//if(upp.pm.f.runSlow)
@ -191,8 +196,6 @@ void UPP_Tick(void)
{ {
if(upp.workmode == UPP_Not_Init) if(upp.workmode == UPP_Not_Init)
return; return;
UPP_Errors_Handle();
UPP_Params_InternalControl();
} }
@ -274,8 +277,8 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim)
} }
void HAL_IncTick(void) 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; uwTick += uwTickFreq;
//UPP_Tick(); UPP_Tick();
//upp.Timings.isr_systick_us = BenchTime_End(BT_SYSTICK, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; 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> <Type>0</Type>
<LineNumber>407</LineNumber> <LineNumber>407</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134233290</Address> <Address>134233366</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
@ -354,7 +354,7 @@
<SizeOfObject>0</SizeOfObject> <SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess> <BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount> <BreakIfRCount>0</BreakIfRCount>
<Filename>..\Core\Src\DBG_stm32f417_support.c</Filename> <Filename>.\startup_stm32f417xx.s</Filename>
<ExecCommand></ExecCommand> <ExecCommand></ExecCommand>
<Expression></Expression> <Expression></Expression>
</Bp> </Bp>
@ -393,25 +393,20 @@
<Ww> <Ww>
<count>6</count> <count>6</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>htim14.Instance-&gt;PSC,0x0A</ItemText> <ItemText>htim5.Instance-&gt;PSC,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>7</count> <count>7</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>htim5.Instance-&gt;PSC,0x0A</ItemText> <ItemText>SystemCoreClock,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>8</count> <count>8</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>SystemCoreClock,0x0A</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>1</WinNumber>
<ItemText>sysclockfreq,0x0A</ItemText> <ItemText>sysclockfreq,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>10</count> <count>9</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>\\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing</ItemText> <ItemText>\\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing</ItemText>
</Ww> </Ww>
@ -435,7 +430,7 @@
<Ww> <Ww>
<count>3</count> <count>3</count>
<WinNumber>2</WinNumber> <WinNumber>2</WinNumber>
<ItemText>errors.prvt.cnt</ItemText> <ItemText>errors.prvt.cnt,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>4</count> <count>4</count>
@ -472,6 +467,11 @@
<WinNumber>2</WinNumber> <WinNumber>2</WinNumber>
<ItemText>htim5.Instance,0x0A</ItemText> <ItemText>htim5.Instance,0x0A</ItemText>
</Ww> </Ww>
<Ww>
<count>11</count>
<WinNumber>2</WinNumber>
<ItemText>iref_dbg</ItemText>
</Ww>
</WatchWindow2> </WatchWindow2>
<Tracepoint> <Tracepoint>
<THDelay>0</THDelay> <THDelay>0</THDelay>
@ -537,6 +537,10 @@
<Name>System Viewer\DBG</Name> <Name>System Viewer\DBG</Name>
<WinId>35902</WinId> <WinId>35902</WinId>
</Entry> </Entry>
<Entry>
<Name>System Viewer\TIM1</Name>
<WinId>35901</WinId>
</Entry>
<Entry> <Entry>
<Name>System Viewer\TIM14</Name> <Name>System Viewer\TIM14</Name>
<WinId>35903</WinId> <WinId>35903</WinId>

View File

@ -128,24 +128,23 @@ Mcu.Pin54=VP_RTC_VS_RTC_Activate
Mcu.Pin55=VP_RTC_VS_RTC_Calendar Mcu.Pin55=VP_RTC_VS_RTC_Calendar
Mcu.Pin56=VP_SYS_VS_tim14 Mcu.Pin56=VP_SYS_VS_tim14
Mcu.Pin57=VP_TIM1_VS_ClockSourceINT Mcu.Pin57=VP_TIM1_VS_ClockSourceINT
Mcu.Pin58=VP_TIM1_VS_OPM Mcu.Pin58=VP_TIM2_VS_ClockSourceINT
Mcu.Pin59=VP_TIM2_VS_ClockSourceINT Mcu.Pin59=VP_TIM2_VS_no_output1
Mcu.Pin6=PC14/OSC32_IN Mcu.Pin6=PC14/OSC32_IN
Mcu.Pin60=VP_TIM2_VS_no_output1 Mcu.Pin60=VP_TIM2_VS_no_output2
Mcu.Pin61=VP_TIM2_VS_no_output2 Mcu.Pin61=VP_TIM2_VS_no_output3
Mcu.Pin62=VP_TIM2_VS_no_output3 Mcu.Pin62=VP_TIM3_VS_ControllerModeTrigger
Mcu.Pin63=VP_TIM3_VS_ControllerModeTrigger Mcu.Pin63=VP_TIM3_VS_ClockSourceINT
Mcu.Pin64=VP_TIM3_VS_ClockSourceINT Mcu.Pin64=VP_TIM3_VS_ClockSourceITR
Mcu.Pin65=VP_TIM3_VS_ClockSourceITR Mcu.Pin65=VP_TIM3_VS_OPM
Mcu.Pin66=VP_TIM3_VS_OPM Mcu.Pin66=VP_TIM5_VS_ClockSourceINT
Mcu.Pin67=VP_TIM5_VS_ClockSourceINT Mcu.Pin67=VP_TIM8_VS_ClockSourceINT
Mcu.Pin68=VP_TIM8_VS_ClockSourceINT Mcu.Pin68=VP_TIM11_VS_ClockSourceINT
Mcu.Pin69=VP_TIM11_VS_ClockSourceINT Mcu.Pin69=VP_TIM12_VS_ClockSourceINT
Mcu.Pin7=PC15/OSC32_OUT Mcu.Pin7=PC15/OSC32_OUT
Mcu.Pin70=VP_TIM12_VS_ClockSourceINT
Mcu.Pin8=PF6 Mcu.Pin8=PF6
Mcu.Pin9=PF7 Mcu.Pin9=PF7
Mcu.PinsNb=71 Mcu.PinsNb=70
Mcu.ThirdPartyNb=0 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.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 Mcu.UserName=STM32F427ZGTx
@ -470,12 +469,11 @@ SPI3.Direction=SPI_DIRECTION_2LINES
SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate
SPI3.Mode=SPI_MODE_MASTER SPI3.Mode=SPI_MODE_MASTER
SPI3.VirtualType=VM_MASTER SPI3.VirtualType=VM_MASTER
TIM1.Channel-Output\ Compare2\ CH2=TIM_CHANNEL_2
TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 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.Prescaler=0
TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM11.IPParameters=Prescaler TIM11.IPParameters=Prescaler
@ -519,8 +517,6 @@ VP_TIM12_VS_ClockSourceINT.Mode=Internal
VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT
VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT 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.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM2_VS_no_output1.Mode=Output Compare1 No Output VP_TIM2_VS_no_output1.Mode=Output Compare1 No Output