Compare commits
2 Commits
b236975f9b
...
b887114510
| Author | SHA1 | Date | |
|---|---|---|---|
| b887114510 | |||
| e69eb0c8c9 |
@ -54,6 +54,33 @@ set code_PERIPH=.\MCU_STM32_Matlab\stm32_matlab_conf.c^
|
|||||||
.\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_matlab_gpio.c^
|
.\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_matlab_gpio.c^
|
||||||
.\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_matlab_dma.c^
|
.\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_matlab_dma.c^
|
||||||
.\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_periph_registers.c^
|
.\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_periph_registers.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\BasicMathFunctions\BasicMathFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\BasicMathFunctions\BasicMathFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\BayesFunctions\BayesFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\BayesFunctions\BayesFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\CommonTables\CommonTables.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\CommonTables\CommonTablesF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\ComplexMathFunctions\ComplexMathFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\ComplexMathFunctions\ComplexMathFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\ControllerFunctions\ControllerFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\DistanceFunctions\DistanceFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\FastMathFunctions\FastMathFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\FastMathFunctions\FastMathFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\FilteringFunctions\FilteringFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\FilteringFunctions\FilteringFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\InterpolationFunctions\InterpolationFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\InterpolationFunctions\InterpolationFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\MatrixFunctions\MatrixFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\MatrixFunctions\MatrixFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\QuaternionMathFunctions\QuaternionMathFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\StatisticsFunctions\StatisticsFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\StatisticsFunctions\StatisticsFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\SupportFunctions\SupportFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\SupportFunctions\SupportFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\SVMFunctions\SVMFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\SVMFunctions\SVMFunctionsF16.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\TransformFunctions\TransformFunctions.c^
|
||||||
|
.\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\TransformFunctions\TransformFunctionsF16.c^
|
||||||
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c^
|
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c^
|
||||||
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c^
|
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c^
|
||||||
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c^
|
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c^
|
||||||
@ -75,7 +102,24 @@ set includes_PERIPH=-I".\MCU_STM32_Matlab\."^
|
|||||||
-I".\MCU_STM32_Matlab\Drivers\CMSIS"^
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS"^
|
||||||
-I".\MCU_STM32_Matlab\Drivers\CMSIS\Device\STM32F4xx"^
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\Device\STM32F4xx"^
|
||||||
-I".\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Inc"^
|
-I".\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Inc"^
|
||||||
-I".\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy"
|
-I".\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Include"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\PrivateInclude"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\BasicMathFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\BayesFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\CommonTables"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\ComplexMathFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\ControllerFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\DistanceFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\FastMathFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\FilteringFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\InterpolationFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\MatrixFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\QuaternionMathFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\StatisticsFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\SupportFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\SVMFunctions"^
|
||||||
|
-I".\MCU_STM32_Matlab\Drivers\CMSIS\DSP\Source\TransformFunctions"
|
||||||
:: PERIPH BAT END
|
:: PERIPH BAT END
|
||||||
::-------------------------------------------------------------------------
|
::-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#include "app_wrapper.h"
|
#include "app_wrapper.h"
|
||||||
|
|
||||||
float dbg[16];
|
float dbg[16];
|
||||||
|
extern float iref_dbg;
|
||||||
#define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0
|
#define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0
|
||||||
|
|
||||||
void Write_Thyristors(real_T* Buffer, int ind_port)
|
void Write_Thyristors(real_T* Buffer, int ind_port)
|
||||||
@ -33,7 +33,7 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port)
|
|||||||
int nn = 0;
|
int nn = 0;
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{ //0-2
|
{ //0-2
|
||||||
WriteOutputArray(upp.pm.measured.Ureal[i], ind_port, nn++);
|
WriteOutputArray(upp.pm.measured.fast.U[i], ind_port, nn++);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{ //3-5
|
{ //3-5
|
||||||
@ -41,20 +41,23 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port)
|
|||||||
}
|
}
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{ //6-8
|
{ //6-8
|
||||||
WriteOutputArray(upp.pm.measured.F[i], ind_port, nn++);
|
WriteOutputArray(upp.pm.measured.final.F[i], ind_port, nn++);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{ //9-11
|
{ //9-11
|
||||||
WriteOutputArray(upp.pm.measured.Ireal[i], ind_port, nn++);
|
WriteOutputArray(upp.pm.measured.fast.I[i], ind_port, nn++);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
{ //12-13
|
{ //12-13
|
||||||
WriteOutputArray(upp.pm.measured.T[i], ind_port, nn++);
|
WriteOutputArray(upp.pm.measured.final.T[i], ind_port, nn++);
|
||||||
}
|
}
|
||||||
{ //14-16
|
{ //14-19
|
||||||
WriteOutputArray(upp.pm.measured.U_mean, ind_port, nn++);
|
WriteOutputArray(upp.pm.measured.final.Uamp, ind_port, nn++);
|
||||||
WriteOutputArray(upp.pm.measured.I_mean, ind_port, nn++);
|
WriteOutputArray(upp.pm.measured.final.Iamp, ind_port, nn++);
|
||||||
WriteOutputArray(upp.pm.measured.F_mean, ind_port, nn++);
|
WriteOutputArray(upp.pm.measured.final.I[0], ind_port, nn++);
|
||||||
|
WriteOutputArray(upp.pm.measured.final.I[1], ind_port, nn++);
|
||||||
|
WriteOutputArray(upp.pm.measured.final.I[2], ind_port, nn++);
|
||||||
|
WriteOutputArray(upp.pm.measured.final.Fmean, ind_port, nn++);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -71,8 +74,14 @@ void app_readInputs(const real_T* Buffer) {
|
|||||||
ADC_Set_Channel_Value(ADC3, 8, ReadInputArray(0,4));
|
ADC_Set_Channel_Value(ADC3, 8, ReadInputArray(0,4));
|
||||||
ADC_Set_Channel_Value(ADC3, 10, ReadInputArray(0,5));
|
ADC_Set_Channel_Value(ADC3, 10, ReadInputArray(0,5));
|
||||||
|
|
||||||
alpha_dbg = ReadInputArray(1, 0);
|
iref_dbg = ReadInputArray(1, 0);
|
||||||
upp.call->go = ReadInputArray(1, 1);
|
upp.call->go = ReadInputArray(1, 1);
|
||||||
|
|
||||||
|
MB_INTERNAL.param.angle.Angle_Max = ReadInputArray(1, 2)*65535;
|
||||||
|
MB_INTERNAL.param.angle.Angle_Min = ReadInputArray(1, 3)*65535;
|
||||||
|
MB_INTERNAL.param.angle.PID_Kp = ReadInputArray(1, 4) * 10000;
|
||||||
|
MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(1, 5) * 10000;
|
||||||
|
MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(1, 6) * 10000;
|
||||||
// USER APP INPUT END
|
// USER APP INPUT END
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,20 +98,24 @@ void app_writeOutputBuffer(real_T* Buffer) {
|
|||||||
|
|
||||||
|
|
||||||
int nn = 0;
|
int nn = 0;
|
||||||
|
WriteOutputArray(iref_dbg, 2, nn++);
|
||||||
|
WriteOutputArray(upp.pm.measured.final.Iamp, 2, nn++);
|
||||||
|
WriteOutputArray(upp.hangle.alpha, 2, nn++);
|
||||||
//WriteOutputArray(upp.hangle.htim->Instance->CNT, 2, nn++);
|
//WriteOutputArray(upp.hangle.htim->Instance->CNT, 2, nn++);
|
||||||
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR1) - upp.hangle.htim->Instance->CNT, 2, nn++);
|
|
||||||
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR2) - upp.hangle.htim->Instance->CNT, 2, nn++);
|
//WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR1) - upp.hangle.htim->Instance->CNT, 2, nn++);
|
||||||
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR3) - upp.hangle.htim->Instance->CNT, 2, nn++);
|
//WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR2) - upp.hangle.htim->Instance->CNT, 2, nn++);
|
||||||
|
//WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR3) - upp.hangle.htim->Instance->CNT, 2, nn++);
|
||||||
|
|
||||||
//WriteOutputArray(dbg[0], 2, nn++);
|
//WriteOutputArray(dbg[0], 2, nn++);
|
||||||
//WriteOutputArray(dbg[1], 2, nn++);
|
//WriteOutputArray(dbg[1], 2, nn++);
|
||||||
//WriteOutputArray(dbg[2], 2, nn++);
|
//WriteOutputArray(dbg[2], 2, nn++);
|
||||||
|
|
||||||
WriteOutputArray(upp.hpwm.AllPhases[PHASE_A_POS].State, 2, nn++);
|
//WriteOutputArray(upp.hpwm.AllPhases[PHASE_A_POS].State, 2, nn++);
|
||||||
WriteOutputArray(upp.hpwm.AllPhases[PHASE_A_NEG].State, 2, nn++);
|
//WriteOutputArray(upp.hpwm.AllPhases[PHASE_A_NEG].State, 2, nn++);
|
||||||
WriteOutputArray(upp.hpwm.AllPhases[PHASE_B_POS].State, 2, nn++);
|
//WriteOutputArray(upp.hpwm.AllPhases[PHASE_B_POS].State, 2, nn++);
|
||||||
WriteOutputArray(upp.hpwm.AllPhases[PHASE_B_NEG].State, 2, nn++);
|
//WriteOutputArray(upp.hpwm.AllPhases[PHASE_B_NEG].State, 2, nn++);
|
||||||
WriteOutputArray(upp.hpwm.AllPhases[PHASE_C_POS].State, 2, nn++);
|
//WriteOutputArray(upp.hpwm.AllPhases[PHASE_C_POS].State, 2, nn++);
|
||||||
WriteOutputArray(upp.hpwm.AllPhases[PHASE_C_NEG].State, 2, nn++);
|
//WriteOutputArray(upp.hpwm.AllPhases[PHASE_C_NEG].State, 2, nn++);
|
||||||
// USER APP OUTPUT END
|
// USER APP OUTPUT END
|
||||||
}
|
}
|
||||||
Binary file not shown.
@ -1 +1 @@
|
|||||||
Subproject commit 9bff9ad44dd625819ef654e98ca351d5bc5568a9
|
Subproject commit 513f56fe7dbf0fa8e6a075c22e138c908a01d33f
|
||||||
@ -18,24 +18,32 @@
|
|||||||
#define assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized)
|
#define assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized)
|
||||||
|
|
||||||
/* Дефайны для индексов */
|
/* Дефайны для индексов */
|
||||||
|
/* Линейные напряжения */
|
||||||
#define U_BA 0
|
#define U_BA 0
|
||||||
#define U_AC 1
|
#define U_AC 1
|
||||||
#define U_BC 2
|
#define U_BC 2
|
||||||
|
/* Токи фаз */
|
||||||
#define I_C 0
|
#define I_C 0
|
||||||
#define I_A 1
|
#define I_A 1
|
||||||
#define I_B 2
|
#define I_B 2
|
||||||
|
/* Температуры */
|
||||||
#define TEMP_1 0
|
#define TEMP_1 0
|
||||||
#define TEMP_2 1
|
#define TEMP_2 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup UPP_DEFAULT_PARAMS Default params for external flash
|
* @addtogroup UPP_DEFAULT_PARAMS Default params for external flash
|
||||||
* @ingroup UPP_CONFIG
|
* @ingroup UPP_CONFIG
|
||||||
* @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке
|
* @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
/* Параметри мониторинга сети */
|
|
||||||
#define PM_EXP_ALPHA_COEF_DEFAULT 0.01
|
|
||||||
|
/* Номинальные параметры */
|
||||||
|
#define SETPOINT_TEMP_WARN 70
|
||||||
|
#define SETPOINT_TEMP_ERR 85
|
||||||
|
|
||||||
|
|
||||||
/* Номинальные параметры */
|
/* Номинальные параметры */
|
||||||
#define NOM_PHASE_NUMB 3
|
#define NOM_PHASE_NUMB 3
|
||||||
@ -58,6 +66,12 @@
|
|||||||
#define PUI_Tdelay_SECONDS_DEFAULT 30
|
#define PUI_Tdelay_SECONDS_DEFAULT 30
|
||||||
#define PUI_Interlace_EN_DEFAULT 5000
|
#define PUI_Interlace_EN_DEFAULT 5000
|
||||||
|
|
||||||
|
/* Дефолтное коливчество тиков для задержки выставления ошибки */
|
||||||
|
#define ERRORS_DELAY_TICKS_DEFAULT 10
|
||||||
|
|
||||||
|
/* Параметри мониторинга сети */
|
||||||
|
#define PM_EXP_ALPHA_COEF_DEFAULT 0.01
|
||||||
|
|
||||||
/* Параметры АЦП */
|
/* Параметры АЦП */
|
||||||
#define ADC_U_MAX_V_DEFAULT 1216.0
|
#define ADC_U_MAX_V_DEFAULT 1216.0
|
||||||
#define ADC_I_MAX_A_DEFAULT 53.0
|
#define ADC_I_MAX_A_DEFAULT 53.0
|
||||||
@ -66,7 +80,7 @@
|
|||||||
|
|
||||||
/* Параметры определения перехода через ноль */
|
/* Параметры определения перехода через ноль */
|
||||||
#define ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT 2.0
|
#define ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT 2.0
|
||||||
#define ZERO_CROSS_DEBOUNCE_10US_DEFAULT 2*100 // (2.5 * 100 = 2.5 мс)
|
#define ZERO_CROSS_DEBOUNCE_CNT_DEFAULT 2*100 // (2.5 * 100 = 2.5 мс)
|
||||||
|
|
||||||
/* Параметры ШИМ для тиристоров */
|
/* Параметры ШИМ для тиристоров */
|
||||||
#define PWM_THYR_FREQUENCY_HZ_DEFAULT 20000
|
#define PWM_THYR_FREQUENCY_HZ_DEFAULT 20000
|
||||||
@ -85,8 +99,9 @@
|
|||||||
*/
|
*/
|
||||||
/* Периоды вызова всякого */
|
/* Периоды вызова всякого */
|
||||||
#define PM_ADC_PERIOD_US 10 ///< Период опроса АЦП в мкс
|
#define PM_ADC_PERIOD_US 10 ///< Период опроса АЦП в мкс
|
||||||
#define PM_SLOW_PERIOD_10US 50 ///< Период обновление медленных расчетов в 10мкс
|
#define PM_SLOW_PERIOD_CNT 50 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
|
||||||
#define PM_TEMP_PERIOD_10US 5000 ///< Период обновление датчиков температуры в 10мкс
|
#define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT
|
||||||
|
|
||||||
|
|
||||||
/* Частоты таймеров в МГц*/
|
/* Частоты таймеров в МГц*/
|
||||||
#define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП
|
#define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП
|
||||||
|
|||||||
@ -59,6 +59,8 @@ typedef enum {
|
|||||||
Err_OverVoltage = 13, ///< Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
|
Err_OverVoltage = 13, ///< Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
|
||||||
Err_OverTemperature = 14, ///< Температура выше допустимой (плюс 85 °C)
|
Err_OverTemperature = 14, ///< Температура выше допустимой (плюс 85 °C)
|
||||||
Err_UnderVoltage = 15, ///< Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
|
Err_UnderVoltage = 15, ///< Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
|
||||||
|
Err_OverFrequency = 22, ///< Частота сети выше допустимой
|
||||||
|
Err_UnderFrequency = 23, ///< Частота сети ниже допустимой
|
||||||
|
|
||||||
/* Ошибки по обрывам фаз */
|
/* Ошибки по обрывам фаз */
|
||||||
Err_LossPhaseAll = 16, ///< Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t)
|
Err_LossPhaseAll = 16, ///< Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t)
|
||||||
@ -69,8 +71,6 @@ typedef enum {
|
|||||||
/* Другие ошибки */
|
/* Другие ошибки */
|
||||||
Err_LongStart = 20, ///< Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
|
Err_LongStart = 20, ///< Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
|
||||||
Err_Interlace = 21, ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
|
Err_Interlace = 21, ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
|
||||||
Err_OverFrequency = 22, ///< Частота сети выше допустимой
|
|
||||||
Err_UnderFrequency = 23, ///< Частота сети ниже допустимой
|
|
||||||
} UPP_ErrorType_t;
|
} UPP_ErrorType_t;
|
||||||
|
|
||||||
|
|
||||||
@ -148,6 +148,7 @@ typedef struct {
|
|||||||
* @brief Дефайны УПП которые используютяс исключительно внутри программы
|
* @brief Дефайны УПП которые используютяс исключительно внутри программы
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
#define PM_SLOW_PERIOD_US (PM_ADC_PERIOD_US*PM_SLOW_PERIOD_CNT)
|
||||||
#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000)
|
#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -178,6 +178,7 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
|
|||||||
|
|
||||||
if(Filter_isDataReady(&adc->filter[0]))
|
if(Filter_isDataReady(&adc->filter[0]))
|
||||||
adc->f.DataReady = 1;
|
adc->f.DataReady = 1;
|
||||||
|
|
||||||
return HAL_OK;
|
return HAL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,7 +218,7 @@ void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Накопление для Avg/RMS
|
// Накопление для Avg/RMS
|
||||||
stat->Sum += ABS(value);
|
stat->Sum += fabsf(value);
|
||||||
stat->SumSquares += value * value;
|
stat->SumSquares += value * value;
|
||||||
stat->SampleCount++;
|
stat->SampleCount++;
|
||||||
|
|
||||||
|
|||||||
83
UPP/Core/PowerMonitor/phases_transform.c
Normal file
83
UPP/Core/PowerMonitor/phases_transform.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file phases_transform.c
|
||||||
|
* @brief Функции для преобразования напряжений/токов в многофазных системах
|
||||||
|
******************************************************************************
|
||||||
|
* @details
|
||||||
|
******************************************************************************/
|
||||||
|
#include "phases_transform.h"
|
||||||
|
#define SQRT3 1.7320508
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Рассчитать результирующий вектор трехфазной системы по фазным величинам.
|
||||||
|
* @return Длина вектора (модуль).
|
||||||
|
*/
|
||||||
|
float vector_abs_phase_calc(float phase1, float phase2)
|
||||||
|
{
|
||||||
|
/* Двухвазная система координат x-y */
|
||||||
|
float x = phase1;
|
||||||
|
float y = (-phase1 - 2*phase2)/SQRT3;
|
||||||
|
float V = 0;
|
||||||
|
arm_status res = arm_sqrt_f32(x*x + y*y, &V);
|
||||||
|
|
||||||
|
if(res == ARM_MATH_SUCCESS)
|
||||||
|
return V;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Рассчитать результирующий вектор трехфазной системы по линейным величинам.
|
||||||
|
* @return Длина вектора (модуль).
|
||||||
|
*/
|
||||||
|
float vector_abs_linear_calc(float phase1, float phase2)
|
||||||
|
{
|
||||||
|
/* Двухвазная система координат x-y */
|
||||||
|
float x = (phase1 - phase2)/SQRT3;
|
||||||
|
float y = -phase1 - phase2;
|
||||||
|
float V = 0;
|
||||||
|
arm_status res = arm_sqrt_f32(x*x + y*y, &V);
|
||||||
|
|
||||||
|
if(res == ARM_MATH_SUCCESS)
|
||||||
|
return V;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Рассчитать фазные напряжения из линейных (звезда)
|
||||||
|
* @param Ulin Линейные напряжения [Uba Uac Ubc]
|
||||||
|
* @param Uph Фазные напряжения [Ua Ub Uc]
|
||||||
|
*/
|
||||||
|
void linear_to_phase_star(float *Ulin, float *Uph)
|
||||||
|
{
|
||||||
|
if(Ulin == NULL || Uph == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Соответствие макросам: Ulin[0] = UBA, Ulin[1] = UAC, Ulin[2] = UBC
|
||||||
|
float Uba = Ulin[0];
|
||||||
|
float Uac = Ulin[1];
|
||||||
|
float Ubc = Ulin[2];
|
||||||
|
|
||||||
|
// Формулы для звезды (сумма фаз = 0)
|
||||||
|
Uph[0] = (Uba - Ubc)/3.0f; // Ua
|
||||||
|
Uph[1] = (Ubc - Uac)/3.0f; // Ub
|
||||||
|
Uph[2] = (Uac - Uba)/3.0f; // Uc
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Рассчитать фазные напряжения из линейных (треугольник)
|
||||||
|
* @param Ulin Линейные напряжения [Uba Uac Ubc]
|
||||||
|
* @param Uph Фазные напряжения [Ua Ub Uc]
|
||||||
|
*/
|
||||||
|
void linear_to_phase_delta(float *Ulin, float *Uph)
|
||||||
|
{
|
||||||
|
if(Ulin == NULL || Uph == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Соответствие макросам: Ulin[0] = UBA, Ulin[1] = UAC, Ulin[2] = UBC
|
||||||
|
// Для треугольника фазные напряжения равны линейным
|
||||||
|
Uph[0] = Ulin[0]; // Ua = Uba
|
||||||
|
Uph[1] = Ulin[2]; // Ub = Ubc
|
||||||
|
Uph[2] = Ulin[1]; // Uc = Uac
|
||||||
|
}
|
||||||
19
UPP/Core/PowerMonitor/phases_transform.h
Normal file
19
UPP/Core/PowerMonitor/phases_transform.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file phases_transform.h
|
||||||
|
* @brief Функции для преобразования напряжений/токов в многофазных системах
|
||||||
|
******************************************************************************
|
||||||
|
*****************************************************************************/
|
||||||
|
#ifndef _PHASES_TRANSFORM_H_
|
||||||
|
#define _PHASES_TRANSFORM_H_
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
/* Рассчитать результирующий вектор трехфазной системы по фазным величинам. */
|
||||||
|
float vector_abs_phase_calc(float phase1, float phase2);
|
||||||
|
/* Рассчитать результирующий вектор трехфазной системы по линейным величинам. */
|
||||||
|
float vector_abs_linear_calc(float phase1, float phase2);
|
||||||
|
/* Рассчитать фазные напряжения из линейных (звезда) */
|
||||||
|
void linear_to_phase_star(float *Ulin, float *UphUc);
|
||||||
|
/* Рассчитать фазные напряжения из линейных (треугольник) */
|
||||||
|
void linear_to_phase_delta(float *Ulin, float *Uph);
|
||||||
|
#endif /* _PHASES_TRANSFORM_H_ */
|
||||||
@ -6,10 +6,21 @@
|
|||||||
* @details
|
* @details
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
#include "power_monitor.h"
|
#include "power_monitor.h"
|
||||||
|
#include "power_protect.h"
|
||||||
|
#include "phases_transform.h"
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
#include "tim.h"
|
#include "tim.h"
|
||||||
|
|
||||||
|
#define U_BC_calc(_u1_, _u2_) (-((_u1_) + (_u2_)))
|
||||||
|
#define I_B_calc(_i1_, _i2_) (-((_i1_) + (_i2_)))
|
||||||
|
|
||||||
|
static void __SynchAvgFilters(PowerMonitor_t *hpm);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Инициализация мониторинга сети.
|
||||||
|
* @param hpm Указатель на структуру мониторинга сети
|
||||||
|
* @details Инициализирует: АЦП, Алгоритм перехода через ноль, Фильтры
|
||||||
|
*/
|
||||||
HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
|
HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
|
||||||
{
|
{
|
||||||
if(hpm == NULL)
|
if(hpm == NULL)
|
||||||
@ -22,31 +33,31 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
|
|||||||
/* Инициализация каналов АЦП */
|
/* Инициализация каналов АЦП */
|
||||||
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UBA,
|
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UBA,
|
||||||
MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_UBA],
|
MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_UBA],
|
||||||
MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UBA],
|
to_float(MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UBA], 10),
|
||||||
4095) != HAL_OK)
|
4095) != HAL_OK)
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UAC,
|
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UAC,
|
||||||
MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_UAC],
|
MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_UAC],
|
||||||
MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UAC],
|
to_float(MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_UAC], 10),
|
||||||
4095) != HAL_OK)
|
4095) != HAL_OK)
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IC,
|
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IC,
|
||||||
MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_IC],
|
MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_IC],
|
||||||
MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IC],
|
to_float(MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IC], 10),
|
||||||
4095) != HAL_OK)
|
4095) != HAL_OK)
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IA,
|
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IA,
|
||||||
MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_IA],
|
MB_INTERNAL.param.adc.ADC_Zero[ADC_CHANNEL_IA],
|
||||||
MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IA],
|
to_float(MB_INTERNAL.param.adc.ADC_Max[ADC_CHANNEL_IA], 10),
|
||||||
4095) != HAL_OK)
|
4095) != HAL_OK)
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
|
|
||||||
/* Инициализация алгоритма перехода через ноль */
|
/* Инициализация алгоритма перехода через ноль */
|
||||||
if(ZC_Init(&hpm->zc, 3, (float)MB_INTERNAL.param.zc.Hysteresis/100, MB_INTERNAL.param.zc.DebouneCouner) != HAL_OK)
|
if(ZC_Init(&hpm->zc, 3, to_float(MB_INTERNAL.param.zc.Hysteresis, 100), MB_INTERNAL.param.zc.DebouneCouner) != HAL_OK)
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
/* Инициализация каналов алгоритма перехода через ноль */
|
/* Инициализация каналов алгоритма перехода через ноль */
|
||||||
@ -59,33 +70,38 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
|
|||||||
|
|
||||||
|
|
||||||
/* Инициализация экпоненциального фильтра медленного алга */
|
/* Инициализация экпоненциального фильтра медленного алга */
|
||||||
for(int i = 0; i < 3; i++)
|
for(int i = 0; i < EXP_ALL; i++)
|
||||||
{
|
{
|
||||||
if(FilterExp_Init(&hpm->measured.exp[i], (float)MB_INTERNAL.param.pm.mean_alpha/65535))
|
if(FilterExp_Init(&hpm->exp[i], to_float(MB_INTERNAL.param.pm.mean_alpha,65535)))
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
Filter_Start(&hpm->measured.exp[i]);
|
Filter_Start(&hpm->exp[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Инициализация среднего фильтра медленного алга */
|
/* Инициализация среднего фильтра медленного алга */
|
||||||
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
|
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
|
||||||
{
|
{
|
||||||
if(FilterAverage_Init(&hpm->measured.avg[i], PM_SLOW_PERIOD_10US, FILTER_MODE_DEFAULT))
|
if(FilterAverage_Init(&hpm->avg[i], PM_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT))
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
Filter_Start(&hpm->measured.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->measured.avg[ADC_TEMP_CHANNELS_START+i], PM_TEMP_PERIOD_10US, FILTER_MODE_DEFAULT))
|
if(FilterAverage_Init(&hpm->avg[ADC_TEMP_CHANNELS_START+i], PM_TEMP_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT))
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
|
|
||||||
Filter_Start(&hpm->measured.avg[ADC_TEMP_CHANNELS_START+i]);
|
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return HAL_OK;
|
return HAL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Запустить мониторинг сети.
|
||||||
|
* @param hpm Указатель на структуру мониторинга сети
|
||||||
|
* @details Запускает АЦП с периодом @ref PM_ADC_PERIOD_US
|
||||||
|
*/
|
||||||
HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm)
|
HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm)
|
||||||
{
|
{
|
||||||
if(hpm == NULL)
|
if(hpm == NULL)
|
||||||
@ -98,81 +114,109 @@ HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PowerMonitor_SlowHandle(PowerMonitor_t *hpm)
|
/**
|
||||||
|
* @brief Медленные расчеты АЦП.
|
||||||
|
* @param hpm Указатель на структуру мониторинга сети
|
||||||
|
* @details Вызывается в main после накопления @ref PM_SLOW_PERIOD_CNT выборок АЦП.
|
||||||
|
* Делаются всякие расчеты для более подробного мониторинга сети и защит.
|
||||||
|
* Сам АЦП считывается в @ref PowerMonitor_FastCalc
|
||||||
|
*/
|
||||||
|
void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
|
||||||
{
|
{
|
||||||
if(hpm == NULL)
|
if(hpm == NULL)
|
||||||
return;
|
return;
|
||||||
if(!hpm->f.runSlow)
|
|
||||||
return;
|
|
||||||
hpm->f.runSlow = 0;
|
|
||||||
PowerMonitor_Measured_t *meas = &hpm->measured;
|
PowerMonitor_Measured_t *meas = &hpm->measured;
|
||||||
|
|
||||||
meas->Uslow[U_BC] = -meas->Uslow[U_BA] - meas->Uslow[U_AC];
|
/* Обработка температур */
|
||||||
meas->Islow[I_B] = -meas->Islow[I_A] - meas->Islow[I_C];
|
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);
|
||||||
|
|
||||||
float umean = 0;
|
/* Расчет третьей фазы */
|
||||||
float imean = 0;
|
meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_BA], meas->slow.U[U_AC]);
|
||||||
float fmean = 0;
|
meas->slow.I[I_B] = I_B_calc(meas->slow.I[I_A], meas->slow.I[I_C]);
|
||||||
|
|
||||||
|
/* Расчет всякого для трех фаз отдельно */
|
||||||
|
float fmean = 0; // средняя частота по трем фазам
|
||||||
|
float iphase_mean = 0; // средний ток каждой фазы
|
||||||
|
float uphase_mean = 0; // среднее напряжение каждой фазы
|
||||||
for(int i = 0; i < 3; i++)
|
for(int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
umean += ABS(meas->Uslow[i]);
|
/* Получение частоты фазы */
|
||||||
imean += ABS(meas->Islow[i]);
|
meas->final.F[i] = ZC_GetFrequency(&hpm->zc, i) / 2;
|
||||||
fmean += ABS(meas->F[i]);
|
fmean += meas->final.F[i];
|
||||||
}
|
|
||||||
umean /=3;
|
/* Средниее напряжение фазы */
|
||||||
imean /=3;
|
uphase_mean = fabsf(meas->slow.U[i]);
|
||||||
fmean /=3;
|
meas->final.U[i] = Filter_Process(&hpm->exp[EXP_UBA+i], uphase_mean);
|
||||||
|
|
||||||
|
/* Средний ток фазы */
|
||||||
|
iphase_mean = fabsf(meas->slow.I[i]);
|
||||||
|
meas->final.I[i] = Filter_Process(&hpm->exp[EXP_IC+i], iphase_mean);
|
||||||
|
}
|
||||||
|
/* Получение средней частоты по трем фазам */
|
||||||
|
|
||||||
|
meas->final.Fmean = fmean / 3;
|
||||||
|
|
||||||
|
|
||||||
|
/* Расчет амплитуд трехфазной сети */
|
||||||
|
float uamp = vector_abs_linear_calc(meas->slow.U[U_BA], meas->slow.U[U_AC]);
|
||||||
|
float iamp = vector_abs_phase_calc(meas->slow.I[I_A], meas->slow.I[I_C]);
|
||||||
|
meas->final.Uamp = Filter_Process(&hpm->exp[EXP_U], uamp);
|
||||||
|
meas->final.Iamp = Filter_Process(&hpm->exp[EXP_I], iamp);
|
||||||
|
|
||||||
meas->U_mean = Filter_Process(&meas->exp[0], umean);
|
|
||||||
meas->I_mean = Filter_Process(&meas->exp[1], imean);
|
|
||||||
meas->F_mean = Filter_Process(&meas->exp[2], fmean);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PowerMonitor_Handle(PowerMonitor_t *hpm)
|
/**
|
||||||
|
* @brief Считывание АЦП и быстрые расчеты.
|
||||||
|
* @param hpm Указатель на структуру мониторинга сети
|
||||||
|
* @details Вызывается в прерывании АЦП по получению данных.
|
||||||
|
* Далее данные считываются и делаются базовые преобразования
|
||||||
|
* Более подробные расчеты в @ref PowerMonitor_SlowCalc
|
||||||
|
*/
|
||||||
|
void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
|
||||||
{
|
{
|
||||||
if(hpm == NULL)
|
if(hpm == NULL)
|
||||||
return;
|
return;
|
||||||
/* Считываем АЦП */
|
/* Считываем АЦП с пересчетами и медианой фильтрацией от выбросов */
|
||||||
ADC_Handle(&hpm->adc);
|
ADC_Handle(&hpm->adc);
|
||||||
|
|
||||||
|
/* Заполняем величины Напряжений/Токов */
|
||||||
/* Заполняем величины */
|
|
||||||
PowerMonitor_Measured_t *meas = &hpm->measured;
|
PowerMonitor_Measured_t *meas = &hpm->measured;
|
||||||
meas->Ureal[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA];
|
meas->real.U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA];
|
||||||
meas->Ureal[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC];
|
meas->real.U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC];
|
||||||
meas->Ureal[U_BC] = -meas->Ureal[U_BA] - meas->Ureal[U_AC];
|
meas->real.U[U_BC] = U_BC_calc(meas->real.U[U_BA], meas->real.U[U_AC]);
|
||||||
meas->Ireal[I_C] = hpm->adc.Data[ADC_CHANNEL_IC];
|
|
||||||
meas->Ireal[I_A] = hpm->adc.Data[ADC_CHANNEL_IA];
|
meas->real.I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC];
|
||||||
meas->Ireal[I_B] = -meas->Ireal[I_A] - meas->Ireal[I_C];
|
meas->real.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA];
|
||||||
meas->T[TEMP_1] = hpm->adc.Data[ADC_CHANNEL_TEMP1];
|
meas->real.I[I_B] = I_B_calc(meas->real.I[I_A], meas->real.I[I_C]);
|
||||||
meas->T[TEMP_2] = hpm->adc.Data[ADC_CHANNEL_TEMP2];
|
|
||||||
|
|
||||||
/* Преобразуем в относительные единицы (о.е.) */
|
/* Преобразуем в относительные единицы (о.е.) */
|
||||||
for(int i = 0; i < 3; i++)
|
for(int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
meas->U[i] = 10*meas->Ureal[i]/MB_INTERNAL.param.nominal.U;
|
meas->fast.U[i] = 10*meas->real.U[i]/MB_INTERNAL.param.nominal.U;
|
||||||
meas->I[i] = 10*meas->Ireal[i]/MB_INTERNAL.param.nominal.I;
|
meas->fast.I[i] = 10*meas->real.I[i]/MB_INTERNAL.param.nominal.I;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ищем переход через ноль */
|
/* Ищем переход через ноль */
|
||||||
ZC_ProcessAllChannels(&hpm->zc, meas->U, usTick);
|
ZC_ProcessAllChannels(&hpm->zc, meas->fast.U, usTick);
|
||||||
for(int i = 0; i < 3; i++)
|
|
||||||
{
|
/* Вообще фильтры должны рабтоать синхронно, но на всякий синхронизация */
|
||||||
meas->F[i] = ZC_GetFrequency(&hpm->zc, i) / 2;
|
__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]);
|
||||||
|
|
||||||
/* Накопление Average для медленной фильтрации */
|
|
||||||
meas->Uslow[U_BA] = Filter_Process(&meas->avg[0], meas->U[U_BA]);
|
|
||||||
meas->Uslow[U_AC] = Filter_Process(&meas->avg[1], meas->U[U_AC]);
|
|
||||||
meas->Islow[I_C] = Filter_Process(&meas->avg[2], meas->I[I_C]);
|
|
||||||
meas->Islow[I_A] = Filter_Process(&meas->avg[3], meas->I[I_A]);
|
|
||||||
meas->T[TEMP_1] = Filter_Process(&meas->avg[4], meas->T[TEMP_1]);
|
|
||||||
meas->T[TEMP_2] = Filter_Process(&meas->avg[5], meas->T[TEMP_2]);
|
|
||||||
|
|
||||||
/* Запускаем медленную обработку через slow_period прерываний */
|
/* Запускаем медленную обработку через slow_period прерываний */
|
||||||
// if(hpm->isr_cnt == PM_SLOW_PERIOD_10US)
|
// if(hpm->isr_cnt == PM_SLOW_PERIOD_CNT)
|
||||||
/* Запускаем медленную когда фильтры среднего зациклились */
|
/* Запускаем медленную когда фильтры среднего зациклились */
|
||||||
if(Filter_isDataReady(&meas->avg[0]))
|
/* Берем 0 фильтр, просто так, потому что они все должны работать синхронно */
|
||||||
|
if(Filter_isDataReady(&hpm->avg[0]))
|
||||||
{
|
{
|
||||||
hpm->isr_cnt = 0;
|
hpm->isr_cnt = 0;
|
||||||
if(!hpm->f.runSlow)
|
if(!hpm->f.runSlow)
|
||||||
@ -190,3 +234,66 @@ void PowerMonitor_Handle(PowerMonitor_t *hpm)
|
|||||||
hpm->isr_cnt++;
|
hpm->isr_cnt++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Проверяет защиты питания и температур.
|
||||||
|
* @param measure Указатель на структуру с измеренными значениями
|
||||||
|
* @param Running Флаг:
|
||||||
|
* - 1 - УПП в работе,
|
||||||
|
* - 0 - УПП ожидает команды
|
||||||
|
* @return 1 - была обнаружена ощибка, 0 - все ок
|
||||||
|
*/
|
||||||
|
int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running)
|
||||||
|
{
|
||||||
|
if(hpm == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
PowerMonitor_Measured_t *measure = &hpm->measured;
|
||||||
|
UPP_PUI_Params_t *protect = &MB_DATA.HoldRegs.pui_params;
|
||||||
|
UPP_ParamsNominal_t *nominal = &MB_INTERNAL.param.nominal;
|
||||||
|
|
||||||
|
/*=============== ЗАЩИТЫ ПО НАПРЯЖЕНИЮ ==================*/
|
||||||
|
hpm->f.isU = Protect_Voltages(measure, protect, nominal);
|
||||||
|
|
||||||
|
/* Если УПП в работе */
|
||||||
|
if(Running)
|
||||||
|
{
|
||||||
|
/*=============== ЗАЩИТЫ ПО ТОКУ ==================*/
|
||||||
|
hpm->f.isI = Protect_Currents(measure, protect, nominal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============== ЗАЩИТЫ ВСЯКИЕ ДРУГИЕ ==================*/
|
||||||
|
Protect_Misc(measure, protect, nominal);
|
||||||
|
|
||||||
|
|
||||||
|
if(errors.prvt.f.all)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Синхронизация фильтров. Но вообще не должна никогда отрабатывать */
|
||||||
|
static void __SynchAvgFilters(PowerMonitor_t *hpm)
|
||||||
|
{
|
||||||
|
uint8_t counts_equal = 1;
|
||||||
|
uint32_t first_count = hpm->avg[0].count;
|
||||||
|
for (int i = 1; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
|
||||||
|
{
|
||||||
|
if (hpm->avg[i].count != first_count)
|
||||||
|
{
|
||||||
|
counts_equal = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!counts_equal)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
|
||||||
|
{
|
||||||
|
Filter_ReInit(&hpm->avg[i], hpm->avg[i].size, FILTER_MODE_DEFAULT);
|
||||||
|
Filter_Start(&hpm->avg[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -10,66 +10,98 @@
|
|||||||
#include "adc_tools.h"
|
#include "adc_tools.h"
|
||||||
#include "zero_cross.h"
|
#include "zero_cross.h"
|
||||||
|
|
||||||
|
/* Индексы экспоненциальных фильтров */
|
||||||
|
#define EXP_ALL 8
|
||||||
|
#define EXP_U 0
|
||||||
|
#define EXP_UBA 1
|
||||||
|
#define EXP_UAC 2
|
||||||
|
#define EXP_UBC 3
|
||||||
|
#define EXP_I 4
|
||||||
|
#define EXP_IC 5
|
||||||
|
#define EXP_IA 6
|
||||||
|
#define EXP_IB 7
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Флаги Мониторинга сети
|
||||||
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
unsigned runSlow:1; ///< Запустить медленный алгоритм в while(1)
|
unsigned runSlow:1; ///< Запустить медленный алгоритм в while(1)
|
||||||
|
|
||||||
unsigned isU:1; ///< Есть ли напряжение
|
unsigned isU:1; ///< Есть ли напряжение
|
||||||
unsigned isI:1; ///< Есть ли ток
|
unsigned isI:1; ///< Есть ли ток
|
||||||
|
|
||||||
unsigned protectUmax:1; ///< Отработка защиты по макс. напряжению
|
|
||||||
unsigned protectUmin:1; ///< Отработка защиты по мак с. напряжению
|
|
||||||
unsigned protectImax:1; ///< Отработка защиты по макс. току
|
|
||||||
unsigned protectImin:1; ///< Отработка защиты по мин. току
|
|
||||||
}PowerMonitor_Flags_t;
|
}PowerMonitor_Flags_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Измеренные и приведенные значения с АЦП
|
||||||
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float U_mean; ///< Среднее Напряжение по трем фазам
|
/** @brief Усредненные величины (о.е.) */
|
||||||
float I_mean; ///< Средний Ток по трем фазам
|
struct
|
||||||
float F_mean; ///< Средняя Частота по трем фазам
|
{
|
||||||
float Uslow[3]; ///< Напряжение от АЦП (в о.е.)
|
float Uamp; ///< Результирующий вектор Напряжения по трем фазам
|
||||||
float Islow[3]; ///< Ток от АЦП (в о.е.)
|
float Iamp; ///< Результирующий вектор Тока по трем фазам
|
||||||
|
float U[3]; ///< Среднее Наряжение по трем фазам
|
||||||
|
float I[3]; ///< Средний Ток по трем фазам
|
||||||
|
float Fmean; ///< Средняя Частота по трем фазам
|
||||||
|
float F[3]; ///< Частота от Zero Cross (обновляется в main)
|
||||||
|
float T[2]; ///< Температура (обновляется в main)
|
||||||
|
}final;
|
||||||
|
|
||||||
|
/** @brief Быстрые величины (в о.е.) - обновляются в каждом прерывании АЦП @ref PowerMonitor_FastCalc */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
float U[3]; ///< Напряжение
|
||||||
|
float I[3]; ///< Ток
|
||||||
|
}fast;
|
||||||
|
|
||||||
float U[3]; ///< Напряжение от АЦП (в о.е.)
|
/** @brief Медленные величины (в о.е.) - обновляются в main в @ref PowerMonitor_SlowCalc */
|
||||||
float I[3]; ///< Ток от АЦП (в о.е.)
|
struct
|
||||||
float F[3]; ///< Частота от Zero Cross
|
{
|
||||||
float T[2]; ///< Температура от АЦП
|
float U[3]; ///< Напряжение
|
||||||
|
float I[3]; ///< Ток
|
||||||
|
}slow;
|
||||||
|
|
||||||
|
/** @brief Реальные величины - обновляются кто где, и содержат значения в В/А */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
float U[3]; ///< Напряжение (обновляется в прерывании АЦП)
|
||||||
|
float I[3]; ///< Ток (обновляется в прерывании АЦП)
|
||||||
|
}real;
|
||||||
|
|
||||||
float Ureal[3]; ///< Напряжение от АЦП
|
|
||||||
float Ireal[3]; ///< Ток от АЦП
|
|
||||||
|
|
||||||
FilterExp_t exp[3]; ///< Фильтры для mean
|
|
||||||
FilterAverage_t avg[6]; ///< Фильтры для avg
|
|
||||||
}PowerMonitor_Measured_t;
|
}PowerMonitor_Measured_t;
|
||||||
|
|
||||||
typedef struct
|
/**
|
||||||
{
|
* @brief Структура для мониторинга сети
|
||||||
}PowerMonitor_Filters_t;
|
*/
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
ADC_Periodic_t adc; ///< Хендл периодического АЦП
|
ADC_Periodic_t adc; ///< Хендл периодического АЦП
|
||||||
ZeroCross_Handle_t zc; ///< Хендл перехода через ноль
|
ZeroCross_Handle_t zc; ///< Хендл перехода через ноль
|
||||||
PowerMonitor_Filters_t fltr;
|
|
||||||
PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины
|
PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины
|
||||||
|
|
||||||
|
FilterExp_t exp[EXP_ALL]; ///< Фильтры для сглаживания мговенного значения Напряжения/Токов
|
||||||
|
FilterAverage_t avg[ADC_NUMB_OF_CHANNELS]; ///< Фильтры для сглаживания медленных величин АЦП
|
||||||
|
|
||||||
PowerMonitor_Flags_t f; ///< Флаги мониторинга
|
PowerMonitor_Flags_t f; ///< Флаги мониторинга
|
||||||
|
|
||||||
|
|
||||||
uint32_t slow_period;
|
|
||||||
uint32_t isr_cnt;
|
uint32_t isr_cnt;
|
||||||
}PowerMonitor_t;
|
}PowerMonitor_t;
|
||||||
extern PowerMonitor_t pm;
|
extern PowerMonitor_t pm;
|
||||||
|
|
||||||
|
/* Инициализация мониторинга сети */
|
||||||
HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm);
|
HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm);
|
||||||
|
/* Запустить мониторинг сети */
|
||||||
HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm);
|
HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm);
|
||||||
|
|
||||||
void PowerMonitor_SlowHandle(PowerMonitor_t *hpm);
|
/* Медленные расчеты АЦП */
|
||||||
void PowerMonitor_Handle(PowerMonitor_t *hpm);
|
void PowerMonitor_SlowCalc(PowerMonitor_t *hpm);
|
||||||
|
/* Считывание АЦП и быстрые расчеты */
|
||||||
|
void PowerMonitor_FastCalc(PowerMonitor_t *hpm);
|
||||||
|
/* Проверяет защиты питания и температур */
|
||||||
|
int PowerMonitor_Protect(PowerMonitor_t *hpm, uint8_t Running);
|
||||||
|
|
||||||
#endif /* _POWER_MONITOR_H_ */
|
#endif /* _POWER_MONITOR_H_ */
|
||||||
|
|||||||
203
UPP/Core/PowerMonitor/power_protect.c
Normal file
203
UPP/Core/PowerMonitor/power_protect.c
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file power_protect.c
|
||||||
|
* @brief Модуль реализующий защиты по Напряжению/Токам/Температуре
|
||||||
|
******************************************************************************
|
||||||
|
* @details
|
||||||
|
******************************************************************************/
|
||||||
|
#include "power_protect.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Проверяет защиты по напряжению.
|
||||||
|
* @note Заполняет флаги prvt ошибок (приватные).
|
||||||
|
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ
|
||||||
|
* @return 1 - напряжение есть, 0 - напряжения нет
|
||||||
|
*/
|
||||||
|
int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal)
|
||||||
|
{
|
||||||
|
/* Переводим уставки ПУИ в удобный вид */
|
||||||
|
float lUmin = to_float(protect->Umin, 100)/**to_float(nominal->U, 10)*/;
|
||||||
|
float lUmax = to_float(protect->Umax, 100)/**to_float(nominal->U, 10)*/;
|
||||||
|
float lPhaseSequence = to_float(nominal->PhaseSequence, 100);
|
||||||
|
|
||||||
|
/* Общее напряжение */
|
||||||
|
if(measure->final.Uamp > lUmax)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.uamp_max = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.Uamp < lUmin)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.uamp_min = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.uamp_max = 0;
|
||||||
|
errors.prvt.f.err.uamp_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Последовательность фаз */
|
||||||
|
int realPhaseSequence = 0;
|
||||||
|
if(realPhaseSequence != lPhaseSequence)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.interlance = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.interlance = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (errors.prvt.f.err.uamp_min == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Проверяет защиты по току.
|
||||||
|
* @note Заполняет флаги prvt ошибок (приватные).
|
||||||
|
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ
|
||||||
|
*/
|
||||||
|
int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal)
|
||||||
|
{
|
||||||
|
/* Переводим уставки ПУИ в удобный вид */
|
||||||
|
float lIref = to_float(protect->Iref, 100)/**to_float(nominal->I, 10)*/;
|
||||||
|
float lImax = to_float(protect->Imax, 100)/**to_float(nominal->I, 10)*/;
|
||||||
|
float lImin = to_float(protect->Imin, 100)/**to_float(nominal->I, 10)*/;
|
||||||
|
|
||||||
|
/* Общий ток */
|
||||||
|
if(measure->final.Iamp > lImax)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.iamp_max = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.Iamp < lImin)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.iamp_min = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.iamp_max = 0;
|
||||||
|
errors.prvt.f.err.iamp_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ток по фазам */
|
||||||
|
if(measure->final.I[I_A] > lImax)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ia_max = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.I[I_A] < lImin)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ia_min = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ia_max = 0;
|
||||||
|
errors.prvt.f.err.ia_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(measure->final.I[I_B] > lImax)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ib_max = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.I[I_B] < lImin)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ib_min = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ib_max = 0;
|
||||||
|
errors.prvt.f.err.ib_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(measure->final.I[I_C] > lImax)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ic_max = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.I[I_C] < lImin)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ic_min = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.ic_max = 0;
|
||||||
|
errors.prvt.f.err.ic_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (errors.prvt.f.err.iamp_min == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Проверяет всякие другие защиты (частота, температура).
|
||||||
|
* @note Заполняет флаги prvt ошибок (приватные).
|
||||||
|
* Потом в @ref UPP_ErrorsHandle исходя из них заполняются ошибки для ПУИ
|
||||||
|
*/
|
||||||
|
void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal)
|
||||||
|
{
|
||||||
|
/* Переводим внутренние уставки в удобный вид */
|
||||||
|
float lFnom = to_float(MB_INTERNAL.param.nominal.F, 100);
|
||||||
|
float lFmin = lFnom - lFnom*to_float(MB_INTERNAL.param.nominal.F_deviation_minus, 100);
|
||||||
|
float lFmax = lFnom + lFnom*to_float(MB_INTERNAL.param.nominal.F_deviation_plus, 100);
|
||||||
|
|
||||||
|
float lTwarn = to_float(MB_INTERNAL.param.setpoints.TemperatureWarn, 100);
|
||||||
|
float lTerr = to_float(MB_INTERNAL.param.setpoints.TemperatureWarn, 100);
|
||||||
|
|
||||||
|
|
||||||
|
/*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/
|
||||||
|
if(measure->final.F[U_AC] > lFmax)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fac_max = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.F[U_AC] < lFmin)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fac_min = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fac_max = 0;
|
||||||
|
errors.prvt.f.err.fac_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(measure->final.F[U_BA] > lFmax)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fba_max = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.F[U_BA] < lFmin)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fba_min = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fba_max = 0;
|
||||||
|
errors.prvt.f.err.fba_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(measure->final.F[U_BC] > lFmax)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fbc_max = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.F[U_BC] < lFmin)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fbc_min = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.fbc_max = 0;
|
||||||
|
errors.prvt.f.err.fbc_min = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*=============== ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ==================*/
|
||||||
|
if(measure->final.T[TEMP_1] > lTerr)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.temp_err = 1;
|
||||||
|
}
|
||||||
|
else if (measure->final.T[TEMP_1] > lTwarn)
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.temp_warn = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.prvt.f.err.temp_err = 0;
|
||||||
|
errors.prvt.f.err.temp_warn = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
18
UPP/Core/PowerMonitor/power_protect.h
Normal file
18
UPP/Core/PowerMonitor/power_protect.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file power_monitor.h
|
||||||
|
* @brief Модуль реализующий защиты по Напряжению/Токам/Температуре
|
||||||
|
******************************************************************************
|
||||||
|
*****************************************************************************/
|
||||||
|
#ifndef _POWER_PROTECT_H_
|
||||||
|
#define _POWER_PROTECT_H_
|
||||||
|
#include "power_monitor.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Проверяет защиты по напряжению. */
|
||||||
|
int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal);
|
||||||
|
/* Проверяет защиты по току. */
|
||||||
|
int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal);
|
||||||
|
/* Проверяет всякие другие защиты (частота, температура). */
|
||||||
|
void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, UPP_ParamsNominal_t *nominal);
|
||||||
|
#endif /* _POWER_PROTECT_H_ */
|
||||||
@ -23,8 +23,6 @@
|
|||||||
/* Private includes ----------------------------------------------------------*/
|
/* Private includes ----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
#include "upp_main.h"
|
#include "upp_main.h"
|
||||||
#include "pwm_thyristors.h"
|
|
||||||
#include "angle_control.h"
|
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
|||||||
@ -21,19 +21,90 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle)
|
|||||||
|
|
||||||
hangle->htim = &angletim;
|
hangle->htim = &angletim;
|
||||||
|
|
||||||
|
// Инициализация ПИД
|
||||||
|
float kp = to_float(MB_INTERNAL.param.angle.PID_Kp, 10000);
|
||||||
|
float ki = to_float(MB_INTERNAL.param.angle.PID_Ki, 10000);
|
||||||
|
float kd = to_float(MB_INTERNAL.param.angle.PID_Kd, 10000);
|
||||||
|
Angle_PID_Init(hangle, kp, ki, kd);
|
||||||
|
|
||||||
|
// Инициализация каналов
|
||||||
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_1);
|
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_1);
|
||||||
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_2);
|
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_2);
|
||||||
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_3);
|
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_3);
|
||||||
|
|
||||||
|
// Сброс всех каналов
|
||||||
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);
|
||||||
|
|
||||||
|
|
||||||
|
// Инициализация углов
|
||||||
|
float angle_max = to_float(MB_INTERNAL.param.angle.Angle_Max, 65535);
|
||||||
|
float angle_min = to_float(MB_INTERNAL.param.angle.Angle_Min, 65535);
|
||||||
|
|
||||||
|
|
||||||
hangle->f.Initialized = 1;
|
hangle->f.Initialized = 1;
|
||||||
return HAL_OK;
|
return HAL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Управление углом через ПИД регулятор.
|
||||||
|
* @param hangle Указатель на таймер
|
||||||
|
* @param setpoint Уставка куда регулировать
|
||||||
|
* @param measurement Измеренные регулируемые величины
|
||||||
|
*/
|
||||||
|
void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement)
|
||||||
|
{
|
||||||
|
if(assert_upp(hangle))
|
||||||
|
return;
|
||||||
|
|
||||||
|
float err = setpoint - measurement;
|
||||||
|
|
||||||
|
/* Вычисляем выход PID */
|
||||||
|
float angle = arm_pid_f32(&hangle->pid, err); // делта подаём как ошибку
|
||||||
|
|
||||||
|
/* Ограничиваем диапазон и сохраняем в alpha */
|
||||||
|
if(angle > hangle->Config.AngleMax) angle = hangle->Config.AngleMax;
|
||||||
|
if(angle < hangle->Config.AngleMin) angle = hangle->Config.AngleMin;
|
||||||
|
|
||||||
|
Angle_SetAngle(hangle, angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Сброс ПИД регулятора.
|
||||||
|
* @param hangle Указатель на таймер
|
||||||
|
*/
|
||||||
|
void Angle_PID_Reset(Angle_Handle_t *hangle)
|
||||||
|
{
|
||||||
|
if(assert_upp(hangle))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Вычисляем выход PID */
|
||||||
|
arm_pid_reset_f32(&hangle->pid);
|
||||||
|
|
||||||
|
Angle_SetAngle(hangle, hangle->Config.AngleLimit);
|
||||||
|
Angle_Reset(hangle, UPP_PHASE_A);
|
||||||
|
Angle_Reset(hangle, UPP_PHASE_B);
|
||||||
|
Angle_Reset(hangle, UPP_PHASE_C);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Инициализация ПИД регулятора.
|
||||||
|
* @param hangle Указатель на таймер
|
||||||
|
* @param kp, ki kd Коэффициенты регулятора
|
||||||
|
*/
|
||||||
|
void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd)
|
||||||
|
{
|
||||||
|
if(assert_upp(hangle))
|
||||||
|
return;
|
||||||
|
|
||||||
|
hangle->pid.Kp = kp;
|
||||||
|
hangle->pid.Ki = ki;
|
||||||
|
hangle->pid.Kd = kd;
|
||||||
|
arm_pid_init_f32(&hangle->pid, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Инициализация углов открытия.
|
* @brief Инициализация углов открытия.
|
||||||
* @param hangle Указатель на таймер
|
* @param hangle Указатель на таймер
|
||||||
@ -67,6 +138,28 @@ HAL_StatusTypeDef Angle_SetRange(Angle_Handle_t *hangle, float AngleMin, float A
|
|||||||
return HAL_OK;
|
return HAL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Выставление текущего угла открытия тиристоров.
|
||||||
|
* @param hangle Указатель на таймер
|
||||||
|
* @param AngleLimit Лимит AngleMax, рассчитывается от параметров ШИМ
|
||||||
|
* @param AngleMin Минимально возможный угол открытия
|
||||||
|
* @param AngleMax Максимально возможный угол открытия
|
||||||
|
* @return HAL Status.
|
||||||
|
*/
|
||||||
|
HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float Angle)
|
||||||
|
{
|
||||||
|
if(assert_upp(hangle))
|
||||||
|
return HAL_ERROR;
|
||||||
|
|
||||||
|
if(Angle > hangle->Config.AngleLimit)
|
||||||
|
Angle = hangle->Config.AngleLimit;
|
||||||
|
|
||||||
|
hangle->alpha = Angle;
|
||||||
|
|
||||||
|
return HAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Инициализация предельного угла открытия.
|
* @brief Инициализация предельного угла открытия.
|
||||||
* @param hangle Указатель на таймер
|
* @param hangle Указатель на таймер
|
||||||
@ -129,7 +222,7 @@ UPP_Phase_t Angle_Handle(Angle_Handle_t *hangle)
|
|||||||
* @param Phase Для какой фазы надо установить угол открытия
|
* @param Phase Для какой фазы надо установить угол открытия
|
||||||
* @return HAL Status.
|
* @return HAL Status.
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float Angle, float PeriodMs)
|
HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float PeriodMs)
|
||||||
{
|
{
|
||||||
if(assert_upp(hangle))
|
if(assert_upp(hangle))
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
@ -139,16 +232,16 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float A
|
|||||||
{
|
{
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
}
|
}
|
||||||
if(Angle > hangle->Config.AngleMax)
|
if(hangle->alpha > hangle->Config.AngleMax)
|
||||||
{
|
{
|
||||||
Angle = hangle->Config.AngleMax;
|
hangle->alpha = hangle->Config.AngleMax;
|
||||||
}
|
}
|
||||||
if(Angle < hangle->Config.AngleMin)
|
if(hangle->alpha < hangle->Config.AngleMin)
|
||||||
{
|
{
|
||||||
Angle = hangle->Config.AngleMin;
|
hangle->alpha = hangle->Config.AngleMin;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t timer_ticks = TIM_MillisToTick(PeriodMs*Angle, ANGLE_TIM2_FREQ_MHZ);
|
uint32_t timer_ticks = TIM_MillisToTick(PeriodMs*hangle->alpha, ANGLE_TIM2_FREQ_MHZ);
|
||||||
uint32_t ccr_ticks = __HAL_TIM_GET_COUNTER(hangle->htim) + timer_ticks;
|
uint32_t ccr_ticks = __HAL_TIM_GET_COUNTER(hangle->htim) + timer_ticks;
|
||||||
|
|
||||||
switch(Phase)
|
switch(Phase)
|
||||||
|
|||||||
@ -8,6 +8,9 @@
|
|||||||
#define _ANGLE_CONTROL_H_
|
#define _ANGLE_CONTROL_H_
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Конфигурация алгоритма управления углом открытия
|
||||||
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float AngleLimit; ///< Лимит AngleMax, рассчитывается от параметров ШИМ
|
float AngleLimit; ///< Лимит AngleMax, рассчитывается от параметров ШИМ
|
||||||
@ -15,25 +18,39 @@ typedef struct
|
|||||||
float AngleMax; ///< Максимально возможный угол открытия
|
float AngleMax; ///< Максимально возможный угол открытия
|
||||||
}Angle_Config_t;
|
}Angle_Config_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Структура для управления углом открытия
|
||||||
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
TIM_HandleTypeDef *htim;
|
TIM_HandleTypeDef *htim; ///< Указатель на таймер для расчета угла
|
||||||
Angle_Config_t Config;
|
Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров
|
||||||
|
|
||||||
|
float alpha; ///< текущий угол открытия
|
||||||
|
arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
unsigned Initialized : 1;
|
unsigned Initialized : 1; ///< Структура инициализирована
|
||||||
unsigned Running : 3; ///< Сколько каналов запущено сейчас
|
unsigned Running : 3; ///< Сколько каналов запущено сейчас
|
||||||
} f;
|
} f; ///< Флаги
|
||||||
}Angle_Handle_t;
|
}Angle_Handle_t;
|
||||||
|
|
||||||
/* Инициализация Таймера для рассчета угла открытия. */
|
/* Инициализация Таймера для рассчета угла открытия. */
|
||||||
HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle);
|
HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle);
|
||||||
|
/* Управление углом через ПИД регулятор */
|
||||||
|
void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement);
|
||||||
|
/* Сброс ПИД регулятора. */
|
||||||
|
void Angle_PID_Reset(Angle_Handle_t *hangle);
|
||||||
|
/* Инициализация ПИД регулятора. */
|
||||||
|
void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd);
|
||||||
|
/* Выставление текущего угла открытия тиристоров. */
|
||||||
|
HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float Angle);
|
||||||
/* Инициализация углов открытия. */
|
/* Инициализация углов открытия. */
|
||||||
HAL_StatusTypeDef Angle_SetRange(Angle_Handle_t *hangle, float AngleMin, float AngleMax);
|
HAL_StatusTypeDef Angle_SetRange(Angle_Handle_t *hangle, float AngleMin, float AngleMax);
|
||||||
/* Инициализация предельного угла открытия. */
|
/* Инициализация предельного угла открытия. */
|
||||||
HAL_StatusTypeDef Angle_SetLimit(Angle_Handle_t *hangle, float AngleLimit);
|
HAL_StatusTypeDef Angle_SetLimit(Angle_Handle_t *hangle, float AngleLimit);
|
||||||
/* Установка угла открытия в таймер. */
|
/* Установка угла открытия в таймер. */
|
||||||
HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float Angle, float PeriodMs);
|
HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float PeriodMs);
|
||||||
/* Сброс угла открытия у таймера. */
|
/* Сброс угла открытия у таймера. */
|
||||||
HAL_StatusTypeDef Angle_Reset(Angle_Handle_t *hangle, UPP_Phase_t Phase);
|
HAL_StatusTypeDef Angle_Reset(Angle_Handle_t *hangle, UPP_Phase_t Phase);
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@
|
|||||||
* @details
|
* @details
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
#include "pwm_thyristors.h"
|
#include "pwm_thyristors.h"
|
||||||
#include "angle_control.h"
|
|
||||||
#include "tim.h"
|
#include "tim.h"
|
||||||
|
|
||||||
static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state);
|
static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state);
|
||||||
|
|||||||
@ -24,10 +24,17 @@ void UPP_Control_InternalParams(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// флаги обновились ли конфиги
|
// флаги обновились ли конфиги
|
||||||
|
static int alpha_update = 0;
|
||||||
static int adc_channel_update[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
static int adc_channel_update[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
||||||
static int zc_update = 0;
|
static int zc_update = 0;
|
||||||
static int pwm_update = 0;
|
static int pwm_update = 0;
|
||||||
|
|
||||||
|
// временная переменная для параметров Мониторинга сети
|
||||||
|
float angle_max = upp.hangle.Config.AngleMax;
|
||||||
|
float angle_min = upp.hangle.Config.AngleMin;
|
||||||
|
float angle_pid_kp = upp.hangle.pid.Kp;
|
||||||
|
float angle_pid_ki = upp.hangle.pid.Ki;
|
||||||
|
float angle_pid_kd = upp.hangle.pid.Kd;
|
||||||
// временная переменная для параметров каналов АЦП
|
// временная переменная для параметров каналов АЦП
|
||||||
float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
||||||
uint16_t adc_channel_zero[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
uint16_t adc_channel_zero[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
|
||||||
@ -39,9 +46,35 @@ void UPP_Control_InternalParams(void)
|
|||||||
uint16_t pwm_freq = upp.hpwm.Config.Frequency;
|
uint16_t pwm_freq = upp.hpwm.Config.Frequency;
|
||||||
uint8_t pwm_pulse_num = upp.hpwm.Config.PulseNumber;
|
uint8_t pwm_pulse_num = upp.hpwm.Config.PulseNumber;
|
||||||
// временная переменная для параметров Мониторинга сети
|
// временная переменная для параметров Мониторинга сети
|
||||||
float pm_alpha = upp.pm.measured.exp[0].alpha;
|
float pm_alpha = upp.pm.exp[0].alpha;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Параметры регулятора Угла открытия
|
||||||
|
if(__CheckSimpleParamF(&angle_max, MB_INTERNAL.param.angle.Angle_Max, 65535))
|
||||||
|
{
|
||||||
|
alpha_update = 1;
|
||||||
|
}
|
||||||
|
if(__CheckSimpleParamF(&angle_min, MB_INTERNAL.param.angle.Angle_Min, 65535))
|
||||||
|
{
|
||||||
|
alpha_update = 1;
|
||||||
|
}
|
||||||
|
if(__CheckSimpleParamF(&angle_pid_kp, MB_INTERNAL.param.angle.PID_Kp, 10000))
|
||||||
|
{
|
||||||
|
alpha_update = 1;
|
||||||
|
}
|
||||||
|
if(__CheckSimpleParamF(&angle_pid_ki, MB_INTERNAL.param.angle.PID_Ki, 10000))
|
||||||
|
{
|
||||||
|
alpha_update = 1;
|
||||||
|
}
|
||||||
|
if(__CheckSimpleParamF(&angle_pid_kd, MB_INTERNAL.param.angle.PID_Kd, 10000))
|
||||||
|
{
|
||||||
|
alpha_update = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Параметры АЦП
|
||||||
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
|
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
|
||||||
{
|
{
|
||||||
adc_channel_max[i] = upp.pm.adc.Coefs[i].vMax;
|
adc_channel_max[i] = upp.pm.adc.Coefs[i].vMax;
|
||||||
@ -85,14 +118,20 @@ void UPP_Control_InternalParams(void)
|
|||||||
// Параметры мониторинга
|
// Параметры мониторинга
|
||||||
if(__CheckSimpleParamF(&pm_alpha, MB_INTERNAL.param.pm.mean_alpha, 65535))
|
if(__CheckSimpleParamF(&pm_alpha, MB_INTERNAL.param.pm.mean_alpha, 65535))
|
||||||
{
|
{
|
||||||
for(int i = 0; i < 3; i++)
|
for(int i = 0; i < EXP_ALL; i++)
|
||||||
{
|
{
|
||||||
Filter_ReInit(&upp.pm.measured.exp[i], pm_alpha);
|
Filter_ReInit(&upp.pm.exp[i], pm_alpha);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Обновление регулятора угла открытия
|
||||||
|
if(alpha_update)
|
||||||
|
{
|
||||||
|
Angle_SetRange(&upp.hangle, angle_max, angle_max);
|
||||||
|
Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd);
|
||||||
|
}
|
||||||
// Обновление АЦП конфигов
|
// Обновление АЦП конфигов
|
||||||
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
|
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
|
||||||
{
|
{
|
||||||
@ -153,6 +192,9 @@ void UPP_SetDefault(int pui_default, int internal_default)
|
|||||||
|
|
||||||
if(internal_default)
|
if(internal_default)
|
||||||
{
|
{
|
||||||
|
MB_INTERNAL.param.setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10;
|
||||||
|
MB_INTERNAL.param.setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10;
|
||||||
|
|
||||||
MB_INTERNAL.param.nominal.PhaseNumber = NOM_PHASE_NUMB;
|
MB_INTERNAL.param.nominal.PhaseNumber = NOM_PHASE_NUMB;
|
||||||
MB_INTERNAL.param.nominal.U = NOM_U_V_DEFAULT*10;
|
MB_INTERNAL.param.nominal.U = NOM_U_V_DEFAULT*10;
|
||||||
MB_INTERNAL.param.nominal.U_deviation_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100;
|
MB_INTERNAL.param.nominal.U_deviation_plus = NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT*100;
|
||||||
@ -178,7 +220,7 @@ void UPP_SetDefault(int pui_default, int internal_default)
|
|||||||
MB_INTERNAL.param.pwm.PulseNumber = PWM_THYR_PULSE_NUMBER_DEFAULT;
|
MB_INTERNAL.param.pwm.PulseNumber = PWM_THYR_PULSE_NUMBER_DEFAULT;
|
||||||
|
|
||||||
MB_INTERNAL.param.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100;
|
MB_INTERNAL.param.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100;
|
||||||
MB_INTERNAL.param.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_10US_DEFAULT;
|
MB_INTERNAL.param.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT;
|
||||||
//__AngleSetLimit();
|
//__AngleSetLimit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,12 +10,14 @@
|
|||||||
#define _UPP_CONTROL_H
|
#define _UPP_CONTROL_H
|
||||||
#include "upp_defs.h"
|
#include "upp_defs.h"
|
||||||
|
|
||||||
|
#define to_float(_u16_, _coef_) ((float)_u16_/_coef_)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные
|
unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные
|
||||||
unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные
|
unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные
|
||||||
unsigned go:1; ///< Запустить УПП
|
unsigned go:1; ///< Запустить УПП
|
||||||
unsigned stop:1; ///< Выставить внутренние настройки в дефолтные
|
unsigned stop:1; ///< Остановка УПП (авария)
|
||||||
|
|
||||||
|
|
||||||
unsigned reserved:11;
|
unsigned reserved:11;
|
||||||
@ -23,53 +25,66 @@ typedef struct
|
|||||||
}UPP_FuncCalls_t;
|
}UPP_FuncCalls_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t PhaseSequence; ///< Последовательность фаз todo
|
||||||
|
uint16_t PhaseNumber; ///< [Количество]
|
||||||
|
uint16_t U; ///< [В x 10]
|
||||||
|
uint16_t U_deviation_plus; ///< [Проценты x 100]
|
||||||
|
uint16_t U_deviation_minus; ///< [Проценты x 100]
|
||||||
|
uint16_t F; ///< [Гц x 100]
|
||||||
|
uint16_t F_deviation_plus; ///< [Проценты x 100]
|
||||||
|
uint16_t F_deviation_minus; ///< [Проценты x 100]
|
||||||
|
uint16_t I; ///< [Амперы x 10]
|
||||||
|
}UPP_ParamsNominal_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t TemperatureWarn; ///< Предупредительный порог температуры [Градусы x 100]
|
||||||
|
uint16_t TemperatureErr; ///< Аварийный порог температуры [Градусы x 100]
|
||||||
|
}UPP_ParamsSetpoints_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint16_t mean_alpha; ///< Коэф альфа x10000 для эксп. фильтра Umean, Imean, Fmean
|
uint16_t mean_alpha; ///< Коэф альфа для усредняющего эксп. фильтра [0..1 x 65535]
|
||||||
}pm;
|
}pm;
|
||||||
|
|
||||||
struct
|
UPP_ParamsNominal_t nominal;
|
||||||
{
|
UPP_ParamsSetpoints_t setpoints;
|
||||||
uint16_t PhaseNumber; ///< Количество
|
|
||||||
uint16_t U; ///< В x 10
|
|
||||||
uint16_t U_deviation_plus; ///< Проценты x 100
|
|
||||||
uint16_t U_deviation_minus; ///< Проценты x 100
|
|
||||||
uint16_t F; ///< Гц x 100
|
|
||||||
uint16_t F_deviation_plus; ///< Проценты x 100
|
|
||||||
uint16_t F_deviation_minus; ///< Проценты x 100
|
|
||||||
uint16_t I; ///< Амперы x 10
|
|
||||||
}nominal;
|
|
||||||
|
|
||||||
/* Параметры АЦП */
|
/* Параметры АЦП */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint16_t ADC_Max[4]; ///< В x 10
|
uint16_t ADC_Max[4]; ///< Величина в единицах измерения при АЦП = 4095 [В или А x 10]
|
||||||
uint16_t ADC_Zero[4]; ///< Кванты АЦП
|
uint16_t ADC_Zero[4]; ///< Кванты АЦП когда на входе ноль
|
||||||
}adc;
|
}adc;
|
||||||
|
|
||||||
/* Параметры ШИМ */
|
/* Параметры ШИМ */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint16_t PhaseMask; ///< Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c
|
uint16_t PhaseMask; ///< Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c
|
||||||
uint16_t Frequency; ///< Частота ШИМ для пачки импульсов на тиристоры
|
uint16_t Frequency; ///< Частота ШИМ для пачки импульсов на тиристоры [Герцы]
|
||||||
uint16_t PulseNumber; ///< Количесво импульсов в пачке
|
uint16_t PulseNumber; ///< Количесво импульсов в пачке [Количество]
|
||||||
}pwm;
|
}pwm;
|
||||||
|
|
||||||
/* Параметры Угла */
|
/* Параметры Угла */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint16_t Hysteresis; ///< Гистерезис для определения перехода через ноль
|
uint16_t Hysteresis; ///< Гистерезис для определения перехода через ноль [Проценты x 100]
|
||||||
uint16_t DebouneCouner; ///< Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль
|
uint16_t DebouneCouner; ///< Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество]
|
||||||
}zc;
|
}zc;
|
||||||
|
|
||||||
/* Параметры Угла */
|
/* Параметры Угла */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint16_t Angle_Max; ///< Максимальный угол открытия тиристора
|
uint16_t Angle_Max; ///< Максимальный угол открытия тиристора [0..1 x 65535]
|
||||||
uint16_t Angle_Min; ///< Минимальный угол открытия тиристора
|
uint16_t Angle_Min; ///< Минимальный угол открытия тиристора [0..1 x 65535]
|
||||||
|
uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 1000]
|
||||||
|
uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 1000]
|
||||||
|
uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 1000]
|
||||||
}angle;
|
}angle;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,173 @@
|
|||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @file upp_errors.c
|
* @file upp_errors.c
|
||||||
* @brief Ошибки УПП и их обработка
|
* @brief Формирование ошибок в ПУИ
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @details
|
* @details
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
#include "upp_main.h" // УПП
|
||||||
#include "upp_errors.h" // всё остальное по работе с УПП
|
#include "upp_errors.h" // всё остальное по работе с УПП
|
||||||
UPP_Errors_t errors;
|
UPP_Errors_t errors;
|
||||||
|
|
||||||
|
static UPP_ErrorType_t UPP_SelectCommonError(void);
|
||||||
|
static int setError(int condition, int flag, int *timer, int delay);
|
||||||
|
void UPP_Errors_Program(void);
|
||||||
|
void UPP_Errors_Power(void);
|
||||||
|
void UPP_Errors_Ranges(void);
|
||||||
|
void UPP_Errors_LossPhase(void);
|
||||||
|
void UPP_Errors_Other(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void UPP_Errors_Handle(void)
|
||||||
|
{
|
||||||
|
/*====== Программные ошибки ======*/
|
||||||
|
UPP_Errors_Program();
|
||||||
|
/*====== Ошибки питания плат ======*/
|
||||||
|
UPP_Errors_Power();
|
||||||
|
/*====== Ошибки выхода за допустимые пределы ======*/
|
||||||
|
UPP_Errors_Ranges();
|
||||||
|
/*====== Потери фазы ======*/
|
||||||
|
UPP_Errors_LossPhase();
|
||||||
|
/*====== Остальные ======*/
|
||||||
|
UPP_Errors_Other();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
errors.common = UPP_SelectCommonError();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPP_Errors_Program(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPP_Errors_Power(void)
|
||||||
|
{
|
||||||
|
//read discrete inputs
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPP_Errors_Ranges(void)
|
||||||
|
{
|
||||||
|
/* Преобразуем уставки в нормальные тики */
|
||||||
|
float ticksTiMax = to_float(MB_DATA.HoldRegs.pui_params.TiMax, 1)/PM_SLOW_PERIOD_US;
|
||||||
|
/* Счетчики для отсчитывания задержки выставления ошибки */
|
||||||
|
static int IMaxCnt = 0;
|
||||||
|
static int UMaxCnt = 0;
|
||||||
|
static int UMinCnt = 0;
|
||||||
|
static int FMaxCnt = 0;
|
||||||
|
static int FMinCnt = 0;
|
||||||
|
static int TMaxCnt = 0;
|
||||||
|
|
||||||
|
/* Напряжения */
|
||||||
|
errors.pui.err.OverVoltage = setError(errors.prvt.f.err.uamp_max,
|
||||||
|
errors.pui.err.OverVoltage,
|
||||||
|
&UMaxCnt,
|
||||||
|
ticksTiMax);
|
||||||
|
errors.pui.err.UnderVoltage = setError(errors.prvt.f.err.uamp_min,
|
||||||
|
errors.pui.err.UnderVoltage,
|
||||||
|
&UMinCnt,
|
||||||
|
ticksTiMax);
|
||||||
|
|
||||||
|
|
||||||
|
/* Токи */
|
||||||
|
int i_max = ( errors.prvt.f.err.iamp_max ||
|
||||||
|
errors.prvt.f.err.ia_max ||
|
||||||
|
errors.prvt.f.err.ib_max ||
|
||||||
|
errors.prvt.f.err.ic_max);
|
||||||
|
errors.pui.err.OverCurrent = setError(i_max,
|
||||||
|
errors.pui.err.OverCurrent,
|
||||||
|
&IMaxCnt,
|
||||||
|
ticksTiMax);
|
||||||
|
|
||||||
|
|
||||||
|
/* Частота */
|
||||||
|
int f_max = ( errors.prvt.f.err.fac_max ||
|
||||||
|
errors.prvt.f.err.fba_max ||
|
||||||
|
errors.prvt.f.err.fbc_max);
|
||||||
|
int f_min = ( errors.prvt.f.err.fac_max ||
|
||||||
|
errors.prvt.f.err.fba_max ||
|
||||||
|
errors.prvt.f.err.fbc_max);
|
||||||
|
errors.pui.err.OverFrequency = setError(f_max,
|
||||||
|
errors.pui.err.OverFrequency,
|
||||||
|
&FMaxCnt,
|
||||||
|
ERRORS_DELAY_TICKS_DEFAULT);
|
||||||
|
|
||||||
|
errors.pui.err.UnderFrequency = setError( f_min,
|
||||||
|
errors.pui.err.UnderFrequency,
|
||||||
|
&FMinCnt,
|
||||||
|
ERRORS_DELAY_TICKS_DEFAULT);
|
||||||
|
|
||||||
|
|
||||||
|
/* Температуры */
|
||||||
|
errors.pui.err.OverTemperature = setError(errors.prvt.f.err.temp_err,
|
||||||
|
errors.pui.err.OverTemperature,
|
||||||
|
&TMaxCnt,
|
||||||
|
ERRORS_DELAY_TICKS_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPP_Errors_LossPhase(void)
|
||||||
|
{
|
||||||
|
/* Счетчики для отсчитывания задержки выставления ошибки */
|
||||||
|
static int LossPhaseAllCnt = 0;
|
||||||
|
static int LossPhaseACnt = 0;
|
||||||
|
static int LossPhaseBCnt = 0;
|
||||||
|
static int LossPhaseCCnt = 0;
|
||||||
|
|
||||||
|
int loss_phases_all = ( errors.prvt.f.err.ia_min &&
|
||||||
|
errors.prvt.f.err.ib_min &&
|
||||||
|
errors.prvt.f.err.ic_min );
|
||||||
|
|
||||||
|
errors.pui.err.LossPhaseAll = setError( loss_phases_all,
|
||||||
|
errors.pui.err.LossPhaseAll,
|
||||||
|
&LossPhaseAllCnt,
|
||||||
|
ERRORS_DELAY_TICKS_DEFAULT);
|
||||||
|
|
||||||
|
/* Если хотя бы одна фаза есть проверяем фазы отдельно */
|
||||||
|
if(!errors.pui.err.LossPhaseAll)
|
||||||
|
{
|
||||||
|
errors.pui.err.LossPhaseA = setError( errors.prvt.f.err.ia_min,
|
||||||
|
errors.pui.err.LossPhaseA,
|
||||||
|
&LossPhaseACnt,
|
||||||
|
ERRORS_DELAY_TICKS_DEFAULT);
|
||||||
|
|
||||||
|
errors.pui.err.LossPhaseB = setError( errors.prvt.f.err.ib_min,
|
||||||
|
errors.pui.err.LossPhaseB,
|
||||||
|
&LossPhaseBCnt,
|
||||||
|
ERRORS_DELAY_TICKS_DEFAULT);
|
||||||
|
|
||||||
|
errors.pui.err.LossPhaseC = setError( errors.prvt.f.err.ic_min,
|
||||||
|
errors.pui.err.LossPhaseC,
|
||||||
|
&LossPhaseCCnt,
|
||||||
|
ERRORS_DELAY_TICKS_DEFAULT);
|
||||||
|
}
|
||||||
|
/* Если всех фаз нет, то отдельные не смотрим */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errors.pui.err.LossPhaseA = 0;
|
||||||
|
errors.pui.err.LossPhaseB = 0;
|
||||||
|
errors.pui.err.LossPhaseC = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UPP_Errors_Other(void)
|
||||||
|
{
|
||||||
|
static int InterlaceCnt = 0;
|
||||||
|
|
||||||
|
if(errors.prvt.f.err.longstart)
|
||||||
|
errors.pui.err.LongStart = 1;
|
||||||
|
else
|
||||||
|
errors.pui.err.LongStart = 0;
|
||||||
|
|
||||||
|
errors.pui.err.Interlace = setError(errors.prvt.f.err.interlance,
|
||||||
|
errors.pui.err.Interlace,
|
||||||
|
&InterlaceCnt,
|
||||||
|
ERRORS_DELAY_TICKS_DEFAULT);
|
||||||
|
//Interlance
|
||||||
|
}
|
||||||
|
|
||||||
static UPP_ErrorType_t UPP_SelectCommonError(void)
|
static UPP_ErrorType_t UPP_SelectCommonError(void)
|
||||||
{
|
{
|
||||||
// Пока нет ошибки
|
// Пока нет ошибки
|
||||||
@ -38,7 +198,20 @@ static UPP_ErrorType_t UPP_SelectCommonError(void)
|
|||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPP_ErrorsHandle(void)
|
|
||||||
|
static int setError(int condition, int flag, int *timer, int delay)
|
||||||
{
|
{
|
||||||
errors.common = UPP_SelectCommonError();
|
if (condition) {
|
||||||
|
if (*timer < delay)
|
||||||
|
(*timer)++;
|
||||||
|
else
|
||||||
|
flag = 1;
|
||||||
|
} else {
|
||||||
|
if (*timer > 0)
|
||||||
|
(*timer)--;
|
||||||
|
else
|
||||||
|
flag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return flag;
|
||||||
}
|
}
|
||||||
@ -64,36 +64,37 @@ typedef struct
|
|||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
/* Програмные ошибки */
|
/* Програмные ошибки */
|
||||||
unsigned Internal_1:1; ///< Внутренняя неисправность УПП 1
|
unsigned Internal_1:1; ///< Ошибка 1: Внутренняя неисправность УПП 1
|
||||||
unsigned Internal_2:1; ///< Внутренняя неисправность УПП 2
|
unsigned Internal_2:1; ///< Ошибка 2: Внутренняя неисправность УПП 2
|
||||||
unsigned Internal_3:1; ///< Внутренняя неисправность УПП 3
|
unsigned Internal_3:1; ///< Ошибка 3: Внутренняя неисправность УПП 3
|
||||||
unsigned Internal_4:1; ///< Внутренняя неисправность УПП 4
|
unsigned Internal_4:1; ///< Ошибка 4: Внутренняя неисправность УПП 4
|
||||||
unsigned Internal_5:1; ///< Внутренняя неисправность УПП 5
|
unsigned Internal_5:1; ///< Ошибка 5: Внутренняя неисправность УПП 5
|
||||||
unsigned Internal_6:1; ///< Внутренняя неисправность УПП 6
|
unsigned Internal_6:1; ///< Ошибка 6: Внутренняя неисправность УПП 6
|
||||||
|
|
||||||
/* Ошибки по питанию */
|
/* Ошибки по питанию */
|
||||||
unsigned Power_Digit_5V:1; ///< Неисправность цифрового источника питания (5 В)
|
unsigned Power_Digit_5V:1; ///< Ошибка 7: Неисправность цифрового источника питания (5 В)
|
||||||
unsigned Power_24V:1; ///< Неисправность источника питания 24 В
|
unsigned Power_24V:1; ///< Ошибка 8: Неисправность источника питания 24 В
|
||||||
unsigned Power_Analog_5V:1; ///< Неисправность аналогового источника питания микроконтроллера (± 5 В)
|
unsigned Power_Analog_5V:1; ///< Ошибка 9: Неисправность аналогового источника питания микроконтроллера (± 5 В)
|
||||||
unsigned Power_SCI_5V:1; ///< Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В)
|
unsigned Power_SCI_5V:1; ///< Ошибка 10: Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В)
|
||||||
unsigned Power_DIO_24V:1; ///< Неисправность источника питания дискретных входов/выходов (24 В)
|
unsigned Power_DIO_24V:1; ///< Ошибка 11: Неисправность источника питания дискретных входов/выходов (24 В)
|
||||||
|
|
||||||
/* Ошибки по допустимым пределам Наряжений/Токов/Температуры */
|
/* Ошибки по допустимым пределам Наряжений/Токов/Температуры */
|
||||||
unsigned OverCurrent:1; ///< Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t)
|
unsigned OverCurrent:1; ///< Ошибка 12: Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t)
|
||||||
unsigned OverVoltage:1; ///< Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
|
unsigned OverVoltage:1; ///< Ошибка 13: Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
|
||||||
unsigned OverTemperature:1; ///< Температура выше допустимой (плюс 85 °C)
|
unsigned OverTemperature:1; ///< Ошибка 14: Температура выше допустимой (плюс 85 °C)
|
||||||
unsigned UnderVoltage:1; ///< Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
|
unsigned UnderVoltage:1; ///< Ошибка 15: Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
|
||||||
|
|
||||||
/* Ошибки по обрывам фаз */
|
/* Ошибки по обрывам фаз */
|
||||||
unsigned LossPhaseA:1; ///< Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t)
|
unsigned LossPhaseAll:1; ///< Ошибка 16: Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t)
|
||||||
unsigned LossPhaseB:1; ///< Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t)
|
unsigned LossPhaseA:1; ///< Ошибка 17: Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t)
|
||||||
unsigned LossPhaseC:1; ///< Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t)
|
unsigned LossPhaseB:1; ///< Ошибка 18: Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t)
|
||||||
|
unsigned LossPhaseC:1; ///< Ошибка 19: Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t)
|
||||||
|
|
||||||
/* Другие ошибки */
|
/* Другие ошибки */
|
||||||
unsigned LongStart:1; ///< Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
|
unsigned LongStart:1; ///< Ошибка 20: Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
|
||||||
unsigned Interlace:1; ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
|
unsigned Interlace:1; ///< Ошибка 21: Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
|
||||||
unsigned OverFrequency:1; ///< Частота сети выше допустимой
|
unsigned OverFrequency:1; ///< Ошибка 22: Частота сети выше допустимой
|
||||||
unsigned UnderFrequency:1; ///< Частота сети ниже допустимой
|
unsigned UnderFrequency:1; ///< Ошибка 23: Частота сети ниже допустимой
|
||||||
}err;
|
}err;
|
||||||
}pui;
|
}pui;
|
||||||
|
|
||||||
@ -104,6 +105,39 @@ typedef struct
|
|||||||
uint64_t all;
|
uint64_t all;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
unsigned uamp_max:1;
|
||||||
|
unsigned uamp_min:1;
|
||||||
|
unsigned iamp_max:1;
|
||||||
|
unsigned iamp_min:1;
|
||||||
|
|
||||||
|
unsigned ic_max:1;
|
||||||
|
unsigned ic_min:1;
|
||||||
|
unsigned ib_max:1;
|
||||||
|
unsigned ib_min:1;
|
||||||
|
unsigned ia_max:1;
|
||||||
|
unsigned ia_min:1;
|
||||||
|
|
||||||
|
unsigned uba_max:1;
|
||||||
|
unsigned uba_min:1;
|
||||||
|
unsigned uac_max:1;
|
||||||
|
unsigned uac_min:1;
|
||||||
|
unsigned ubc_max:1;
|
||||||
|
unsigned ubc_min:1;
|
||||||
|
|
||||||
|
unsigned fba_max:1;
|
||||||
|
unsigned fba_min:1;
|
||||||
|
unsigned fac_max:1;
|
||||||
|
unsigned fac_min:1;
|
||||||
|
unsigned fbc_max:1;
|
||||||
|
unsigned fbc_min:1;
|
||||||
|
|
||||||
|
|
||||||
|
unsigned temp_warn:1;
|
||||||
|
unsigned temp_err:1;
|
||||||
|
|
||||||
|
unsigned longstart:1;
|
||||||
|
unsigned interlance:3;
|
||||||
|
|
||||||
unsigned slow_calc_overrun:1;
|
unsigned slow_calc_overrun:1;
|
||||||
}err;
|
}err;
|
||||||
}f;
|
}f;
|
||||||
@ -120,6 +154,6 @@ typedef struct
|
|||||||
}UPP_Errors_t;
|
}UPP_Errors_t;
|
||||||
extern UPP_Errors_t errors;
|
extern UPP_Errors_t errors;
|
||||||
|
|
||||||
void UPP_ErrorsHandle(void);
|
void UPP_Errors_Handle(void);
|
||||||
|
|
||||||
#endif //_UPP_ERRORS_H
|
#endif //_UPP_ERRORS_H
|
||||||
@ -9,7 +9,7 @@
|
|||||||
#include "tim.h"
|
#include "tim.h"
|
||||||
|
|
||||||
UPP_t upp;
|
UPP_t upp;
|
||||||
float alpha_dbg = 0.5;
|
float iref_dbg = 0;
|
||||||
// ОСНОВНОЙ ЦИКЛ main.c
|
// ОСНОВНОЙ ЦИКЛ main.c
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,17 +51,22 @@ int UPP_PreWhile(void)
|
|||||||
* @return 0 - если ОК, >1 если ошибка.
|
* @return 0 - если ОК, >1 если ошибка.
|
||||||
*/
|
*/
|
||||||
int UPP_While(void)
|
int UPP_While(void)
|
||||||
|
{
|
||||||
|
if(upp.pm.f.runSlow)
|
||||||
{
|
{
|
||||||
// если ошибка вызываем СТОП
|
// если ошибка вызываем СТОП
|
||||||
if(errors.pui.all)
|
if(errors.pui.all)
|
||||||
{
|
{
|
||||||
upp.call->stop = 1;
|
upp.call->stop = 0;
|
||||||
}
|
}
|
||||||
// иначе снимаем СТОП
|
// иначе снимаем СТОП
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
upp.call->stop = 0;
|
upp.call->stop = 0;
|
||||||
}
|
}
|
||||||
|
if (upp.call->stop)
|
||||||
|
upp.workmode = WM_Error;
|
||||||
|
|
||||||
// Сброс на дефолтные по запросу
|
// Сброс на дефолтные по запросу
|
||||||
if(upp.call->set_default_pui)
|
if(upp.call->set_default_pui)
|
||||||
{
|
{
|
||||||
@ -72,13 +77,10 @@ int UPP_While(void)
|
|||||||
UPP_SetDefault(0, 1);
|
UPP_SetDefault(0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PowerMonitor_SlowCalc(&upp.pm);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PowerMonitor_SlowHandle(&upp.pm);
|
|
||||||
// Если СТОП - переходим в ошибку
|
// Если СТОП - переходим в ошибку
|
||||||
if (upp.call->stop)
|
|
||||||
upp.workmode = WM_Error;
|
|
||||||
// Автомат состояний УПП
|
// Автомат состояний УПП
|
||||||
switch(upp.workmode)
|
switch(upp.workmode)
|
||||||
{
|
{
|
||||||
@ -87,6 +89,7 @@ int UPP_While(void)
|
|||||||
if (upp.call->go)
|
if (upp.call->go)
|
||||||
{
|
{
|
||||||
upp.workmode = WM_Running;
|
upp.workmode = WM_Running;
|
||||||
|
Angle_PID_Reset(&upp.hangle);
|
||||||
upp.StartTick = local_time();
|
upp.StartTick = local_time();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -96,6 +99,9 @@ int UPP_While(void)
|
|||||||
if (!upp.call->go)
|
if (!upp.call->go)
|
||||||
upp.workmode = WM_Ready;
|
upp.workmode = WM_Ready;
|
||||||
|
|
||||||
|
// Регулирование тиристоров
|
||||||
|
Angle_PID(&upp.hangle, iref_dbg, upp.pm.measured.final.Iamp);
|
||||||
|
|
||||||
// если слишком долгий запуск
|
// если слишком долгий запуск
|
||||||
if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000))
|
if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000))
|
||||||
{
|
{
|
||||||
@ -118,7 +124,12 @@ int UPP_While(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
upp.pm.f.runSlow = 0;
|
||||||
|
}//if(upp.pm.f.runSlow)
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +142,7 @@ void UPP_Tick(void)
|
|||||||
{
|
{
|
||||||
if(upp.workmode == WM_Not_Init)
|
if(upp.workmode == WM_Not_Init)
|
||||||
return;
|
return;
|
||||||
UPP_ErrorsHandle();
|
UPP_Errors_Handle();
|
||||||
UPP_Control_InternalParams();
|
UPP_Control_InternalParams();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +154,7 @@ void UPP_ADC_Handle(void)
|
|||||||
{
|
{
|
||||||
BenchTime_Start(BT_ADC, angletim.Instance->CNT, HAL_MAX_DELAY);
|
BenchTime_Start(BT_ADC, angletim.Instance->CNT, HAL_MAX_DELAY);
|
||||||
|
|
||||||
PowerMonitor_Handle(&upp.pm);
|
PowerMonitor_FastCalc(&upp.pm);
|
||||||
|
|
||||||
for(int phase = 0; phase < 3; phase++)
|
for(int phase = 0; phase < 3; phase++)
|
||||||
{
|
{
|
||||||
@ -157,7 +168,7 @@ 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);
|
||||||
PWM_SetHalfWave(&upp.hpwm, phase, curr_halfwave);
|
PWM_SetHalfWave(&upp.hpwm, phase, curr_halfwave);
|
||||||
// Начинаем отсчитывать угол
|
// Начинаем отсчитывать угол
|
||||||
Angle_Start(&upp.hangle, phase, alpha_dbg, 10);
|
Angle_Start(&upp.hangle, phase, 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,8 +17,6 @@
|
|||||||
#include "upp_status.h" // статус упп
|
#include "upp_status.h" // статус упп
|
||||||
#include "upp_control.h" // управление упп
|
#include "upp_control.h" // управление упп
|
||||||
|
|
||||||
extern float alpha_dbg;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|||||||
@ -128,7 +128,24 @@
|
|||||||
<Name>-U-O142 -O2190 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F427ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
|
<Name>-U-O142 -O2190 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F427ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
</TargetDriverDllRegistry>
|
</TargetDriverDllRegistry>
|
||||||
<Breakpoint/>
|
<Breakpoint>
|
||||||
|
<Bp>
|
||||||
|
<Number>0</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>156</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>0</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>0</BreakIfRCount>
|
||||||
|
<Filename>..\Core\PowerMonitor\power_monitor.c</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression></Expression>
|
||||||
|
</Bp>
|
||||||
|
</Breakpoint>
|
||||||
<Tracepoint>
|
<Tracepoint>
|
||||||
<THDelay>0</THDelay>
|
<THDelay>0</THDelay>
|
||||||
</Tracepoint>
|
</Tracepoint>
|
||||||
@ -498,6 +515,30 @@
|
|||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\Core\PowerMonitor\zero_cross.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>zero_cross.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>3</GroupNumber>
|
||||||
|
<FileNumber>26</FileNumber>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\Core\PowerMonitor\zero_cross.h</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>zero_cross.h</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>3</GroupNumber>
|
||||||
|
<FileNumber>27</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>..\Core\PowerMonitor\adc_tools.c</PathWithFileName>
|
<PathWithFileName>..\Core\PowerMonitor\adc_tools.c</PathWithFileName>
|
||||||
<FilenameWithoutPath>adc_tools.c</FilenameWithoutPath>
|
<FilenameWithoutPath>adc_tools.c</FilenameWithoutPath>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
@ -505,7 +546,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>26</FileNumber>
|
<FileNumber>28</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -517,25 +558,49 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>27</FileNumber>
|
<FileNumber>29</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>..\Core\PowerMonitor\zero_cross.c</PathWithFileName>
|
<PathWithFileName>..\Core\PowerMonitor\phases_transform.c</PathWithFileName>
|
||||||
<FilenameWithoutPath>zero_cross.c</FilenameWithoutPath>
|
<FilenameWithoutPath>phases_transform.c</FilenameWithoutPath>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>3</GroupNumber>
|
<GroupNumber>3</GroupNumber>
|
||||||
<FileNumber>28</FileNumber>
|
<FileNumber>30</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<bDave2>0</bDave2>
|
<bDave2>0</bDave2>
|
||||||
<PathWithFileName>..\Core\PowerMonitor\zero_cross.h</PathWithFileName>
|
<PathWithFileName>..\Core\PowerMonitor\phases_transform.h</PathWithFileName>
|
||||||
<FilenameWithoutPath>zero_cross.h</FilenameWithoutPath>
|
<FilenameWithoutPath>phases_transform.h</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>3</GroupNumber>
|
||||||
|
<FileNumber>31</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\Core\PowerMonitor\power_protect.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>power_protect.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>3</GroupNumber>
|
||||||
|
<FileNumber>32</FileNumber>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\Core\PowerMonitor\power_protect.h</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>power_protect.h</FilenameWithoutPath>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</File>
|
||||||
@ -549,7 +614,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>29</FileNumber>
|
<FileNumber>33</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -561,7 +626,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>30</FileNumber>
|
<FileNumber>34</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -573,7 +638,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>31</FileNumber>
|
<FileNumber>35</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -585,7 +650,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>32</FileNumber>
|
<FileNumber>36</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -597,7 +662,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>33</FileNumber>
|
<FileNumber>37</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -609,7 +674,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>34</FileNumber>
|
<FileNumber>38</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -621,7 +686,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>35</FileNumber>
|
<FileNumber>39</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -633,7 +698,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>36</FileNumber>
|
<FileNumber>40</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -645,7 +710,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>37</FileNumber>
|
<FileNumber>41</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -657,7 +722,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>38</FileNumber>
|
<FileNumber>42</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -669,7 +734,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>39</FileNumber>
|
<FileNumber>43</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -681,7 +746,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>40</FileNumber>
|
<FileNumber>44</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -693,7 +758,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>4</GroupNumber>
|
<GroupNumber>4</GroupNumber>
|
||||||
<FileNumber>41</FileNumber>
|
<FileNumber>45</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -713,7 +778,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>42</FileNumber>
|
<FileNumber>46</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -725,7 +790,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>43</FileNumber>
|
<FileNumber>47</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -737,7 +802,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>44</FileNumber>
|
<FileNumber>48</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -749,7 +814,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>45</FileNumber>
|
<FileNumber>49</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -761,7 +826,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>46</FileNumber>
|
<FileNumber>50</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -773,7 +838,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>47</FileNumber>
|
<FileNumber>51</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -785,7 +850,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>48</FileNumber>
|
<FileNumber>52</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -797,7 +862,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>49</FileNumber>
|
<FileNumber>53</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -817,7 +882,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>50</FileNumber>
|
<FileNumber>54</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -829,7 +894,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>51</FileNumber>
|
<FileNumber>55</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -841,7 +906,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>52</FileNumber>
|
<FileNumber>56</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -853,7 +918,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>53</FileNumber>
|
<FileNumber>57</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -865,7 +930,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>54</FileNumber>
|
<FileNumber>58</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -877,7 +942,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>55</FileNumber>
|
<FileNumber>59</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -889,7 +954,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>56</FileNumber>
|
<FileNumber>60</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -901,7 +966,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>57</FileNumber>
|
<FileNumber>61</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -913,7 +978,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>58</FileNumber>
|
<FileNumber>62</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -925,7 +990,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>59</FileNumber>
|
<FileNumber>63</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -937,7 +1002,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>60</FileNumber>
|
<FileNumber>64</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -949,7 +1014,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>61</FileNumber>
|
<FileNumber>65</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -969,7 +1034,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>62</FileNumber>
|
<FileNumber>66</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -981,7 +1046,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>63</FileNumber>
|
<FileNumber>67</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -995,13 +1060,13 @@
|
|||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>PeriphGeneral</GroupName>
|
<GroupName>PeriphGeneral</GroupName>
|
||||||
<tvExp>1</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>64</FileNumber>
|
<FileNumber>68</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1013,7 +1078,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>65</FileNumber>
|
<FileNumber>69</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1025,7 +1090,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>66</FileNumber>
|
<FileNumber>70</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1037,7 +1102,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>67</FileNumber>
|
<FileNumber>71</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1049,7 +1114,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>68</FileNumber>
|
<FileNumber>72</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1069,7 +1134,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>69</FileNumber>
|
<FileNumber>73</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1081,7 +1146,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>70</FileNumber>
|
<FileNumber>74</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1093,7 +1158,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>71</FileNumber>
|
<FileNumber>75</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1105,7 +1170,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>72</FileNumber>
|
<FileNumber>76</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1117,7 +1182,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>73</FileNumber>
|
<FileNumber>77</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1129,7 +1194,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>74</FileNumber>
|
<FileNumber>78</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1141,7 +1206,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>75</FileNumber>
|
<FileNumber>79</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1153,7 +1218,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>76</FileNumber>
|
<FileNumber>80</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1165,7 +1230,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>77</FileNumber>
|
<FileNumber>81</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1177,7 +1242,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>78</FileNumber>
|
<FileNumber>82</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1189,7 +1254,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>79</FileNumber>
|
<FileNumber>83</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1201,7 +1266,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>80</FileNumber>
|
<FileNumber>84</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1213,7 +1278,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>81</FileNumber>
|
<FileNumber>85</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1225,7 +1290,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>82</FileNumber>
|
<FileNumber>86</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1237,7 +1302,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>83</FileNumber>
|
<FileNumber>87</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1249,7 +1314,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>84</FileNumber>
|
<FileNumber>88</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1261,7 +1326,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>85</FileNumber>
|
<FileNumber>89</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1273,7 +1338,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>86</FileNumber>
|
<FileNumber>90</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1285,7 +1350,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>87</FileNumber>
|
<FileNumber>91</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1297,7 +1362,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>88</FileNumber>
|
<FileNumber>92</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1309,7 +1374,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>89</FileNumber>
|
<FileNumber>93</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1321,7 +1386,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>90</FileNumber>
|
<FileNumber>94</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1333,7 +1398,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>91</FileNumber>
|
<FileNumber>95</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1345,7 +1410,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>92</FileNumber>
|
<FileNumber>96</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1365,7 +1430,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>93</FileNumber>
|
<FileNumber>97</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1385,7 +1450,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>11</GroupNumber>
|
<GroupNumber>11</GroupNumber>
|
||||||
<FileNumber>94</FileNumber>
|
<FileNumber>98</FileNumber>
|
||||||
<FileType>2</FileType>
|
<FileType>2</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1399,7 +1464,7 @@
|
|||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>::CMSIS</GroupName>
|
<GroupName>::CMSIS</GroupName>
|
||||||
<tvExp>1</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>1</RteFlg>
|
<RteFlg>1</RteFlg>
|
||||||
|
|||||||
@ -17,8 +17,8 @@
|
|||||||
<TargetCommonOption>
|
<TargetCommonOption>
|
||||||
<Device>STM32F427ZGTx</Device>
|
<Device>STM32F427ZGTx</Device>
|
||||||
<Vendor>STMicroelectronics</Vendor>
|
<Vendor>STMicroelectronics</Vendor>
|
||||||
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
|
<PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
|
||||||
<PackURL>http://www.keil.com/pack/</PackURL>
|
<PackURL>https://www.keil.com/pack/</PackURL>
|
||||||
<Cpu>IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
|
<Cpu>IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
|
||||||
<FlashUtilSpec></FlashUtilSpec>
|
<FlashUtilSpec></FlashUtilSpec>
|
||||||
<StartupFile></StartupFile>
|
<StartupFile></StartupFile>
|
||||||
@ -515,6 +515,16 @@
|
|||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<FilePath>..\Core\PowerMonitor\power_monitor.h</FilePath>
|
<FilePath>..\Core\PowerMonitor\power_monitor.h</FilePath>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>zero_cross.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\Core\PowerMonitor\zero_cross.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>zero_cross.h</FileName>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<FilePath>..\Core\PowerMonitor\zero_cross.h</FilePath>
|
||||||
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<FileName>adc_tools.c</FileName>
|
<FileName>adc_tools.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
@ -526,14 +536,24 @@
|
|||||||
<FilePath>..\Core\PowerMonitor\adc_tools.h</FilePath>
|
<FilePath>..\Core\PowerMonitor\adc_tools.h</FilePath>
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<FileName>zero_cross.c</FileName>
|
<FileName>phases_transform.c</FileName>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<FilePath>..\Core\PowerMonitor\zero_cross.c</FilePath>
|
<FilePath>..\Core\PowerMonitor\phases_transform.c</FilePath>
|
||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<FileName>zero_cross.h</FileName>
|
<FileName>phases_transform.h</FileName>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<FilePath>..\Core\PowerMonitor\zero_cross.h</FilePath>
|
<FilePath>..\Core\PowerMonitor\phases_transform.h</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>power_protect.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\Core\PowerMonitor\power_protect.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>power_protect.h</FileName>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<FilePath>..\Core\PowerMonitor\power_protect.h</FilePath>
|
||||||
</File>
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user