Добавлен True RMS фильтр и оптимизации

This commit is contained in:
Razvalyaev 2025-12-02 18:40:47 +03:00
parent 3750d579fa
commit 2775e0a9b6
14 changed files with 366 additions and 130 deletions

View File

@ -3,6 +3,8 @@
#include "dsp/none.h"
#endif
#define _sqrtf(...) sqrtf(__VA_ARGS__)
#define __disable_irq()
#ifndef __ASM

View File

@ -5,7 +5,7 @@ VadcMax = 1216;
Ts = 5e-6;
Vnom = 400;
Inom = 30;
Inom = 15;
Fnom = 50;
Temperature1 = 2.22; % 20 градусов

Binary file not shown.

@ -1 +1 @@
Subproject commit c5a01c56acd851843edc478bd65c7f276a9ac8e3
Subproject commit 1f7384c5edc30469217ca49c6489bdab13460320

View File

@ -35,6 +35,7 @@
//#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП
#define UPP_DISABLE_PROTECT_BOARDPOWER ///< Отключить проверки питания плат (+24, +5 В)
#define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы
//#define UPP_ANGLE_COSINE ///< Расчет угла через acos, а не линейно
/**
* @addtogroup UPP_PARAMS_DEFAULT Default params for external flash
@ -86,7 +87,8 @@
#define ANGLE_PID_KD_COEF_DEFAULT 0
/* Параметри мониторинга сети */
#define PM_EXP_TAU_COEF_DEFAULT 0.2
#define PM_RMS_WINDOW_PERIOD_US_DEFAULT 20000
#define PM_RMS_EXT_TAU_US_DEFAULT 0.2
/* Параметры АЦП */
#define ADC_U_MAX_V_DEFAULT 1216.0

View File

@ -81,7 +81,6 @@ HAL_StatusTypeDef ADC_ConfigChannel(ADC_Periodic_t *adc, int ChNumb, uint16_t le
adc->Coefs[ChNumb].vMax = valueMax;
adc->Coefs[ChNumb].lZero = levelZero;
ADC_ResetStatistics(adc, ChNumb);
return HAL_OK;
}
@ -140,11 +139,40 @@ HAL_StatusTypeDef ADC_Stop(ADC_Periodic_t *adc)
}
/**
* @brief Обновление температур АЦП.
* @return HAL Status.
*/
HAL_StatusTypeDef ADC_UpdateTemperatures(ADC_Periodic_t *adc)
{
if(assert_upp(adc))
return HAL_ERROR;
float *data = adc->Data;
uint16_t *raw = adc->RawData;
// Фильтрация от импульсных шумов для каналов напряжения/токов
for(int i = ADC_TEMP_CHANNELS_START; i < ADC_NUMB_OF_CHANNELS; i++)
{
// заменяем сырые данные на отфильтрованные данные
raw[i] = Filter_Process(&adc->filter[i], raw[i]);
}
// Преобразования температуры по таблице
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]);
}
return HAL_OK;
}
/**
* @brief Обработка АЦП.
* @return HAL Status.
* @details По факту остановка таймера, который запускает АЦП. Сам АЦП продолжает работу.
* @note Вызывается в DMA2_Stream0_IRQHandler() для обработки всего, что пришло по DMA.
* @note Вызывается в DMA2_Stream0_IRQHandler() для обработки напряжений/токов,
которые пришли по DMA.
*/
HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
{
@ -155,14 +183,11 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
uint16_t *raw = adc->RawData;
float *data = adc->Data;
// // Фильтрация от импульсных шумов для всех каналов
// Фильтрация от импульсных шумов для каналов напряжения/токов
for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
{
if(Filter_isEnable(&adc->filter[i]))
{
// заменяем сырые данные на отфильтрованные данные
raw[i] = Filter_Process(&adc->filter[i], raw[i]);
}
// заменяем сырые данные на отфильтрованные данные
raw[i] = Filter_Process(&adc->filter[i], raw[i]);
}
// Перерасчеты Напряжений/Токов в единицы измерения
@ -172,75 +197,9 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
data[i] = ((float)(raw[i])-coefs->lZero) * coefs->vMax / (coefs->lMax-coefs->lZero);
}
// Преобразования температуры по таблице
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]);
}
if(Filter_isDataReady(&adc->filter[0]))
adc->f.DataReady = 1;
return HAL_OK;
}
/**
* @brief Сбор статистики.
*/
void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t level)
{
if (level < ADC_LEVEL_BASE)
return;
if(assert_upp(adc))
return;
if (channel >= ADC_NUMB_OF_REGULAR_CHANNELS)
return;
ADC_Statistics *stat = &adc->Stat[channel];
float value = adc->Data[channel];
// Первая инициализация
if (stat->SampleCount == 0) {
stat->Max = value;
stat->Min = value;
stat->Sum = 0;
stat->SumSquares = 0;
}
// Обновление min/max
if (value > stat->Max) stat->Max = value;
if (value < stat->Min) stat->Min = value;
// если не выбраны характеристики переменного сигнала - уходим
if(level < ADC_LEVEL_AC)
{
return;
}
// Накопление для Avg/RMS
stat->Sum += fabsf(value);
stat->SumSquares += value * value;
stat->SampleCount++;
// Расчет Avg/RMS (периодически или по запросу)
if (stat->SampleCount >= 4000) { // Пример: пересчет каждые 1000 samples
stat->Avg = stat->Sum / stat->SampleCount;
stat->RMS = sqrtf(stat->SumSquares / stat->SampleCount);
// Сброс накопителей
stat->Sum = 0;
stat->SumSquares = 0;
stat->SampleCount = 0;
}
}
/**
* @brief Сброс статистики.
*/
void ADC_ResetStatistics(ADC_Periodic_t *adc, uint8_t channel)
{
if (channel < ADC_NUMB_OF_REGULAR_CHANNELS) {
memset(&adc->Stat[channel], 0, sizeof(ADC_Statistics));
}
}

View File

@ -53,7 +53,7 @@ static const float adc_temp_quants[] = ADC_TEMPERATURES_QUANTS;
#define Filter_t FilterMedianInt_t
#define Filter_Init FilterMedianInt_Init
#define Filter_Initializator 10, 2048
#define Filter_Initializator 5, 2048
/**
* @brief Коэфициенты канала АЦП для пересчета в единицы измерения
@ -105,7 +105,6 @@ typedef struct
FilterLUT_t temp_map[2]; ///< Коррекция нелинейности датчиков температуры
float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах)
ADC_Statistics Stat[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Статистика для регулярных каналов (не температуры)
struct
{
@ -126,13 +125,9 @@ HAL_StatusTypeDef ADC_ConfigChannel(ADC_Periodic_t *adc, int ChNumb, uint16_t le
HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, float PeriodUs);
/* Остановка АЦП. */
HAL_StatusTypeDef ADC_Stop(ADC_Periodic_t *adc);
/* Обновление температур АЦП. */
HAL_StatusTypeDef ADC_UpdateTemperatures(ADC_Periodic_t *adc);
/* Обработка АЦП после получения данных. */
HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc);
/* Сбор статистики. */
void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t level);
/* Сброс статистики. */
void ADC_ResetStatistics(ADC_Periodic_t *adc, uint8_t channel);
#endif //_ADC_TOOLS_H_

View File

@ -69,12 +69,19 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
return HAL_ERROR;
/* Инициализация экпоненциального фильтра медленного алга */
for(int i = 0; i < EXP_ALL; i++)
/* Инициализация RMS фильтра медленного алга */
for(int i = 0; i < RMS_ALL; i++)
{
if(FilterExp_Init(&hpm->exp[i], u2f(PARAM_INTERNAL.pm.mean_alpha,65535)))
if(FilterRMS_Init(&hpm->rms[i], PARAM_INTERNAL.pm.rms_window_size))
return HAL_ERROR;
Filter_Start(&hpm->exp[i]);
Filter_Start(&hpm->rms[i]);
}
/* Инициализация экпоненциального фильтра медленного алга */
for(int i = 0; i < RMS_EXP_ALL; i++)
{
if(FilterExp_Init(&hpm->rms_exp[i], u2f(PARAM_INTERNAL.pm.rms_exp_alpha, 65535)))
return HAL_ERROR;
Filter_Start(&hpm->rms_exp[i]);
}
/* Инициализация среднего фильтра медленного алга */
@ -137,6 +144,7 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
PowerMonitor_Measured_t *meas = &hpm->measured;
/* Обработка температур */
ADC_UpdateTemperatures(&hpm->adc);
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[AVG_TEMP1], t1);
@ -161,14 +169,18 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
fmean += meas->final.F[i];
/* Средниее напряжение фазы */
uphase_mean = fabsf(meas->slow.U[i]);
uphase_mean = Filter_Process(&hpm->exp[EXP_UAB+i], uphase_mean);
meas->final.U[i] = uphase_mean*PI/2/SQRT2; /*PI/2 - получить амплитудное, SQRT2 - получить действующее */
// uphase_mean = fabsf(meas->slow.U[i]);
// uphase_mean = Filter_Process(&hpm->rms[RMS_UAB+i], uphase_mean);
// meas->final.U[i] = uphase_mean*PI/2/SQRT2; /*PI/2 - получить амплитудное, SQRT2 - получить действующее */
uphase_mean = Filter_Process(&hpm->rms[RMS_U+i], meas->slow.U[i]);
meas->final.U[i] = Filter_Process(&hpm->rms_exp[RMS_U+i], uphase_mean);
/* Средний ток фазы */
iphase_mean = fabsf(meas->slow.I[i]);
iphase_mean = Filter_Process(&hpm->exp[EXP_IC+i], iphase_mean)*PI/2;
meas->final.I[i] = iphase_mean*PI/2/SQRT2; /*PI/2 - получить амплитудное, SQRT2 - получить действующее */
// iphase_mean = fabsf(meas->slow.I[i]);
// iphase_mean = Filter_Process(&hpm->rms[RMS_IC+i], iphase_mean)*PI/2;
// meas->final.I[i] = iphase_mean*PI/2/SQRT2; /*PI/2 - получить амплитудное, SQRT2 - получить действующее */
iphase_mean = Filter_Process(&hpm->rms[RMS_I+i], meas->slow.I[i]);
meas->final.I[i] = Filter_Process(&hpm->rms_exp[RMS_I+i], iphase_mean);
/* Реальные единицы измерения (Вольты/Амперы) */
meas->real.I[i] = meas->final.I[i]*i_base;
@ -190,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->exp[EXP_U], uamp);
meas->final.Iamp = Filter_Process(&hpm->exp[EXP_I], iamp);
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);
hpm->slow_cnt++;

View File

@ -12,17 +12,22 @@
#include "adc_tools.h"
#include "zero_cross.h"
/* Индексы экспоненциальных фильтров */
#define EXP_ALL 8
#define EXP_U 0
#define EXP_UAB 1
#define EXP_UCA 2
#define EXP_UBC 3
#define EXP_I 4
#define EXP_IC 5
#define EXP_IA 6
#define EXP_IB 7
/* Индексы RMS фильтров */
#define RMS_ALL 6
#define RMS_U 0
#define RMS_UAB 0
#define RMS_UCA 1
#define RMS_UBC 2
#define RMS_I 3
#define RMS_IC 3
#define RMS_IA 4
#define RMS_IB 5
/* Это только сглаживающий, RMS с таким индексом нет */
#define RMS_EXP_ALL 8
#define RMS_EXP_U 6
#define RMS_EXP_I 7
/* Индексы усредняющих фильтров */
#define AVG_ALL 9
#define AVG_UAB 0
#define AVG_UCA 1
@ -30,6 +35,7 @@
#define AVG_IA 3
#define AVG_TEMP1 4
#define AVG_TEMP2 5
#define AVG_F 6
#define AVG_FAB 6
#define AVG_FCA 7
#define AVG_FBC 8
@ -99,8 +105,9 @@ typedef struct
PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины
FilterExp_t exp[EXP_ALL]; ///< Фильтры для сглаживания мговенного значения Напряжения/Токов
FilterAverage_t avg[AVG_ALL]; ///< Фильтры для сглаживания медленных величин АЦП
FilterRMS_t rms[RMS_ALL]; ///< Фильтры для расчета действующего значения Напряжения/Токов
FilterExp_t rms_exp[RMS_EXP_ALL]; ///< Фильтры для сглаживания действующего значения Напряжения/Токов +2 для результируюзих U, I
FilterAverage_t avg[AVG_ALL]; ///< Фильтры для сглаживания медленных величин АЦП
PowerMonitor_Flags_t f; ///< Флаги мониторинга
uint32_t isr_cnt;

View File

@ -139,10 +139,14 @@ HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float OpenLevel)
return HAL_ERROR;
/* Приводим уровень открытия к косинусу [-1:1]*/
#ifdef UPP_ANGLE_COSINE
float OpenLevelForCos = (OpenLevel*2)-1;
float alpha_rad = acosf(OpenLevelForCos); // угол в радианах
float alpha = alpha_rad/PI* hangle->Config.PeriodLimit; // время открытие в процентах от периода - когда открыть
#else
float alpha = (1-OpenLevel) * hangle->Config.PeriodLimit; // время открытие в процентах от периода - когда открыть
#endif
if(alpha > hangle->Config.AngleMax)
alpha = hangle->Config.AngleMax;
@ -313,11 +317,6 @@ HAL_StatusTypeDef Angle_SetLimit(Angle_Handle_t *hangle, float PeriodLimit)
return HAL_ERROR;
hangle->Config.PeriodLimit = PeriodLimit;
if (hangle->Config.AngleMax > hangle->Config.PeriodLimit)
hangle->Config.AngleMax = hangle->Config.PeriodLimit;
if (hangle->Config.AngleMin > hangle->Config.PeriodLimit)
hangle->Config.AngleMin = hangle->Config.PeriodLimit;
return HAL_OK;
}
@ -341,12 +340,7 @@ HAL_StatusTypeDef Angle_SetRange(Angle_Handle_t *hangle, float AngleMin, float A
return HAL_ERROR;
if(AngleMin < 0 || AngleMin > 1)
return HAL_ERROR;
if(AngleMax > hangle->Config.PeriodLimit)
AngleMax = hangle->Config.PeriodLimit;
if(AngleMin > hangle->Config.PeriodLimit)
AngleMin = hangle->Config.PeriodLimit;
if(AngleMin >= AngleMax)
return HAL_ERROR;

View File

@ -127,7 +127,8 @@ void UPP_Params_ControlInternal(void)
float pwm_duty = upp.hpwm.Config.Duty;
uint8_t pwm_pulse_num = upp.hpwm.Config.PulseNumber;
// временная переменная для параметров Мониторинга сети
float pm_alpha = upp.pm.exp[0].alpha;
uint16_t pm_rms_widnow_size = upp.pm.rms[0].window_size;
float pm_rms_exp_alpha = upp.pm.rms_exp[0].alpha;
@ -201,15 +202,22 @@ void UPP_Params_ControlInternal(void)
}
// Параметры мониторинга
if(__CheckParamF(&pm_alpha, PARAM_INTERNAL.pm.mean_alpha, 65535))
if(__CheckParamU16(&pm_rms_widnow_size, PARAM_INTERNAL.pm.rms_window_size))
{
for(int i = 0; i < EXP_ALL; i++)
for(int i = 0; i < RMS_ALL; i++)
{
Filter_ReInit(&upp.pm.exp[i], pm_alpha);
Filter_Start(&upp.pm.exp[i]);
Filter_ReInit(&upp.pm.rms[i], pm_rms_widnow_size);
Filter_Start(&upp.pm.rms[i]);
}
}
if(__CheckParamF(&pm_rms_exp_alpha, PARAM_INTERNAL.pm.rms_exp_alpha, 65535))
{
for(int i = 0; i < RMS_EXP_ALL; i++)
{
Filter_ReInit(&upp.pm.rms_exp[i], pm_rms_exp_alpha);
Filter_Start(&upp.pm.rms_exp[i]);
}
}
// Обновление регулятора угла открытия
@ -345,7 +353,8 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
PARAM_INTERNAL.nominal.F_deviation_minus = NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT*100;
PARAM_INTERNAL.nominal.I = NOM_I_A_DEFAULT*10;
PARAM_INTERNAL.pm.mean_alpha = FilterExp_CalcAlpha(PM_EXP_TAU_COEF_DEFAULT,PM_SLOW_PERIOD_US)*65535;
PARAM_INTERNAL.pm.rms_window_size = PM_RMS_WINDOW_PERIOD_US_DEFAULT/PM_SLOW_PERIOD_US;
PARAM_INTERNAL.pm.rms_exp_alpha = FilterExp_CalcAlpha98(PM_RMS_EXT_TAU_US_DEFAULT, PM_SLOW_PERIOD_US)*65535;
PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA] = ADC_U_MAX_V_DEFAULT*10;
PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC] = ADC_U_MAX_V_DEFAULT*10;

View File

@ -49,7 +49,8 @@ typedef struct
struct
{
uint16_t mean_alpha; ///< Коэф альфа для усредняющего эксп. фильтра [0..1 x 65535]
uint16_t rms_window_size; ///< Размер окна для RMS
uint16_t rms_exp_alpha; ///< Постоянная времени для сглаживания RMS
}pm;
UPP_ParamsNominal_t nominal;

View File

@ -360,7 +360,7 @@
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>sysclockfreq,0x0A</ItemText>
<ItemText>hbt,0x0A</ItemText>
</Ww>
<Ww>
<count>7</count>

View File

@ -1506,6 +1506,57 @@
<FileName>power_monitor.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\PowerMonitor\power_monitor.c</FilePath>
<FileOption>
<CommonProperty>
<UseCPPCompiler>2</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>2</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<FileArmAds>
<Cads>
<interw>2</interw>
<Optim>5</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
</FileArmAds>
</FileOption>
</File>
<File>
<FileName>power_monitor.h</FileName>
@ -1516,6 +1567,57 @@
<FileName>zero_cross.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\PowerMonitor\zero_cross.c</FilePath>
<FileOption>
<CommonProperty>
<UseCPPCompiler>2</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>2</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<FileArmAds>
<Cads>
<interw>2</interw>
<Optim>5</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
</FileArmAds>
</FileOption>
</File>
<File>
<FileName>zero_cross.h</FileName>
@ -1526,6 +1628,57 @@
<FileName>adc_tools.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\PowerMonitor\adc_tools.c</FilePath>
<FileOption>
<CommonProperty>
<UseCPPCompiler>2</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>2</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<FileArmAds>
<Cads>
<interw>2</interw>
<Optim>5</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
</FileArmAds>
</FileOption>
</File>
<File>
<FileName>adc_tools.h</FileName>
@ -1536,6 +1689,57 @@
<FileName>phases_transform.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\PowerMonitor\phases_transform.c</FilePath>
<FileOption>
<CommonProperty>
<UseCPPCompiler>2</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>2</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<FileArmAds>
<Cads>
<interw>2</interw>
<Optim>5</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
</FileArmAds>
</FileOption>
</File>
<File>
<FileName>phases_transform.h</FileName>
@ -1666,6 +1870,57 @@
<FileName>filters.c</FileName>
<FileType>1</FileType>
<FilePath>..\AllLibs\MyLibs\MyLibs\Src\filters.c</FilePath>
<FileOption>
<CommonProperty>
<UseCPPCompiler>2</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>2</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<FileArmAds>
<Cads>
<interw>2</interw>
<Optim>5</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
</FileArmAds>
</FileOption>
</File>
<File>
<FileName>filters.h</FileName>