Проверены и оптимизирвоаны защиты

- в матлаб проверена отрабокта всех защит
- добавлены быстрые защиты на КЗ, которые проверяются в прерывании АЦП
- определены и проверены более менее приоритеты ошибок

- в мтлаб добавлена симуляция MOE расширенных таймеров
This commit is contained in:
2026-02-03 16:32:30 +03:00
parent deac6d5b06
commit 804d302d2d
18 changed files with 178 additions and 84 deletions

View File

@@ -120,7 +120,18 @@ void Channels_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
CC_PWM_Ch3_Simulation(TIMx, TIMS); CC_PWM_Ch3_Simulation(TIMx, TIMS);
CC_PWM_Ch4_Simulation(TIMx, TIMS); CC_PWM_Ch4_Simulation(TIMx, TIMS);
Write_OC_to_GPIO(TIMx, TIMS); if ((TIMx == TIM1) || (TIMx == TIM8))
{
if (TIMx->BDTR & TIM_BDTR_MOE)
{
Write_OC_to_GPIO(TIMx, TIMS);
}
}
else
{
Write_OC_to_GPIO(TIMx, TIMS);
}
} }
//-----------------CAPTURE COPMARE & PWM FUNCTIONS------------------// //-----------------CAPTURE COPMARE & PWM FUNCTIONS------------------//
/* Выбор режима CaptureCompare или PWM и симуляция для каждого канала */ /* Выбор режима CaptureCompare или PWM и симуляция для каждого канала */

Binary file not shown.

View File

@@ -98,9 +98,10 @@
#define PUI_Interlace_EN_DEFAULT 5000 #define PUI_Interlace_EN_DEFAULT 5000
/* Время задержки перед выставлением ошибки */ /* Время задержки перед выставлением ошибки */
#define ERRORS_DELAY_MS_UAMP_ERR 1500 // todo #define ERRORS_DELAY_MS_UAMP_ERR 1500 // todo
#define ERRORS_DELAY_MS_F_ERR 5000 #define ERRORS_DELAY_MS_F_ERR 5000
#define ERRORS_DELAY_MS_DEFAULT 0.1f #define ERRORS_DELAY_MS_CRITICAL_ERR 0.0f
#define ERRORS_DELAY_MS_DEFAULT 0.1f
/* Параметры регулятора угла */ /* Параметры регулятора угла */

View File

@@ -214,7 +214,10 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
meas->final.PhaseSequence = UPP_Sequence_BAC; meas->final.PhaseSequence = UPP_Sequence_BAC;
} }
} }
} }
if(hpm->f.isI)
Protect_Fast(&hpm->measured, u2f(PARAM_INTERNAL->pm.lImaxAmp, 100));
/* Вообще фильтры должны рабтоать синхронно, но на всякий синхронизация */ /* Вообще фильтры должны рабтоать синхронно, но на всякий синхронизация */
//__SynchAvgFilters(hpm); //__SynchAvgFilters(hpm);
@@ -225,7 +228,6 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
meas->slow.I[I_C] = Filter_Process(&hpm->avg[AVG_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[AVG_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 прерываний */
// if(hpm->isr_cnt == PM_SLOW_PERIOD_CNT) // if(hpm->isr_cnt == PM_SLOW_PERIOD_CNT)
/* Запускаем медленную когда фильтры среднего зациклились */ /* Запускаем медленную когда фильтры среднего зациклились */
@@ -274,7 +276,7 @@ int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running)
if(Running) if(Running)
{ {
/*=============== ЗАЩИТЫ ПО ТОКУ ==================*/ /*=============== ЗАЩИТЫ ПО ТОКУ ==================*/
hpm->f.isI = Protect_Currents(measure, params, nominal); hpm->f.isI = Protect_Currents(measure, params, nominal);
} }
/*=============== ЗАЩИТЫ ВСЯКИЕ ДРУГИЕ ==================*/ /*=============== ЗАЩИТЫ ВСЯКИЕ ДРУГИЕ ==================*/

View File

@@ -72,8 +72,8 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params,
} }
else else
{ {
ERR_PRIVATE->iamp_max = 0; // ERR_PRIVATE->iamp_max = 0;
ERR_PRIVATE->iamp_min = 0; // ERR_PRIVATE->iamp_min = 0;
} }
/* Ток по фазам */ /* Ток по фазам */
@@ -87,8 +87,8 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params,
} }
else else
{ {
ERR_PRIVATE->ia_max = 0; // ERR_PRIVATE->ia_max = 0;
ERR_PRIVATE->ia_min = 0; // ERR_PRIVATE->ia_min = 0;
} }
if(measure->final.I[I_B] > lImax) if(measure->final.I[I_B] > lImax)
@@ -101,8 +101,8 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params,
} }
else else
{ {
ERR_PRIVATE->ib_max = 0; // ERR_PRIVATE->ib_max = 0;
ERR_PRIVATE->ib_min = 0; // ERR_PRIVATE->ib_min = 0;
} }
if(measure->final.I[I_C] > lImax) if(measure->final.I[I_C] > lImax)
@@ -115,14 +115,42 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params,
} }
else else
{ {
ERR_PRIVATE->ic_max = 0; // ERR_PRIVATE->ic_max = 0;
ERR_PRIVATE->ic_min = 0; // ERR_PRIVATE->ic_min = 0;
} }
return (ERR_PRIVATE->iamp_min == 0); return (ERR_PRIVATE->iamp_min == 0);
} }
/**
* @brief Проверяет быстрые защиты.
* @note Заполняет флаги prvt ошибок (приватные).
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ
*/
void Protect_Fast(PowerMonitor_Measured_t *measure, float lImaxAmp)
{
// /* Переводим уставки ПУИ в удобный вид */
// float lImaxAmp = u2f(params->Imax, 100) * 50 / u2f(nominal->I, 10) *1.41; // Амплитудное значение Imax
/* Ток по фазам */
if(measure->fast.I[I_A] > lImaxAmp)
{
ERR_PRIVATE->ia_max = 1;
}
if(measure->fast.I[I_B] > lImaxAmp)
{
ERR_PRIVATE->ib_max = 1;
}
if(measure->fast.I[I_C] > lImaxAmp)
{
ERR_PRIVATE->ic_max = 1;
}
}
/** /**
* @brief Проверяет всякие другие защиты (частота, температура). * @brief Проверяет всякие другие защиты (частота, температура).

View File

@@ -13,6 +13,8 @@
int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal); int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal);
/* Проверяет защиты по току. */ /* Проверяет защиты по току. */
int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal); int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal);
/* Проверяет всякие другие защиты (частота, температура). */ /* Проверяет быстрые защиты. */
void Protect_Fast(PowerMonitor_Measured_t *measure, float lImaxAmp);
/* Проверяет всякие другие защиты (частота, температура). */
void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal); void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal);
#endif /* _POWER_PROTECT_H_ */ #endif /* _POWER_PROTECT_H_ */

View File

@@ -76,7 +76,11 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement, float
/* Плавное нарастание уставки */ /* Плавное нарастание уставки */
hangle->Iref = Filter_Process(&hangle->refFilter, setpoint); hangle->Iref = Filter_Process(&hangle->refFilter, setpoint);
hangle->Imeas = measurement; hangle->f.RazgonDone = (fabsf(hangle->Iref - u2f(PARAM_PUI->Iref, 100)) < 0.1);;
hangle->Imeas = measurement;
/* Ошибка регулирования = уставка - измеренное */ /* Ошибка регулирования = уставка - измеренное */
float err = hangle->Iref - hangle->Imeas; float err = hangle->Iref - hangle->Imeas;
@@ -115,7 +119,8 @@ void Angle_PID_Reset(Angle_Handle_t *hangle)
return; return;
hangle->Iref = 0; hangle->Iref = 0;
hangle->Imeas = 0; hangle->Imeas = 0;
hangle->f.RazgonDone = 0;
/* Вычисляем выход PID */ /* Вычисляем выход PID */
arm_pid_reset_f32(&hangle->pid); arm_pid_reset_f32(&hangle->pid);
@@ -126,6 +131,7 @@ void Angle_PID_Reset(Angle_Handle_t *hangle)
Angle_SetAlpha(hangle, 1, 30); // максимально закрываем Angle_SetAlpha(hangle, 1, 30); // максимально закрываем
Angle_Reset(hangle, UPP_PHASE_A); Angle_Reset(hangle, UPP_PHASE_A);
Angle_Reset(hangle, UPP_PHASE_B); Angle_Reset(hangle, UPP_PHASE_B);
Angle_Reset(hangle, UPP_PHASE_C); Angle_Reset(hangle, UPP_PHASE_C);

View File

@@ -37,8 +37,9 @@ typedef struct
FilterExp_t refFilter; ///< Фильтр для плавного нарастания регулирования FilterExp_t refFilter; ///< Фильтр для плавного нарастания регулирования
struct { struct {
unsigned Initialized : 1; ///< Структура инициализирована unsigned Initialized : 1; ///< Структура инициализирована
unsigned Running : 3; ///< Сколько каналов запущено сейчас unsigned Running : 3; ///< Сколько каналов запущено сейчас
unsigned RazgonDone : 1; ///< Флаг что идет разгон Iref
} f; ///< Флаги } f; ///< Флаги
}Angle_Handle_t; }Angle_Handle_t;

View File

@@ -127,13 +127,13 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_
if(force_stop_all) if(force_stop_all)
{ {
// в первую очередь выключаем канал, потом выставим режим каналов // в первую очередь выключаем канал, потом выставим режим каналов
__HAL_TIM_MOE_DISABLE(&hpwm1); __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(&hpwm1);
__HAL_TIM_MOE_DISABLE(&hpwm2); __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(&hpwm2);
// выставляем все каналы в FORCE MODE // выставляем все каналы в FORCE MODE
for(int ch = 0; ch < 6; ch++) for(int ch = 0; ch < 6; ch++)
{ {
hpwm->AllPhases[ch].State = PWM_THYR_DISABLED;
__PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE); __PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE);
} }
return HAL_OK; return HAL_OK;
@@ -141,7 +141,6 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_
// Если НЕ force_stop_all - сбрасываем ТОЛЬКО заданный канал // Если НЕ force_stop_all - сбрасываем ТОЛЬКО заданный канал
else else
{ {
// Если не force_stop_all - сбрасываем только текущий канал
__PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE); __PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE);
return HAL_OK; return HAL_OK;
} }
@@ -294,7 +293,7 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm, float PeriodMs)
break; break;
case PWM_THYR_TIM_DONE: // пачка импульсов отправлена - отключение case PWM_THYR_TIM_DONE: // пачка импульсов отправлена - отключение
hPhase->State = PWM_THYR_TIM_WAIT; hPhase->State = PWM_THYR_DISABLED;
if(hpwm->f.Running) if(hpwm->f.Running)
hpwm->f.Running--; hpwm->f.Running--;
break; break;

View File

@@ -77,7 +77,7 @@ void UPP_Errors_Power(void)
void UPP_Errors_Ranges(void) void UPP_Errors_Ranges(void)
{ {
/* Преобразуем уставки в нормальные тики */ /* Преобразуем уставки в нормальные тики */
float ticksTiMax = u2f(PARAM_PUI->TiMax, 1)/PM_SLOW_PERIOD_US; float ticksTiMax = PARAM_PUI->TiMax/PM_SLOW_PERIOD_US;
/* Счетчики для отсчитывания задержки выставления ошибки */ /* Счетчики для отсчитывания задержки выставления ошибки */
static int IMaxCnt = 0; static int IMaxCnt = 0;
static int UMaxCnt = 0; static int UMaxCnt = 0;
@@ -235,8 +235,8 @@ __STATIC_FORCEINLINE int setError(int condition, int flag, int *timer, int delay
} else { } else {
if (*timer > 0) if (*timer > 0)
(*timer)--; (*timer)--;
else // else
flag = 0; // flag = 0;
} }
return flag; return flag;

View File

@@ -16,37 +16,41 @@
*/ */
static const uint8_t UPP_ErrorPriority[] = static const uint8_t UPP_ErrorPriority[] =
{ {
[Err_None] = 255, [Err_None] = 255,
/* Фатальные ошибки */ /* Фатальные ошибки */
[Err_LossPhaseAll] = 1, [Err_OverCurrent] = 1,
[Err_OverCurrent] = 2, [Err_OverVoltage] = 2,
[Err_OverVoltage] = 3, [Err_UnderVoltage] = 3,
[Err_OverTemperature] = 4, [Err_OverFrequency] = 4,
[Err_Power_24V] = 5, [Err_UnderFrequency] = 5,
[Err_Power_Digit_5V] = 6,
[Err_Power_DIO_24V] = 7,
[Err_Power_Analog_5V] = 8,
/* Критичные */ [Err_Power_24V] = 4,
[Err_LossPhaseA] = 10, [Err_Power_Digit_5V] = 5,
[Err_LossPhaseB] = 11, [Err_Power_DIO_24V] = 6,
[Err_LossPhaseC] = 12, [Err_Power_Analog_5V] = 7,
[Err_LongStart] = 13,
[Err_Interlace] = 14,
/* Пограничные параметры */
[Err_UnderVoltage] = 20,
[Err_OverFrequency] = 21,
[Err_UnderFrequency] = 22,
/* Внутренние */
[Err_Internal_1] = 40, /* Просто ошибки */
[Err_Internal_2] = 41, [Err_LongStart] = 21,
[Err_Internal_3] = 42, [Err_Interlace] = 22,
[Err_Internal_4] = 43, [Err_OverTemperature] = 23,
[Err_Internal_5] = 44,
[Err_Internal_6] = 45,
/* Внутренние */
[Err_Internal_1] = 41,
[Err_Internal_2] = 42,
[Err_Internal_3] = 43,
[Err_Internal_4] = 44,
[Err_Internal_5] = 45,
[Err_Internal_6] = 46,
/* Если ток потерян и других ошибок нет - фаза потеряна */
[Err_LossPhaseAll] = 24,
[Err_LossPhaseA] = 25,
[Err_LossPhaseB] = 26,
[Err_LossPhaseC] = 27,
}; };

View File

@@ -94,20 +94,19 @@ int UPP_While(void)
upp.Timings.slow_calc_prd_us = BenchTime_Period(BT_SLOWCALC_PRD, angletim.Instance->CNT, HAL_MAX_DELAY)/ANGLE_TIM2_FREQ_MHZ; upp.Timings.slow_calc_prd_us = BenchTime_Period(BT_SLOWCALC_PRD, angletim.Instance->CNT, HAL_MAX_DELAY)/ANGLE_TIM2_FREQ_MHZ;
BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY); BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY);
res = HAL_IWDG_Refresh(&hiwdg); // если не вызываются медленные расчеты - что-то не то сбрасываемся по watchdog res = HAL_IWDG_Refresh(&hiwdg); // если не вызываются медленные расчеты - что-то не то сбрасываемся по watchdog
int razgon_done = (fabsf(upp.hangle.Iref - u2f(PARAM_PUI->Iref, 100)) < 0.1);
// Медленные расчеты // Медленные расчеты
PowerMonitor_SlowCalc(&upp.pm); PowerMonitor_SlowCalc(&upp.pm);
// Защиты // Защиты по току включаем только после разгона и в режиме работы
PowerMonitor_Protect(&upp.pm, upp.hangle.f.RazgonDone /*&& (upp.workmode == UPP_Work)*/);
#ifdef UPP_SIMULATE_I // симулируем токи #ifdef UPP_SIMULATE_I // симулируем токи
upp.pm.measured.final.Iamp = upp.hangle.Iref/2; upp.pm.measured.final.Iamp = upp.hangle.Iref/2;
// При симуляции тока не включаем его проверку // При симуляции тока не включаем его проверку
razgon_done = 0; razgon_done = 0;
#endif #endif
// Защиты // Определенные защиты по току включаем только после разгона
PowerMonitor_Protect(&upp.pm, razgon_done);
// Обрабока ошибок и выставление итоговой Ошибки // Обрабока ошибок и выставление итоговой Ошибки
UPP_Errors_Handle(); UPP_Errors_Handle();
// Контроль парамеров // Контроль парамеров
@@ -282,7 +281,6 @@ void UPP_ADC_Handle(void)
upp.pm.f.inIsr = 1; upp.pm.f.inIsr = 1;
PowerMonitor_FastCalc(&upp.pm); PowerMonitor_FastCalc(&upp.pm);
for(int phase = 0; phase < 3; phase++) for(int phase = 0; phase < 3; phase++)
{ {
@@ -297,8 +295,8 @@ void UPP_ADC_Handle(void)
UPP_HalfWave_t curr_halfwave = ZC_GetHalfWave(&upp.pm.zc, phase); UPP_HalfWave_t curr_halfwave = ZC_GetHalfWave(&upp.pm.zc, phase);
res = PWM_SetHalfWave(&upp.hpwm, phase, curr_halfwave); res = PWM_SetHalfWave(&upp.hpwm, phase, curr_halfwave);
// Начинаем отсчитывать угол // Начинаем отсчитывать угол
int voltage_halfwave_period = 1.0f/(upp.pm.measured.final.F[phase]*2)*1000; int voltage_halfwave_period_ms = 1.0f/(upp.pm.measured.final.F[phase]*2)*1000;
res = Angle_Start(&upp.hangle, phase, voltage_halfwave_period); res = Angle_Start(&upp.hangle, phase, voltage_halfwave_period_ms);
if(res != HAL_OK) if(res != HAL_OK)
__NOP(); __NOP();
} }
@@ -306,7 +304,8 @@ void UPP_ADC_Handle(void)
} }
// ШИМим ключи // ШИМим ключи
res = PWM_Handle(&upp.hpwm, 10); int voltage_halfwave_period_ms_mean = 1.0f/(upp.pm.measured.final.Fmean*2)*1000;
res = PWM_Handle(&upp.hpwm, voltage_halfwave_period_ms_mean);
upp.Timings.isr_adc_us = BenchTime_End(BT_ADC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; upp.Timings.isr_adc_us = BenchTime_End(BT_ADC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ;
upp.pm.f.inIsr = 0; upp.pm.f.inIsr = 0;

View File

@@ -220,6 +220,7 @@ void UPP_Params_ControlInternal(void)
} }
PARAM_INTERNAL->pm.lImaxAmp = ((u2f(PARAM_PUI->Imax, 100) * 50 / u2f(PARAM_INTERNAL->nominal.I, 10)) *1.41)*100; // Амплитудное значение Imax
// Обновление регулятора угла открытия // Обновление регулятора угла открытия
if(alpha_update) if(alpha_update)
{ {

View File

@@ -66,8 +66,9 @@ typedef struct
/* Параметры Мониторинга напряжения */ /* Параметры Мониторинга напряжения */
struct struct
{ {
uint16_t rms_window_size; ///< Адрес 1030: Размер окна для RMS uint16_t lImaxAmp; ///< Адрес 1031: Амплитудное значение максимально допустимого тока (рассчитывается само)
uint16_t rms_exp_alpha; ///< Адрес 1031: Постоянная времени для сглаживания RMS uint16_t rms_window_size; ///< Адрес 1032: Размер окна для RMS
uint16_t rms_exp_alpha; ///< Адрес 1033: Постоянная времени для сглаживания RMS
}pm; }pm;
/* Параметры ШИМ */ /* Параметры ШИМ */

View File

@@ -335,24 +335,7 @@
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</Name> <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</Name>
</SetRegEntry> </SetRegEntry>
</TargetDriverDllRegistry> </TargetDriverDllRegistry>
<Breakpoint> <Breakpoint/>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>38</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134219914</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\Core\PowerMonitor\adc_tools.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\Debug_F417\../Core/PowerMonitor/adc_tools.c\38</Expression>
</Bp>
</Breakpoint>
<WatchWindow1> <WatchWindow1>
<Ww> <Ww>
<count>0</count> <count>0</count>
@@ -394,6 +377,11 @@
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>phase_table</ItemText> <ItemText>phase_table</ItemText>
</Ww> </Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>hbt,0x0A</ItemText>
</Ww>
</WatchWindow1> </WatchWindow1>
<Tracepoint> <Tracepoint>
<THDelay>0</THDelay> <THDelay>0</THDelay>

View File

@@ -1750,6 +1750,57 @@
<FileName>power_protect.c</FileName> <FileName>power_protect.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Core\PowerMonitor\power_protect.c</FilePath> <FilePath>..\Core\PowerMonitor\power_protect.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>
<File> <File>
<FileName>power_protect.h</FileName> <FileName>power_protect.h</FileName>