Проверены и оптимизирвоаны защиты
- в матлаб проверена отрабокта всех защит - добавлены быстрые защиты на КЗ, которые проверяются в прерывании АЦП - определены и проверены более менее приоритеты ошибок - в мтлаб добавлена симуляция MOE расширенных таймеров
This commit is contained in:
@@ -120,8 +120,19 @@ 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);
|
||||||
|
|
||||||
|
if ((TIMx == TIM1) || (TIMx == TIM8))
|
||||||
|
{
|
||||||
|
if (TIMx->BDTR & TIM_BDTR_MOE)
|
||||||
|
{
|
||||||
Write_OC_to_GPIO(TIMx, TIMS);
|
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 и симуляция для каждого канала */
|
||||||
void CC_PWM_Ch1_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
void CC_PWM_Ch1_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
||||||
|
|||||||
Binary file not shown.
@@ -100,6 +100,7 @@
|
|||||||
/* Время задержки перед выставлением ошибки */
|
/* Время задержки перед выставлением ошибки */
|
||||||
#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_CRITICAL_ERR 0.0f
|
||||||
#define ERRORS_DELAY_MS_DEFAULT 0.1f
|
#define ERRORS_DELAY_MS_DEFAULT 0.1f
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -216,6 +216,9 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
/* Запускаем медленную когда фильтры среднего зациклились */
|
/* Запускаем медленную когда фильтры среднего зациклились */
|
||||||
|
|||||||
@@ -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 Проверяет всякие другие защиты (частота, температура).
|
||||||
|
|||||||
@@ -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_ */
|
||||||
|
|||||||
@@ -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->f.RazgonDone = (fabsf(hangle->Iref - u2f(PARAM_PUI->Iref, 100)) < 0.1);;
|
||||||
|
|
||||||
|
|
||||||
hangle->Imeas = measurement;
|
hangle->Imeas = measurement;
|
||||||
|
|
||||||
/* Ошибка регулирования = уставка - измеренное */
|
/* Ошибка регулирования = уставка - измеренное */
|
||||||
float err = hangle->Iref - hangle->Imeas;
|
float err = hangle->Iref - hangle->Imeas;
|
||||||
|
|
||||||
@@ -116,6 +120,7 @@ void Angle_PID_Reset(Angle_Handle_t *hangle)
|
|||||||
|
|
||||||
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);
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ typedef struct
|
|||||||
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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -19,34 +19,38 @@ 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_LongStart] = 21,
|
||||||
|
[Err_Interlace] = 22,
|
||||||
|
[Err_OverTemperature] = 23,
|
||||||
|
|
||||||
/* Пограничные параметры */
|
|
||||||
[Err_UnderVoltage] = 20,
|
|
||||||
[Err_OverFrequency] = 21,
|
|
||||||
[Err_UnderFrequency] = 22,
|
|
||||||
|
|
||||||
/* Внутренние */
|
/* Внутренние */
|
||||||
[Err_Internal_1] = 40,
|
[Err_Internal_1] = 41,
|
||||||
[Err_Internal_2] = 41,
|
[Err_Internal_2] = 42,
|
||||||
[Err_Internal_3] = 42,
|
[Err_Internal_3] = 43,
|
||||||
[Err_Internal_4] = 43,
|
[Err_Internal_4] = 44,
|
||||||
[Err_Internal_5] = 44,
|
[Err_Internal_5] = 45,
|
||||||
[Err_Internal_6] = 45,
|
[Err_Internal_6] = 46,
|
||||||
|
|
||||||
|
/* Если ток потерян и других ошибок нет - фаза потеряна */
|
||||||
|
[Err_LossPhaseAll] = 24,
|
||||||
|
[Err_LossPhaseA] = 25,
|
||||||
|
[Err_LossPhaseB] = 26,
|
||||||
|
[Err_LossPhaseC] = 27,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -95,19 +95,18 @@ int UPP_While(void)
|
|||||||
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();
|
||||||
// Контроль парамеров
|
// Контроль парамеров
|
||||||
@@ -283,7 +282,6 @@ void UPP_ADC_Handle(void)
|
|||||||
|
|
||||||
PowerMonitor_FastCalc(&upp.pm);
|
PowerMonitor_FastCalc(&upp.pm);
|
||||||
|
|
||||||
|
|
||||||
for(int phase = 0; phase < 3; phase++)
|
for(int phase = 0; phase < 3; phase++)
|
||||||
{
|
{
|
||||||
// Если произошел Zero Cross
|
// Если произошел Zero Cross
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
/* Параметры ШИМ */
|
/* Параметры ШИМ */
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user