Структуризирован PowerMonitor: сделано разделение на быстрие и медленные обработки

- Быстрые делаются в прерывании и заполняют с fast Напряжениями/Токами
- Медленные делаются в main, с каким-то периодом и работают с slow и mean Напряжениями/Токами/Температурами
This commit is contained in:
Razvalyaev 2025-11-17 12:38:50 +03:00
parent b236975f9b
commit e69eb0c8c9
16 changed files with 434 additions and 165 deletions

View File

@ -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_dma.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_adc.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\Device\STM32F4xx"^
-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
::-------------------------------------------------------------------------

View File

@ -33,7 +33,7 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port)
int nn = 0;
for (int i = 0; i < 3; i++)
{ //0-2
WriteOutputArray(upp.pm.measured.Ureal[i], ind_port, nn++);
WriteOutputArray(upp.pm.measured.U[i], ind_port, nn++);
}
for (int i = 0; i < 3; i++)
{ //3-5
@ -45,16 +45,19 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port)
}
for (int i = 0; i < 3; i++)
{ //9-11
WriteOutputArray(upp.pm.measured.Ireal[i], ind_port, nn++);
WriteOutputArray(upp.pm.measured.I[i], ind_port, nn++);
}
for (int i = 0; i < 2; i++)
{ //12-13
WriteOutputArray(upp.pm.measured.T[i], ind_port, nn++);
}
{ //14-16
WriteOutputArray(upp.pm.measured.U_mean, ind_port, nn++);
WriteOutputArray(upp.pm.measured.I_mean, ind_port, nn++);
WriteOutputArray(upp.pm.measured.F_mean, ind_port, nn++);
{ //14-19
WriteOutputArray(upp.pm.measured.Uvec, ind_port, nn++);
WriteOutputArray(upp.pm.measured.Ivec, ind_port, nn++);
WriteOutputArray(upp.pm.measured.Imean[0], ind_port, nn++);
WriteOutputArray(upp.pm.measured.Imean[1], ind_port, nn++);
WriteOutputArray(upp.pm.measured.Imean[2], ind_port, nn++);
WriteOutputArray(upp.pm.measured.Fmean, ind_port, nn++);
}
}

Binary file not shown.

@ -1 +1 @@
Subproject commit 9bff9ad44dd625819ef654e98ca351d5bc5568a9
Subproject commit 513f56fe7dbf0fa8e6a075c22e138c908a01d33f

View File

@ -66,7 +66,7 @@
/* Параметры определения перехода через ноль */
#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
@ -85,8 +85,8 @@
*/
/* Периоды вызова всякого */
#define PM_ADC_PERIOD_US 10 ///< Период опроса АЦП в мкс
#define PM_SLOW_PERIOD_10US 50 ///< Период обновление медленных расчетов в 10мкс
#define PM_TEMP_PERIOD_10US 5000 ///< Период обновление датчиков температуры в 10мкс
#define PM_SLOW_PERIOD_CNT 50 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
#define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT
/* Частоты таймеров в МГц*/
#define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП

View File

@ -178,6 +178,7 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
if(Filter_isDataReady(&adc->filter[0]))
adc->f.DataReady = 1;
return HAL_OK;
}
@ -217,7 +218,7 @@ void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t
}
// Накопление для Avg/RMS
stat->Sum += ABS(value);
stat->Sum += fabsf(value);
stat->SumSquares += value * value;
stat->SampleCount++;

View File

@ -0,0 +1,49 @@
/**
******************************************************************************
* @file phases_transform.c
* @brief Функции для преобразования напряжений/токов в многофазных системах
******************************************************************************
* @details
******************************************************************************/
#include "phases_transform.h"
#define SQRT3 1.7320508
/**
* @brief Рассчитать результирующий вектор трехфазной системы по фазным величинам.
* @return Длина вектора (модуль).
* @note Вызывается в DMA2_Stream0_IRQHandler() для обработки всего, что пришло по DMA.
*/
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 Длина вектора (модуль).
* @note Вызывается в DMA2_Stream0_IRQHandler() для обработки всего, что пришло по DMA.
*/
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;
}

View File

@ -0,0 +1,16 @@
/**
******************************************************************************
* @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);
#endif /* _PHASES_TRANSFORM_H_ */

View File

@ -6,9 +6,11 @@
* @details
******************************************************************************/
#include "power_monitor.h"
#include "phases_transform.h"
#include "adc.h"
#include "tim.h"
static void __SynchAvgFilters(PowerMonitor_t *hpm);
HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
{
@ -59,27 +61,27 @@ 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], (float)MB_INTERNAL.param.pm.mean_alpha/65535))
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++)
{
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;
Filter_Start(&hpm->measured.avg[i]);
Filter_Start(&hpm->avg[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;
Filter_Start(&hpm->measured.avg[ADC_TEMP_CHANNELS_START+i]);
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);
}
return HAL_OK;
@ -104,76 +106,87 @@ void PowerMonitor_SlowHandle(PowerMonitor_t *hpm)
return;
if(!hpm->f.runSlow)
return;
hpm->f.runSlow = 0;
PowerMonitor_Measured_t *meas = &hpm->measured;
/* Обработка температур */
float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1];
float t2 = hpm->adc.Data[ADC_CHANNEL_TEMP2];
meas->T[TEMP_1] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP1], t1);
meas->T[TEMP_2] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP2], t2);
/* Расчет третьей фазы */
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 umean = 0;
float imean = 0;
float fmean = 0;
/* Расчет всякого для трех фаз отдельно */
float fmean = 0; // средняя частота по трем фазам
float iphase_mean = 0; // средний ток каждой фазы
for(int i = 0; i < 3; i++)
{
umean += ABS(meas->Uslow[i]);
imean += ABS(meas->Islow[i]);
fmean += ABS(meas->F[i]);
}
umean /=3;
imean /=3;
fmean /=3;
/* Получение частоты фазы */
meas->F[i] = ZC_GetFrequency(&hpm->zc, i) / 2;
fmean += meas->F[i];
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);
/* Средний ток фазы */
iphase_mean = fabsf(meas->Islow[i]);
meas->Imean[i] = Filter_Process(&hpm->exp[EXP_IC+i], iphase_mean);
}
/* Получение средней частоты по трем фазам */
fmean /= 3;
meas->Fmean = Filter_Process(&hpm->exp[EXP_F], fmean);
/* Расчет результирущих векторов трехфазной сети */
float uvec = vector_abs_linear_calc(meas->Uslow[U_BA], meas->Uslow[U_AC]);
float ivec = vector_abs_phase_calc(meas->Islow[I_A], meas->Islow[I_C]);
meas->Uvec = Filter_Process(&hpm->exp[EXP_U], uvec);
meas->Ivec = Filter_Process(&hpm->exp[EXP_I], ivec);
hpm->f.runSlow = 0;
}
void PowerMonitor_Handle(PowerMonitor_t *hpm)
{
if(hpm == NULL)
return;
/* Считываем АЦП */
/* Считываем АЦП с пересчетами и медианой фильтрацией от выбросов */
ADC_Handle(&hpm->adc);
/* Заполняем величины */
/* Заполняем величины Напряжений/Токов */
PowerMonitor_Measured_t *meas = &hpm->measured;
meas->Ureal[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA];
meas->Ureal[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC];
meas->Ureal[U_BC] = -meas->Ureal[U_BA] - meas->Ureal[U_AC];
meas->Ireal[I_C] = hpm->adc.Data[ADC_CHANNEL_IC];
meas->Ireal[I_A] = hpm->adc.Data[ADC_CHANNEL_IA];
meas->Ireal[I_B] = -meas->Ireal[I_A] - meas->Ireal[I_C];
meas->T[TEMP_1] = hpm->adc.Data[ADC_CHANNEL_TEMP1];
meas->T[TEMP_2] = hpm->adc.Data[ADC_CHANNEL_TEMP2];
meas->U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA];
meas->U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC];
meas->U[U_BC] = -meas->U[U_BA] - meas->U[U_AC];
meas->I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC];
meas->I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA];
meas->I[I_B] = -meas->I[I_A] - meas->I[I_C];
/* Преобразуем в относительные единицы (о.е.) */
for(int i = 0; i < 3; i++)
{
meas->U[i] = 10*meas->Ureal[i]/MB_INTERNAL.param.nominal.U;
meas->I[i] = 10*meas->Ireal[i]/MB_INTERNAL.param.nominal.I;
meas->Ufast[i] = 10*meas->U[i]/MB_INTERNAL.param.nominal.U;
meas->Ifast[i] = 10*meas->I[i]/MB_INTERNAL.param.nominal.I;
}
/* Ищем переход через ноль */
ZC_ProcessAllChannels(&hpm->zc, meas->U, usTick);
for(int i = 0; i < 3; i++)
{
meas->F[i] = ZC_GetFrequency(&hpm->zc, i) / 2;
}
ZC_ProcessAllChannels(&hpm->zc, meas->Ufast, usTick);
/* Вообще фильтры должны рабтоать синхронно, но на всякий синхронизация */
__SynchAvgFilters(hpm);
/* Накопление 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]);
meas->Uslow[U_BA] = Filter_Process(&hpm->avg[ADC_CHANNEL_UBA], meas->Ufast[U_BA]);
meas->Uslow[U_AC] = Filter_Process(&hpm->avg[ADC_CHANNEL_UAC], meas->Ufast[U_AC]);
meas->Islow[I_C] = Filter_Process(&hpm->avg[ADC_CHANNEL_IC], meas->Ifast[I_C]);
meas->Islow[I_A] = Filter_Process(&hpm->avg[ADC_CHANNEL_IA], meas->Ifast[I_A]);
/* Запускаем медленную обработку через 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;
if(!hpm->f.runSlow)
{
@ -190,3 +203,26 @@ void PowerMonitor_Handle(PowerMonitor_t *hpm)
hpm->isr_cnt++;
}
}
/* Синхронизация фильтров. Но вообще не должна никогда отрабатывать */
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]);
}
}
}

View File

@ -10,6 +10,15 @@
#include "adc_tools.h"
#include "zero_cross.h"
/* Индексы экспоненциальных фильтров */
#define EXP_ALL 6
#define EXP_U 0
#define EXP_I 1
#define EXP_IC 2
#define EXP_IA 3
#define EXP_IB 4
#define EXP_F 5
typedef struct
{
@ -27,24 +36,27 @@ typedef struct
typedef struct
{
float U_mean; ///< Среднее Напряжение по трем фазам
float I_mean; ///< Средний Ток по трем фазам
float F_mean; ///< Средняя Частота по трем фазам
float Uslow[3]; ///< Напряжение от АЦП (в о.е.)
float Islow[3]; ///< Ток от АЦП (в о.е.)
/* Усредненные величины (о.е.) */
float Uvec; ///< Результирующий вектор Напряжения по трем фазам
float Ivec; ///< Результирующий вектор Тока по трем фазам
float Imean[3]; ///< Средний Ток по трем фазам
float Fmean; ///< Средняя Частота по трем фазам
/* Быстрые величины (в о.е.) - обновляются в каждом прерывании АЦП */
float Ufast[3]; ///< Напряжение
float Ifast[3]; ///< Ток
/* Медленные величины (в о.е.) - обновляются в main в @ref PowerMonitor_SlowHandle */
float Uslow[3]; ///< Напряжение
float Islow[3]; ///< Ток
/* Реальные величины - обновляются кто где, и содержат значения в В/А/Цельсиях */
float U[3]; ///< Напряжение (обновляется в прерывании АЦП)
float I[3]; ///< Ток (обновляется в прерывании АЦП)
float F[3]; ///< Частота от Zero Cross (обновляется в main)
float T[2]; ///< Температура (обновляется в main)
float U[3]; ///< Напряжение от АЦП (в о.е.)
float I[3]; ///< Ток от АЦП (в о.е.)
float F[3]; ///< Частота от Zero Cross
float T[2]; ///< Температура от АЦП
float Ureal[3]; ///< Напряжение от АЦП
float Ireal[3]; ///< Ток от АЦП
FilterExp_t exp[3]; ///< Фильтры для mean
FilterAverage_t avg[6]; ///< Фильтры для avg
}PowerMonitor_Measured_t;
typedef struct
@ -55,8 +67,12 @@ typedef struct
{
ADC_Periodic_t adc; ///< Хендл периодического АЦП
ZeroCross_Handle_t zc; ///< Хендл перехода через ноль
PowerMonitor_Filters_t fltr;
PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины
FilterExp_t exp[EXP_ALL]; ///< Фильтры для mean
FilterAverage_t avg[ADC_NUMB_OF_CHANNELS]; ///< Фильтры для avg
PowerMonitor_Flags_t f; ///< Флаги мониторинга

View File

@ -0,0 +1,8 @@
/**
******************************************************************************
* @file power_protect.c
* @brief Модуль реализующий защиты по Напряжению/Токам/Температуре
******************************************************************************
* @details
******************************************************************************/
#include "power_protect.h"

View File

@ -0,0 +1,11 @@
/**
******************************************************************************
* @file power_monitor.h
* @brief Модуль реализующий защиты по Напряжению/Токам/Температуре
******************************************************************************
*****************************************************************************/
#ifndef _POWER_PROTECT_H_
#define _POWER_PROTECT_H_
#include "main.h"
#endif /* _POWER_PROTECT_H_ */

View File

@ -39,7 +39,7 @@ void UPP_Control_InternalParams(void)
uint16_t pwm_freq = upp.hpwm.Config.Frequency;
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;
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
@ -87,7 +87,7 @@ void UPP_Control_InternalParams(void)
{
for(int i = 0; i < 3; i++)
{
Filter_ReInit(&upp.pm.measured.exp[i], pm_alpha);
Filter_ReInit(&upp.pm.exp[i], pm_alpha);
}
}
@ -178,7 +178,7 @@ void UPP_SetDefault(int pui_default, int internal_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.DebouneCouner = ZERO_CROSS_DEBOUNCE_10US_DEFAULT;
MB_INTERNAL.param.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT;
//__AngleSetLimit();
}
}

View File

@ -15,7 +15,7 @@ typedef struct
unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные
unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные
unsigned go:1; ///< Запустить УПП
unsigned stop:1; ///< Выставить внутренние настройки в дефолтные
unsigned stop:1; ///< Остановка УПП (авария)
unsigned reserved:11;

View File

@ -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>
</SetRegEntry>
</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>
<THDelay>0</THDelay>
</Tracepoint>
@ -498,6 +515,30 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<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>
<FilenameWithoutPath>adc_tools.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@ -505,7 +546,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>28</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -517,25 +558,49 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\PowerMonitor\zero_cross.c</PathWithFileName>
<FilenameWithoutPath>zero_cross.c</FilenameWithoutPath>
<PathWithFileName>..\Core\PowerMonitor\phases_transform.c</PathWithFileName>
<FilenameWithoutPath>phases_transform.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>30</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>
<PathWithFileName>..\Core\PowerMonitor\phases_transform.h</PathWithFileName>
<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>
<bShared>0</bShared>
</File>
@ -549,7 +614,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -561,7 +626,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -573,7 +638,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -585,7 +650,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -597,7 +662,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -609,7 +674,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -621,7 +686,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -633,7 +698,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -645,7 +710,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -657,7 +722,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -669,7 +734,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -681,7 +746,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -693,7 +758,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -713,7 +778,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>46</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -725,7 +790,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>47</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -737,7 +802,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>44</FileNumber>
<FileNumber>48</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -749,7 +814,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>45</FileNumber>
<FileNumber>49</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -761,7 +826,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>46</FileNumber>
<FileNumber>50</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -773,7 +838,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>47</FileNumber>
<FileNumber>51</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -785,7 +850,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>48</FileNumber>
<FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -797,7 +862,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>49</FileNumber>
<FileNumber>53</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -817,7 +882,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>50</FileNumber>
<FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -829,7 +894,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>51</FileNumber>
<FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -841,7 +906,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>52</FileNumber>
<FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -853,7 +918,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>53</FileNumber>
<FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -865,7 +930,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>54</FileNumber>
<FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -877,7 +942,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>55</FileNumber>
<FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -889,7 +954,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>56</FileNumber>
<FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -901,7 +966,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>57</FileNumber>
<FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -913,7 +978,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>58</FileNumber>
<FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -925,7 +990,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>59</FileNumber>
<FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -937,7 +1002,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>60</FileNumber>
<FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -949,7 +1014,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>61</FileNumber>
<FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -969,7 +1034,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>62</FileNumber>
<FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -981,7 +1046,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>63</FileNumber>
<FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -995,13 +1060,13 @@
<Group>
<GroupName>PeriphGeneral</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>64</FileNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1013,7 +1078,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>65</FileNumber>
<FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1025,7 +1090,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>66</FileNumber>
<FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1037,7 +1102,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>67</FileNumber>
<FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1049,7 +1114,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>68</FileNumber>
<FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1069,7 +1134,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>69</FileNumber>
<FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1081,7 +1146,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>70</FileNumber>
<FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1093,7 +1158,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>71</FileNumber>
<FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1105,7 +1170,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>72</FileNumber>
<FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1117,7 +1182,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>73</FileNumber>
<FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1129,7 +1194,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>74</FileNumber>
<FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1141,7 +1206,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>75</FileNumber>
<FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1153,7 +1218,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>76</FileNumber>
<FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1165,7 +1230,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>77</FileNumber>
<FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1177,7 +1242,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>78</FileNumber>
<FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1189,7 +1254,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>79</FileNumber>
<FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1201,7 +1266,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>80</FileNumber>
<FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1213,7 +1278,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>81</FileNumber>
<FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1225,7 +1290,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>82</FileNumber>
<FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1237,7 +1302,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>83</FileNumber>
<FileNumber>87</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1249,7 +1314,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>84</FileNumber>
<FileNumber>88</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1261,7 +1326,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>85</FileNumber>
<FileNumber>89</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1273,7 +1338,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>86</FileNumber>
<FileNumber>90</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1285,7 +1350,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>87</FileNumber>
<FileNumber>91</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1297,7 +1362,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>88</FileNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1309,7 +1374,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>89</FileNumber>
<FileNumber>93</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1321,7 +1386,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>90</FileNumber>
<FileNumber>94</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1333,7 +1398,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>91</FileNumber>
<FileNumber>95</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1345,7 +1410,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>92</FileNumber>
<FileNumber>96</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1365,7 +1430,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>93</FileNumber>
<FileNumber>97</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1385,7 +1450,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>94</FileNumber>
<FileNumber>98</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1399,7 +1464,7 @@
<Group>
<GroupName>::CMSIS</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>1</RteFlg>

View File

@ -17,8 +17,8 @@
<TargetCommonOption>
<Device>STM32F427ZGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
<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>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -515,6 +515,16 @@
<FileType>5</FileType>
<FilePath>..\Core\PowerMonitor\power_monitor.h</FilePath>
</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>
<FileName>adc_tools.c</FileName>
<FileType>1</FileType>
@ -526,14 +536,24 @@
<FilePath>..\Core\PowerMonitor\adc_tools.h</FilePath>
</File>
<File>
<FileName>zero_cross.c</FileName>
<FileName>phases_transform.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\PowerMonitor\zero_cross.c</FilePath>
<FilePath>..\Core\PowerMonitor\phases_transform.c</FilePath>
</File>
<File>
<FileName>zero_cross.h</FileName>
<FileName>phases_transform.h</FileName>
<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>
</Files>
</Group>