Доработки по мониторингу сети и моделированию

Неудачная попытка добавить биквадратный фильтр для АЦП (уходит в разнос)
This commit is contained in:
Razvalyaev 2025-11-13 18:56:29 +03:00
parent 5299cc5b12
commit e4f05bdf6a
23 changed files with 341 additions and 223 deletions

View File

@ -72,7 +72,7 @@ struct TIM_Sim
int Updated; // счетчик таймера int Updated; // счетчик таймера
double tx_cnt; // счетчик таймера double tx_cnt; // счетчик таймера
double tx_step; // шаг счета за один шаг симуляции double tx_step; // шаг счета за один шаг симуляции
int RELOAD; // буфер, если PRELOAD = 1 long long RELOAD; // буфер, если PRELOAD = 1
struct Channels_Sim Channels; // структура для симуляции каналов struct Channels_Sim Channels; // структура для симуляции каналов
}; };
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////

View File

@ -49,7 +49,7 @@ void deInitialize_MCU(void)
ClearStruct(htim8); ClearStruct(htim8);
ClearStruct(htim11); ClearStruct(htim11);
ClearStruct(htim12); ClearStruct(htim12);
ClearStruct(htim13); ClearStruct(htim5);
ClearStruct(hadc3); ClearStruct(hadc3);
ClearStruct(hdma_adc3); ClearStruct(hdma_adc3);
} }

View File

@ -37,14 +37,16 @@ const int inOffsets[IN_PORT_NUMB] = {
*/ */
const int outLengths[OUT_PORT_NUMB] = { const int outLengths[OUT_PORT_NUMB] = {
THYR_PORT_1_WIDTH, THYR_PORT_1_WIDTH,
OUT_PORT_2_WIDTH OUT_PORT_2_WIDTH,
OUT_PORT_3_WIDTH
}; };
/** /**
* @brief Таблица смещений в выходном массиве OUT * @brief Таблица смещений в выходном массиве OUT
*/ */
const int outOffsets[OUT_PORT_NUMB] = { const int outOffsets[OUT_PORT_NUMB] = {
OFFSET_OUT_ARRAY_1, OFFSET_OUT_ARRAY_1,
OFFSET_OUT_ARRAY_2 OFFSET_OUT_ARRAY_2,
OFFSET_OUT_ARRAY_3
}; };
// INPUT/OUTPUTS AUTO-PARAMS END // INPUT/OUTPUTS AUTO-PARAMS END

View File

@ -53,9 +53,10 @@
#define ADC_PORT_1_WIDTH 6 #define ADC_PORT_1_WIDTH 6
#define IN_PORT_2_WIDTH 1 #define IN_PORT_2_WIDTH 1
#define OUT_PORT_NUMB 2 #define OUT_PORT_NUMB 3
#define THYR_PORT_1_WIDTH 6 #define THYR_PORT_1_WIDTH 6
#define OUT_PORT_2_WIDTH 6 #define OUT_PORT_2_WIDTH 6
#define OUT_PORT_3_WIDTH 16
// INPUT/OUTPUTS PARAMS END // INPUT/OUTPUTS PARAMS END
/** WRAPPER_CONF /** WRAPPER_CONF
@ -94,11 +95,12 @@
#define OFFSET_IN_ARRAY_2 (OFFSET_IN_ARRAY_1 + ADC_PORT_1_WIDTH) #define OFFSET_IN_ARRAY_2 (OFFSET_IN_ARRAY_1 + ADC_PORT_1_WIDTH)
/// === Полный размер буфера === /// === Полный размер буфера ===
#define TOTAL_OUT_SIZE (THYR_PORT_1_WIDTH + OUT_PORT_2_WIDTH) #define TOTAL_OUT_SIZE (THYR_PORT_1_WIDTH + OUT_PORT_2_WIDTH + OUT_PORT_3_WIDTH)
/// === Смещения массивов (внутри общего буфера) === /// === Смещения массивов (внутри общего буфера) ===
#define OFFSET_OUT_ARRAY_1 0 #define OFFSET_OUT_ARRAY_1 0
#define OFFSET_OUT_ARRAY_2 (OFFSET_OUT_ARRAY_1 + THYR_PORT_1_WIDTH) #define OFFSET_OUT_ARRAY_2 (OFFSET_OUT_ARRAY_1 + THYR_PORT_1_WIDTH)
#define OFFSET_OUT_ARRAY_3 (OFFSET_OUT_ARRAY_2 + OUT_PORT_2_WIDTH)
// INPUT/OUTPUTS AUTO-PARAMS END // INPUT/OUTPUTS AUTO-PARAMS END

View File

@ -21,6 +21,7 @@ void app_init(void) {
MX_TIM1_Init(); MX_TIM1_Init();
MX_TIM3_Init(); MX_TIM3_Init();
MX_TIM8_Init(); MX_TIM8_Init();
MX_TIM5_Init();
MX_ADC3_Init(); MX_ADC3_Init();
UPP_Init(); UPP_Init();
UPP_PreWhile(); UPP_PreWhile();

View File

@ -54,6 +54,10 @@ void app_writeOutputBuffer(real_T* Buffer) {
{ {
WriteOutputArray(pm.ZC_Detected[i], 0, i); WriteOutputArray(pm.ZC_Detected[i], 0, i);
} }
for (int i = 0; i < 2; i++)
{
WriteOutputArray(pm.zc.Channel[i].DebounceCounter, 0, i+2);
}
extern ADC_Periodic_t adc; extern ADC_Periodic_t adc;
@ -61,5 +65,25 @@ void app_writeOutputBuffer(real_T* Buffer) {
{ {
WriteOutputArray(pm.adc.Data[i], 1, i); WriteOutputArray(pm.adc.Data[i], 1, i);
} }
for (int i = 0; i < 3; i++)
{
WriteOutputArray(pm.U[i], 2, i);
}
for (int i = 0; i < 3; i++)
{
WriteOutputArray(pm.ZC_Detected[i], 2, i + 3);
}
for (int i = 0; i < 3; i++)
{
WriteOutputArray(pm.I[i], 2, i + 6);
}
for (int i = 0; i < 3; i++)
{
WriteOutputArray(pm.F[i], 2, i + 9);
}
// USER APP OUTPUT END // USER APP OUTPUT END
} }

Binary file not shown.

@ -1 +1 @@
Subproject commit 9b9969dd7ce85e3e317e6fef71c9e1e591d52e46 Subproject commit 48daccef2d1fefe965f020e5b342ed683fe40a62

View File

@ -14,10 +14,24 @@
#define _UPP_CONFIG_H_ #define _UPP_CONFIG_H_
#include "stm32f4xx_hal.h" #include "stm32f4xx_hal.h"
#define PM_ADC_PERIOD 1800-1
#define U_BA 0
#define U_AC 1
#define U_BC 2
#define I_C 0
#define I_A 1
#define I_B 2
#define TEMP_1 0
#define TEMP_2 1
#define PM_U_BASE 1216.0
#define PM_I_BASE 53.0
#define PM_ADC_PERIOD_MKS 10
#define PM_ZERO_CROSS_HYSTERESIS_V 10 #define PM_ZERO_CROSS_HYSTERESIS_V 10
#define PM_ZERO_CROSS_DEBOUNCE_10US 3 #define PM_ZERO_CROSS_DEBOUNCE_10US 2.5*100 // (2.5 * 100 = 2.5 мс)
// Рассчитанные дефайны
#define PM_ADC_PERIOD (180*PM_ADC_PERIOD_MKS)-1
#endif //_UPP_CONFIG_H_ #endif //_UPP_CONFIG_H_

View File

@ -40,7 +40,6 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */ /* USER CODE BEGIN ET */
/* USER CODE END ET */ /* USER CODE END ET */
/* Exported constants --------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/
@ -74,8 +73,9 @@ extern __IO uint32_t micros;
#define adc_tim htim8 #define adc_tim htim8
#define hpwm2 htim2 #define hpwm2 htim2
#define mb_dbg_huart huart6 #define mb_dbg_huart huart6
#define ustim htim13 #define ustim htim5
#define hpwm1 htim1 #define hpwm1 htim1
#define usTick ustim.Instance->CNT
#define UM_LED_GREEN2_Pin GPIO_PIN_2 #define UM_LED_GREEN2_Pin GPIO_PIN_2
#define UM_LED_GREEN2_GPIO_Port GPIOE #define UM_LED_GREEN2_GPIO_Port GPIOE
#define CEN_O_Pin GPIO_PIN_3 #define CEN_O_Pin GPIO_PIN_3
@ -168,7 +168,7 @@ extern __IO uint32_t micros;
#define UM_LED_GREEN1_GPIO_Port GPIOE #define UM_LED_GREEN1_GPIO_Port GPIOE
/* USER CODE BEGIN Private defines */ /* USER CODE BEGIN Private defines */
extern TIM_HandleTypeDef ustim;
/* USER CODE END Private defines */ /* USER CODE END Private defines */
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -36,24 +36,24 @@ extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim5;
extern TIM_HandleTypeDef htim8; extern TIM_HandleTypeDef htim8;
extern TIM_HandleTypeDef htim11; extern TIM_HandleTypeDef htim11;
extern TIM_HandleTypeDef htim12; extern TIM_HandleTypeDef htim12;
extern TIM_HandleTypeDef htim13;
/* USER CODE BEGIN Private defines */ /* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */ /* USER CODE END Private defines */
void MX_TIM1_Init(void); void MX_TIM1_Init(void);
void MX_TIM3_Init(void); void MX_TIM3_Init(void);
void MX_TIM5_Init(void);
void MX_TIM8_Init(void); void MX_TIM8_Init(void);
void MX_TIM11_Init(void); void MX_TIM11_Init(void);
void MX_TIM12_Init(void); void MX_TIM12_Init(void);
void MX_TIM13_Init(void);
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);

View File

@ -7,7 +7,31 @@
******************************************************************************/ ******************************************************************************/
#include "adc_tools.h" #include "adc_tools.h"
//Полосовой фильтр 45-55 Гц
static float coefs_biquad_U[5] = {
0.000010f, // b0
0.000020f, // b1
0.000010f, // b2
-1.900000f, // a1
0.950000f // a2
};
// ФНЧ 100 Гц
static float coefs_biquad_I[5] = {
0.000010f, // b0
0.000020f, // b1
0.000010f, // b2
-1.900000f, // a1
0.950000f // a2
};
// ФНЧ 10 Гц
static float coefs_biquad_T[5] = {
0.0002f, // b0
0.0004f, // b1
0.0002f, // b2
-1.98f, // a1
0.980f // a2
};
// Проверка корректности структуры АЦП // Проверка корректности структуры АЦП
#define assert_adc(_adc_) check_null_ptr_2(_adc_, (_adc_)->f.Initialized) #define assert_adc(_adc_) check_null_ptr_2(_adc_, (_adc_)->f.Initialized)
@ -20,11 +44,17 @@ static void ADC_EnableAllFilters(ADC_Periodic_t *adc)
} }
static void ADC_InitAllFilters(ADC_Periodic_t *adc) static void ADC_InitAllFilters(ADC_Periodic_t *adc)
{ {
// Filter_Init(&adc->filter[ADC_CHANNEL_UBA], coefs_biquad_U);
// Filter_Init(&adc->filter[ADC_CHANNEL_UAC], coefs_biquad_U);
// Filter_Init(&adc->filter[ADC_CHANNEL_IC], coefs_biquad_I);
// Filter_Init(&adc->filter[ADC_CHANNEL_IA], coefs_biquad_I);
// Filter_Init(&adc->filter[ADC_CHANNEL_TEMP1], coefs_biquad_T);
// Filter_Init(&adc->filter[ADC_CHANNEL_TEMP2], coefs_biquad_T);
for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++) for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
{ {
Filter_Init(&adc->filter[i], Filter_Coef); Filter_Init(&adc->filter[i], Filter_Initializator);
} }
FilterLUTInt_Init(&adc->temp_map[0], FilterLUTInt_Init(&adc->temp_map[0],
(int32_t *)adc_temp_quants, (int32_t *)adc_temp_quants,
(int32_t *)adc_temp_vals, (int32_t *)adc_temp_vals,
@ -147,16 +177,6 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
uint16_t *raw = adc->RawData; uint16_t *raw = adc->RawData;
float *data = adc->Data; float *data = adc->Data;
// Фильтрация от шумов для всех каналов
for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
{
if(Filter_GetState(&adc->filter[i]) == FILTER_ENABLE)
{
// заменяем сырое на отфильтровоное сырое
raw[i] = Filter_Process(&adc->filter[i], raw[i]);
}
}
// Перерасчеты Напряжений/Токов в единицы измерения // Перерасчеты Напряжений/Токов в единицы измерения
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
{ {
@ -165,6 +185,17 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
ADC_UpdateStatistics(adc, i, ADC_LEVEL_AC); ADC_UpdateStatistics(adc, i, ADC_LEVEL_AC);
} }
// Фильтрация от шумов для всех каналов
for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
{
if(Filter_isEnable(&adc->filter[i]))
{
// заменяем данные на отфильтрованные данные
data[i] = Filter_Process(&adc->filter[i], data[i]);
}
}
// Преобразования температуры по таблице // Преобразования температуры по таблице
for (int i = ADC_TEMP_CHANNELS_START; i < ADC_NUMB_OF_CHANNELS; i++) for (int i = ADC_TEMP_CHANNELS_START; i < ADC_NUMB_OF_CHANNELS; i++)
{ {
@ -221,7 +252,7 @@ void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t
stat->SampleCount++; stat->SampleCount++;
// Расчет Avg/RMS (периодически или по запросу) // Расчет Avg/RMS (периодически или по запросу)
if (stat->SampleCount >= 1000) { // Пример: пересчет каждые 1000 samples if (stat->SampleCount >= 4000) { // Пример: пересчет каждые 1000 samples
stat->Avg = stat->Sum / stat->SampleCount; stat->Avg = stat->Sum / stat->SampleCount;
stat->RMS = sqrtf(stat->SumSquares / stat->SampleCount); stat->RMS = sqrtf(stat->SumSquares / stat->SampleCount);
// Сброс накопителей // Сброс накопителей

View File

@ -51,10 +51,9 @@
static const int32_t adc_temp_vals[] = ADC_TEMPERATURES; static const int32_t adc_temp_vals[] = ADC_TEMPERATURES;
static const int32_t adc_temp_quants[] = ADC_TEMPERATURES_QUANTS; static const int32_t adc_temp_quants[] = ADC_TEMPERATURES_QUANTS;
#define Filter_t FilterMedianInt_t #define Filter_t FilterMedian_t
#define Filter_Init FilterMedianInt_Init #define Filter_Init FilterMedian_Init
#define Filter_Process FilterMedianInt_Process #define Filter_Initializator 5
#define Filter_Coef 10
/** /**
* @brief Коэфициенты канала АЦП для пересчета в единицы измерения * @brief Коэфициенты канала АЦП для пересчета в единицы измерения
@ -88,8 +87,6 @@ typedef struct
float SumSquares; ///< Накопитель для RMS float SumSquares; ///< Накопитель для RMS
}ADC_Statistics; }ADC_Statistics;
/** /**
* @brief Хендл АЦП * @brief Хендл АЦП
*/ */
@ -104,6 +101,7 @@ typedef struct
ADC_Coefs_t Coefs[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t для регулярных каналов (не температуры) ADC_Coefs_t Coefs[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t для регулярных каналов (не температуры)
Filter_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП Filter_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП
FilterLUTInt_t temp_map[2]; ///< Коррекция нелинейности датчиков температуры FilterLUTInt_t temp_map[2]; ///< Коррекция нелинейности датчиков температуры
float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах) float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах)

View File

@ -15,23 +15,25 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
if(ADC_Init(&hpm->adc, &adc_tim, &hadc3) != HAL_OK) if(ADC_Init(&hpm->adc, &adc_tim, &hadc3) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UBA, 2048, 1216, 4095) != HAL_OK) if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UBA, 2048, PM_U_BASE, 4095) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UAC, 2048, 1216, 4095) != HAL_OK) if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_UAC, 2048, PM_U_BASE, 4095) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IC, 2048, 53, 4095) != HAL_OK) if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IC, 2048, PM_I_BASE, 4095) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IA, 2048, 53, 4095) != HAL_OK) if(ADC_ConfigChannel(&hpm->adc, ADC_CHANNEL_IA, 2048, PM_I_BASE, 4095) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ZC_Init(&hpm->zc, ADC_NUMB_OF_U_CHANNELS, PM_ZERO_CROSS_HYSTERESIS_V, PM_ZERO_CROSS_DEBOUNCE_10US) != HAL_OK) if(ZC_Init(&hpm->zc, 3, PM_ZERO_CROSS_HYSTERESIS_V, PM_ZERO_CROSS_DEBOUNCE_10US) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ZC_ConfigChannel(&hpm->zc, ADC_CHANNEL_UBA, ZC_BOTH_EDGES) != HAL_OK) if(ZC_ConfigChannel(&hpm->zc, U_BA, ZC_BOTH_EDGES) != HAL_OK)
return HAL_ERROR;
if(ZC_ConfigChannel(&hpm->zc, ADC_CHANNEL_UAC, ZC_BOTH_EDGES) != HAL_OK)
return HAL_ERROR; return HAL_ERROR;
if(ZC_ConfigChannel(&hpm->zc, U_AC, ZC_BOTH_EDGES) != HAL_OK)
return HAL_ERROR;
if(ZC_ConfigChannel(&hpm->zc, U_BC, ZC_BOTH_EDGES) != HAL_OK)
return HAL_ERROR;
return HAL_OK; return HAL_OK;
} }
@ -49,15 +51,31 @@ HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm)
void PowerMonitor_Handle(PowerMonitor_t *hpm) void PowerMonitor_Handle(PowerMonitor_t *hpm)
{ {
static uint32_t last_zc_cnt[ADC_NUMB_OF_U_CHANNELS] = {0}; static uint32_t last_zc_state[ADC_NUMB_OF_U_CHANNELS] = {0};
ADC_Handle(&hpm->adc); ADC_Handle(&hpm->adc);
ZC_ProcessAllChannels(&hpm->zc, hpm->adc.Data, uwTick);
for(int i = 0; i < ADC_NUMB_OF_U_CHANNELS; i++) hpm->U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA];
hpm->U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC];
hpm->U[U_BC] = -hpm->U[U_BA] - hpm->U[U_AC];
hpm->I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC];
hpm->I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA];
hpm->I[I_B] = -hpm->I[I_A] - hpm->I[I_C];
hpm->T[TEMP_1] = hpm->adc.Data[ADC_CHANNEL_TEMP1];
hpm->T[TEMP_2] = hpm->adc.Data[ADC_CHANNEL_TEMP2];
ZC_ProcessAllChannels(&hpm->zc, hpm->U, usTick);
for(int i = 0; i < 3; i++)
{ {
if(last_zc_cnt[i] != ZC_GetCrossCount(&hpm->zc, i)) if(last_zc_state[i] != ZC_GetStableState(&hpm->zc, i))
{ {
last_zc_cnt[i] = ZC_GetCrossCount(&hpm->zc, i); last_zc_state[i] = ZC_GetStableState(&hpm->zc, i);
hpm->ZC_Detected[i] = !hpm->ZC_Detected[i]; hpm->ZC_Detected[i] = !hpm->ZC_Detected[i];
} }
} }
hpm->F[U_BA] = (hpm->zc.Channel[U_BA].Frequency) / 2;
hpm->F[U_AC] = (hpm->zc.Channel[U_AC].Frequency) / 2;
hpm->F[U_BC] = (hpm->zc.Channel[U_BC].Frequency) / 2;
} }

View File

@ -14,12 +14,12 @@ typedef struct
{ {
ADC_Periodic_t adc; ADC_Periodic_t adc;
ZeroCross_Handle_t zc; ZeroCross_Handle_t zc;
uint32_t ZC_Detected[ADC_NUMB_OF_U_CHANNELS]; uint32_t ZC_Detected[3];
float U[3]; float U[3];
float F[3];
float I[3]; float I[3];
float T[3]; float T[3];
}PowerMonitor_t; }PowerMonitor_t;
extern PowerMonitor_t pm; extern PowerMonitor_t pm;

View File

@ -18,7 +18,7 @@
* @return HAL Status. * @return HAL Status.
*/ */
HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels, HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels,
float hysteresis, uint8_t debounce_samples) float hysteresis, uint16_t debounce_samples)
{ {
if (zc == NULL || num_channels == 0 || num_channels > ZC_MAX_CHANNELS) { if (zc == NULL || num_channels == 0 || num_channels > ZC_MAX_CHANNELS) {
return HAL_ERROR; return HAL_ERROR;
@ -93,18 +93,18 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin
{ {
if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring) { if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring) {
return; return;
} }
if (channel >= zc->NumChannels) { if (channel >= zc->NumChannels) {
return; return;
} }
int zc_detected = 0;
ZC_Channel_t *zc_ch = &zc->Channel[channel]; ZC_Channel_t *zc_ch = &zc->Channel[channel];
zc_ch->CurrentValue = value; zc_ch->CurrentValue = value;
// Фильтрация дребезга // Фильтрация дребезга
if(zc_ch->DebounceCounter) if(zc_ch->DebounceCounter > 0)
{ {
zc_ch->DebounceCounter--; zc_ch->DebounceCounter--;
return; return;
@ -112,43 +112,59 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin
// Детектирование rising edge (отрицательное -> положительное) // Детектирование rising edge (отрицательное -> положительное)
if ((zc_ch->LastValue <= -zc->Hysteresis) && if ((zc_ch->LastValue <= -zc->Hysteresis) &&
(value >= zc->Hysteresis)) { (value >= zc->Hysteresis))
{
if (zc_ch->EdgeType == ZC_RISING_EDGE || zc_ch->EdgeType == ZC_BOTH_EDGES) { if (zc_ch->EdgeType == ZC_RISING_EDGE || zc_ch->EdgeType == ZC_BOTH_EDGES) {
// Переход подтвержден сразу (без дебаунса) if(zc->DebounceSamples)
if (zc_ch->LastCrossTime != 0) { {
// Расчет периода и частоты if(zc_ch->DebounceCounter == 0)
zc_ch->Period = timestamp - zc_ch->LastCrossTime; {
if (zc_ch->Period > 0) { zc_ch->DebounceCounter = zc->DebounceSamples;
zc_ch->Frequency = 1000000.0f / zc_ch->Period;
} }
} }
zc_ch->LastCrossTime = timestamp; zc_detected = 1;
zc_ch->CrossCount++;
zc_ch->StableState = 1;
} }
} }
// Детектирование falling edge (положительное -> отрицательное) // Детектирование falling edge (положительное -> отрицательное)
else if ((zc_ch->LastValue >= zc->Hysteresis) && else if ((zc_ch->LastValue >= zc->Hysteresis) &&
(value <= -zc->Hysteresis)) { (value <= -zc->Hysteresis))
{
if (zc_ch->EdgeType == ZC_FALLING_EDGE || zc_ch->EdgeType == ZC_BOTH_EDGES) { if (zc_ch->EdgeType == ZC_FALLING_EDGE || zc_ch->EdgeType == ZC_BOTH_EDGES) {
// Переход подтвержден сразу (без дебаунса) if(zc->DebounceSamples)
if (zc_ch->LastCrossTime != 0) { {
// Расчет периода и частоты if(zc_ch->DebounceCounter == 0)
zc_ch->Period = timestamp - zc_ch->LastCrossTime; {
if (zc_ch->Period > 0) { zc_ch->DebounceCounter = zc->DebounceSamples;
zc_ch->Frequency = 1000000.0f / zc_ch->Period;
} }
} }
zc_ch->LastCrossTime = timestamp; zc_detected = -1;
zc_ch->CrossCount++;
zc_ch->StableState = 0;
} }
} }
if(zc_detected)
{
zc_ch->StableState = zc_detected == 1? 1:0;
uint32_t RealTimeShift = zc->DebounceSamples*(timestamp - zc->LastTick); // коло-во тиков * период вызова функции
// Переход подтвержден сразу
uint32_t RealTimestamp = timestamp-RealTimeShift;
if (zc_ch->LastCrossTime != 0) {
// Расчет периода и частоты
zc_ch->Period = RealTimestamp - zc_ch->LastCrossTime;
if (zc_ch->Period > 0) {
zc_ch->Frequency = 1000000.0f / zc_ch->Period;
}
}
zc_ch->LastCrossTime = RealTimestamp;
zc_ch->CrossCount++;
}
// Сохраняем текущее значение для следующей итерации в случае если оно не в мертвой зоне // Сохраняем текущее значение для следующей итерации в случае если оно не в мертвой зоне
if((value > zc->Hysteresis) || (value < -zc->Hysteresis)) if((value > zc->Hysteresis) || (value < -zc->Hysteresis))
{ {
@ -162,7 +178,7 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin
* @param values Массив значений сигналов * @param values Массив значений сигналов
* @param timestamp Временная метка измерения * @param timestamp Временная метка измерения
*/ */
void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float values[], uint32_t timestamp) void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values, uint32_t timestamp)
{ {
if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring || values == NULL) { if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring || values == NULL) {
return; return;
@ -171,6 +187,8 @@ void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float values[], uint32_t time
for (int ch = 0; ch < zc->NumChannels; ch++) { for (int ch = 0; ch < zc->NumChannels; ch++) {
ZC_ProcessChannel(zc, ch, values[ch], timestamp); ZC_ProcessChannel(zc, ch, values[ch], timestamp);
} }
zc->LastTick = timestamp;
} }
/** /**
@ -296,46 +314,4 @@ void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel)
zc->Channel[i].CrossCount = 0; zc->Channel[i].CrossCount = 0;
} }
} }
}
/**
* @brief Установка гистерезиса для хендла.
* @param zc Указатель на хендл детектора нуля
* @param hysteresis Значение гистерезиса
*/
void ZC_SetHysteresis(ZeroCross_Handle_t *zc, float hysteresis)
{
if (zc == NULL || !zc->f.Initialized) {
return;
}
zc->Hysteresis = hysteresis;
}
/**
* @brief Установка дебаунс samples для хендла.
* @param zc Указатель на хендл детектора нуля
* @param debounce_samples Количество samples для антидребезга
*/
void ZC_SetDebounceSamples(ZeroCross_Handle_t *zc, uint8_t debounce_samples)
{
if (zc == NULL || !zc->f.Initialized) {
return;
}
zc->DebounceSamples = debounce_samples;
}
/**
* @brief Получение количества каналов хендла.
* @param zc Указатель на хендл детектора нуля
* @return Количество каналов.
*/
uint8_t ZC_GetNumChannels(ZeroCross_Handle_t *zc)
{
if (zc == NULL || !zc->f.Initialized) {
return 0;
}
return zc->NumChannels;
} }

View File

@ -72,7 +72,7 @@ ZC_Init(&zc_low_sensitivity, 2, 0.5f, 2); // 0.5 гистерезис, 2 samp
#include "main.h" #include "main.h"
#ifndef ZC_MAX_CHANNELS #ifndef ZC_MAX_CHANNELS
#define ZC_MAX_CHANNELS 8 ///< Максимальное количество каналов на хендл #define ZC_MAX_CHANNELS 3 ///< Максимальное количество каналов на хендл
#endif #endif
/** /**
@ -91,7 +91,7 @@ typedef struct {
uint32_t CrossCount; ///< Счетчик переходов uint32_t CrossCount; ///< Счетчик переходов
float LastValue; ///< Предыдущее значение float LastValue; ///< Предыдущее значение
float CurrentValue; ///< Текущее значение float CurrentValue; ///< Текущее значение
uint8_t DebounceCounter; ///< Счетчик антидребезга uint16_t DebounceCounter; ///< Счетчик антидребезга
uint8_t StableState; ///< Стабильное состояние (0=отриц, 1=полож) uint8_t StableState; ///< Стабильное состояние (0=отриц, 1=полож)
uint32_t LastCrossTime; ///< Время последнего перехода uint32_t LastCrossTime; ///< Время последнего перехода
uint32_t Period; ///< Период сигнала (в тактах таймера) uint32_t Period; ///< Период сигнала (в тактах таймера)
@ -106,16 +106,19 @@ typedef struct {
ZC_Channel_t Channel[ZC_MAX_CHANNELS]; ///< Каналы @ref ZC_Channel_t ZC_Channel_t Channel[ZC_MAX_CHANNELS]; ///< Каналы @ref ZC_Channel_t
uint8_t NumChannels; ///< Количество используемых каналов для этого хендла uint8_t NumChannels; ///< Количество используемых каналов для этого хендла
float Hysteresis; ///< Гистерезис для избежания дребезга float Hysteresis; ///< Гистерезис для избежания дребезга
uint8_t DebounceSamples; ///< Количество samples для антидребезга uint16_t DebounceSamples; ///< Количество samples для антидребезга
struct { struct {
unsigned Initialized:1; ///< Флаг инициализации unsigned Initialized:1; ///< Флаг инициализации
unsigned Monitoring:1; ///< Флаг активности мониторинга unsigned Monitoring:1; ///< Флаг активности мониторинга
} f; ///< Флаги } f; ///< Флаги
uint32_t LastTick; ///< Послднее время вызова
} ZeroCross_Handle_t; } ZeroCross_Handle_t;
/* Инициализация детектора нуля с индивидуальными настройками */ /* Инициализация детектора нуля с индивидуальными настройками */
HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels, HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels,
float hysteresis, uint8_t debounce_samples); float hysteresis, uint16_t debounce_samples);
/* Настройка канала детектора */ /* Настройка канала детектора */
HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel, HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel,
@ -126,7 +129,7 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value,
uint32_t timestamp); uint32_t timestamp);
/* Пакетная обработка всех каналов */ /* Пакетная обработка всех каналов */
void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float values[], void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values,
uint32_t timestamp); uint32_t timestamp);
/* Получение частоты сигнала */ /* Получение частоты сигнала */

View File

@ -98,7 +98,6 @@ int main(void)
MX_USART3_UART_Init(); MX_USART3_UART_Init();
MX_CAN1_Init(); MX_CAN1_Init();
MX_IWDG_Init(); MX_IWDG_Init();
MX_TIM13_Init();
MX_RTC_Init(); MX_RTC_Init();
MX_TIM1_Init(); MX_TIM1_Init();
MX_TIM3_Init(); MX_TIM3_Init();
@ -107,6 +106,7 @@ int main(void)
MX_TIM11_Init(); MX_TIM11_Init();
MX_TIM12_Init(); MX_TIM12_Init();
MX_TIM8_Init(); MX_TIM8_Init();
MX_TIM5_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
#else //MATLAB #else //MATLAB
#endif //MATLAB #endif //MATLAB

View File

@ -26,10 +26,10 @@
TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim5;
TIM_HandleTypeDef htim8; TIM_HandleTypeDef htim8;
TIM_HandleTypeDef htim11; TIM_HandleTypeDef htim11;
TIM_HandleTypeDef htim12; TIM_HandleTypeDef htim12;
TIM_HandleTypeDef htim13;
/* TIM1 init function */ /* TIM1 init function */
void MX_TIM1_Init(void) void MX_TIM1_Init(void)
@ -170,6 +170,49 @@ void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */
HAL_TIM_MspPostInit(&htim3); HAL_TIM_MspPostInit(&htim3);
}
/* TIM5 init function */
void MX_TIM5_Init(void)
{
/* USER CODE BEGIN TIM5_Init 0 */
/* USER CODE END TIM5_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_IC_InitTypeDef sConfigIC = {0};
/* USER CODE BEGIN TIM5_Init 1 */
/* USER CODE END TIM5_Init 1 */
htim5.Instance = TIM5;
htim5.Init.Prescaler = 90-1;
htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
htim5.Init.Period = 4294967295;
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_IC_Init(&htim5) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
if (HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM5_Init 2 */
/* USER CODE END TIM5_Init 2 */
} }
/* TIM8 init function */ /* TIM8 init function */
void MX_TIM8_Init(void) void MX_TIM8_Init(void)
@ -270,32 +313,6 @@ void MX_TIM12_Init(void)
/* USER CODE END TIM12_Init 2 */ /* USER CODE END TIM12_Init 2 */
}
/* TIM13 init function */
void MX_TIM13_Init(void)
{
/* USER CODE BEGIN TIM13_Init 0 */
/* USER CODE END TIM13_Init 0 */
/* USER CODE BEGIN TIM13_Init 1 */
/* USER CODE END TIM13_Init 1 */
htim13.Instance = TIM13;
htim13.Init.Prescaler = 90-1;
htim13.Init.CounterMode = TIM_COUNTERMODE_UP;
htim13.Init.Period = 65535;
htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim13.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim13) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM13_Init 2 */
/* USER CODE END TIM13_Init 2 */
} }
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
@ -360,16 +377,34 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM12_MspInit 1 */ /* USER CODE END TIM12_MspInit 1 */
} }
else if(tim_baseHandle->Instance==TIM13) }
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef* tim_icHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(tim_icHandle->Instance==TIM5)
{ {
/* USER CODE BEGIN TIM13_MspInit 0 */ /* USER CODE BEGIN TIM5_MspInit 0 */
/* USER CODE END TIM13_MspInit 0 */ /* USER CODE END TIM5_MspInit 0 */
/* TIM13 clock enable */ /* TIM5 clock enable */
__HAL_RCC_TIM13_CLK_ENABLE(); __HAL_RCC_TIM5_CLK_ENABLE();
/* USER CODE BEGIN TIM13_MspInit 1 */
/* USER CODE END TIM13_MspInit 1 */ __HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM5 GPIO Configuration
PA0/WKUP ------> TIM5_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM5;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN TIM5_MspInit 1 */
/* USER CODE END TIM5_MspInit 1 */
} }
} }
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
@ -485,16 +520,27 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM12_MspDeInit 1 */ /* USER CODE END TIM12_MspDeInit 1 */
} }
else if(tim_baseHandle->Instance==TIM13) }
void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef* tim_icHandle)
{
if(tim_icHandle->Instance==TIM5)
{ {
/* USER CODE BEGIN TIM13_MspDeInit 0 */ /* USER CODE BEGIN TIM5_MspDeInit 0 */
/* USER CODE END TIM13_MspDeInit 0 */ /* USER CODE END TIM5_MspDeInit 0 */
/* Peripheral clock disable */ /* Peripheral clock disable */
__HAL_RCC_TIM13_CLK_DISABLE(); __HAL_RCC_TIM5_CLK_DISABLE();
/* USER CODE BEGIN TIM13_MspDeInit 1 */
/* USER CODE END TIM13_MspDeInit 1 */ /**TIM5 GPIO Configuration
PA0/WKUP ------> TIM5_CH1
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
/* USER CODE BEGIN TIM5_MspDeInit 1 */
/* USER CODE END TIM5_MspDeInit 1 */
} }
} }

View File

@ -16,6 +16,7 @@ PowerMonitor_t pm;
*/ */
int UPP_Init(void) int UPP_Init(void)
{ {
HAL_TIM_Base_Start(&ustim);
PowerMonitor_Init(&pm); PowerMonitor_Init(&pm);
return 0; return 0;
} }

View File

@ -1283,7 +1283,7 @@
<Group> <Group>
<GroupName>::Compiler</GroupName> <GroupName>::Compiler</GroupName>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>1</RteFlg> <RteFlg>1</RteFlg>

View File

@ -339,7 +339,7 @@
<v6Rtti>0</v6Rtti> <v6Rtti>0</v6Rtti>
<VariousControls> <VariousControls>
<MiscControls></MiscControls> <MiscControls></MiscControls>
<Define>USE_HAL_DRIVER,STM32F427xx</Define> <Define>USE_HAL_DRIVER,STM32F427xx, ARM_MATH_CM4</Define>
<Undefine></Undefine> <Undefine></Undefine>
<IncludePath>../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../AllLibs/ExtMemory/Inc;../AllLibs/Modbus/Inc;../AllLibs/MyLibs/MyLibs/Inc;../AllLibs/MyLibs/RTT;../AllLibs/PeriphGeneral/Inc;../Core/Configs;../Core/PowerMonitor;../Core/Thyristors;../Core/UPP</IncludePath> <IncludePath>../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../AllLibs/ExtMemory/Inc;../AllLibs/Modbus/Inc;../AllLibs/MyLibs/MyLibs/Inc;../AllLibs/MyLibs/RTT;../AllLibs/PeriphGeneral/Inc;../Core/Configs;../Core/PowerMonitor;../Core/Thyristors;../Core/UPP</IncludePath>
</VariousControls> </VariousControls>

View File

@ -55,10 +55,10 @@ Mcu.Family=STM32F4
Mcu.IP0=ADC3 Mcu.IP0=ADC3
Mcu.IP1=CAN1 Mcu.IP1=CAN1
Mcu.IP10=TIM3 Mcu.IP10=TIM3
Mcu.IP11=TIM8 Mcu.IP11=TIM5
Mcu.IP12=TIM11 Mcu.IP12=TIM8
Mcu.IP13=TIM12 Mcu.IP13=TIM11
Mcu.IP14=TIM13 Mcu.IP14=TIM12
Mcu.IP15=USART3 Mcu.IP15=USART3
Mcu.IP16=USART6 Mcu.IP16=USART6
Mcu.IP2=DMA Mcu.IP2=DMA
@ -80,64 +80,64 @@ Mcu.Pin12=PF10
Mcu.Pin13=PH0/OSC_IN Mcu.Pin13=PH0/OSC_IN
Mcu.Pin14=PH1/OSC_OUT Mcu.Pin14=PH1/OSC_OUT
Mcu.Pin15=PC0 Mcu.Pin15=PC0
Mcu.Pin16=PA4 Mcu.Pin16=PA0/WKUP
Mcu.Pin17=PA5 Mcu.Pin17=PA4
Mcu.Pin18=PA6 Mcu.Pin18=PA5
Mcu.Pin19=PB0 Mcu.Pin19=PA6
Mcu.Pin2=PE4 Mcu.Pin2=PE4
Mcu.Pin20=PB1 Mcu.Pin20=PB0
Mcu.Pin21=PF11 Mcu.Pin21=PB1
Mcu.Pin22=PB10 Mcu.Pin22=PF11
Mcu.Pin23=PB11 Mcu.Pin23=PB10
Mcu.Pin24=PB13 Mcu.Pin24=PB11
Mcu.Pin25=PG6 Mcu.Pin25=PB13
Mcu.Pin26=PC6 Mcu.Pin26=PG6
Mcu.Pin27=PC7 Mcu.Pin27=PC6
Mcu.Pin28=PC8 Mcu.Pin28=PC7
Mcu.Pin29=PC9 Mcu.Pin29=PC8
Mcu.Pin3=PE5 Mcu.Pin3=PE5
Mcu.Pin30=PA8 Mcu.Pin30=PC9
Mcu.Pin31=PA9 Mcu.Pin31=PA8
Mcu.Pin32=PA10 Mcu.Pin32=PA9
Mcu.Pin33=PA11 Mcu.Pin33=PA10
Mcu.Pin34=PA12 Mcu.Pin34=PA11
Mcu.Pin35=PA13 Mcu.Pin35=PA12
Mcu.Pin36=PA14 Mcu.Pin36=PA13
Mcu.Pin37=PA15 Mcu.Pin37=PA14
Mcu.Pin38=PC10 Mcu.Pin38=PA15
Mcu.Pin39=PC11 Mcu.Pin39=PC10
Mcu.Pin4=PE6 Mcu.Pin4=PE6
Mcu.Pin40=PC12 Mcu.Pin40=PC11
Mcu.Pin41=PD2 Mcu.Pin41=PC12
Mcu.Pin42=PD3 Mcu.Pin42=PD2
Mcu.Pin43=PD6 Mcu.Pin43=PD3
Mcu.Pin44=PG12 Mcu.Pin44=PD6
Mcu.Pin45=PG15 Mcu.Pin45=PG12
Mcu.Pin46=PB3 Mcu.Pin46=PG15
Mcu.Pin47=PB6 Mcu.Pin47=PB3
Mcu.Pin48=PB7 Mcu.Pin48=PB6
Mcu.Pin49=PB8 Mcu.Pin49=PB7
Mcu.Pin5=PC13 Mcu.Pin5=PC13
Mcu.Pin50=PB9 Mcu.Pin50=PB8
Mcu.Pin51=PE0 Mcu.Pin51=PB9
Mcu.Pin52=PE1 Mcu.Pin52=PE0
Mcu.Pin53=VP_IWDG_VS_IWDG Mcu.Pin53=PE1
Mcu.Pin54=VP_RTC_VS_RTC_Activate Mcu.Pin54=VP_IWDG_VS_IWDG
Mcu.Pin55=VP_RTC_VS_RTC_Calendar Mcu.Pin55=VP_RTC_VS_RTC_Activate
Mcu.Pin56=VP_SYS_VS_tim14 Mcu.Pin56=VP_RTC_VS_RTC_Calendar
Mcu.Pin57=VP_TIM1_VS_ClockSourceINT Mcu.Pin57=VP_SYS_VS_tim14
Mcu.Pin58=VP_TIM3_VS_ClockSourceINT Mcu.Pin58=VP_TIM1_VS_ClockSourceINT
Mcu.Pin59=VP_TIM8_VS_ClockSourceINT Mcu.Pin59=VP_TIM3_VS_ClockSourceINT
Mcu.Pin6=PC14/OSC32_IN Mcu.Pin6=PC14/OSC32_IN
Mcu.Pin60=VP_TIM11_VS_ClockSourceINT Mcu.Pin60=VP_TIM8_VS_ClockSourceINT
Mcu.Pin61=VP_TIM12_VS_ClockSourceINT Mcu.Pin61=VP_TIM11_VS_ClockSourceINT
Mcu.Pin62=VP_TIM13_VS_ClockSourceINT Mcu.Pin62=VP_TIM12_VS_ClockSourceINT
Mcu.Pin7=PC15/OSC32_OUT Mcu.Pin7=PC15/OSC32_OUT
Mcu.Pin8=PF6 Mcu.Pin8=PF6
Mcu.Pin9=PF7 Mcu.Pin9=PF7
Mcu.PinsNb=63 Mcu.PinsNb=63
Mcu.ThirdPartyNb=0 Mcu.ThirdPartyNb=0
Mcu.UserConstants=mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim8;hpwm2,htim2;mb_dbg_huart,huart6;ustim,htim13;hpwm1,htim1 Mcu.UserConstants=mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim8;hpwm2,htim2;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1;usTick,ustim.Instance->CNT
Mcu.UserName=STM32F427ZGTx Mcu.UserName=STM32F427ZGTx
MxCube.Version=6.12.1 MxCube.Version=6.12.1
MxDb.Version=DB.6.0.121 MxDb.Version=DB.6.0.121
@ -156,6 +156,7 @@ NVIC.TIM8_TRG_COM_TIM14_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true
NVIC.TimeBase=TIM8_TRG_COM_TIM14_IRQn NVIC.TimeBase=TIM8_TRG_COM_TIM14_IRQn
NVIC.TimeBaseIP=TIM14 NVIC.TimeBaseIP=TIM14
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA0/WKUP.Signal=S_TIM5_CH1
PA10.GPIOParameters=GPIO_Label PA10.GPIOParameters=GPIO_Label
PA10.GPIO_Label=PWM3 PA10.GPIO_Label=PWM3
PA10.Locked=true PA10.Locked=true
@ -394,7 +395,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath= ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-true-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC3_Init-ADC3-false-HAL-true,5-MX_USART3_UART_Init-USART3-false-HAL-true,6-MX_CAN1_Init-CAN1-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_TIM13_Init-TIM13-false-HAL-true,9-MX_RTC_Init-RTC-false-HAL-true,10-MX_TIM1_Init-TIM1-false-HAL-true,11-MX_TIM3_Init-TIM3-false-HAL-true,12-MX_USART6_UART_Init-USART6-false-HAL-true,13-MX_SPI3_Init-SPI3-false-HAL-true,14-MX_TIM11_Init-TIM11-false-HAL-true,15-MX_TIM12_Init-TIM12-false-HAL-true,16-MX_TIM8_Init-TIM8-false-HAL-true ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-true-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_ADC3_Init-ADC3-false-HAL-true,5-MX_USART3_UART_Init-USART3-false-HAL-true,6-MX_CAN1_Init-CAN1-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_TIM13_Init-TIM13-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_TIM3_Init-TIM3-false-HAL-true,11-MX_USART6_UART_Init-USART6-false-HAL-true,12-MX_SPI3_Init-SPI3-false-HAL-true,13-MX_TIM11_Init-TIM11-false-HAL-true,14-MX_TIM12_Init-TIM12-false-HAL-true,15-MX_TIM8_Init-TIM8-false-HAL-true
RCC.48MHZClocksFreq_Value=90000000 RCC.48MHZClocksFreq_Value=90000000
RCC.AHBFreq_Value=180000000 RCC.AHBFreq_Value=180000000
RCC.APB1CLKDivider=RCC_HCLK_DIV4 RCC.APB1CLKDivider=RCC_HCLK_DIV4
@ -453,6 +454,8 @@ SH.S_TIM3_CH3.0=TIM3_CH3,PWM Generation3 CH3
SH.S_TIM3_CH3.ConfNb=1 SH.S_TIM3_CH3.ConfNb=1
SH.S_TIM3_CH4.0=TIM3_CH4,PWM Generation4 CH4 SH.S_TIM3_CH4.0=TIM3_CH4,PWM Generation4 CH4
SH.S_TIM3_CH4.ConfNb=1 SH.S_TIM3_CH4.ConfNb=1
SH.S_TIM5_CH1.0=TIM5_CH1,Input_Capture1_from_TI1
SH.S_TIM5_CH1.ConfNb=1
SPI3.CalculateBaudRate=22.5 MBits/s SPI3.CalculateBaudRate=22.5 MBits/s
SPI3.Direction=SPI_DIRECTION_2LINES SPI3.Direction=SPI_DIRECTION_2LINES
SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate
@ -468,11 +471,12 @@ TIM11.IPParameters=Prescaler
TIM11.Prescaler=180-1 TIM11.Prescaler=180-1
TIM12.IPParameters=Prescaler TIM12.IPParameters=Prescaler
TIM12.Prescaler=90-1 TIM12.Prescaler=90-1
TIM13.IPParameters=Prescaler
TIM13.Prescaler=90-1
TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4
TIM5.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1
TIM5.IPParameters=Channel-Input_Capture1_from_TI1,Prescaler
TIM5.Prescaler=90-1
TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger
TIM8.Period=1800-1 TIM8.Period=1800-1
TIM8.Prescaler=0 TIM8.Prescaler=0
@ -494,8 +498,6 @@ VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT
VP_TIM12_VS_ClockSourceINT.Mode=Internal VP_TIM12_VS_ClockSourceINT.Mode=Internal
VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT
VP_TIM13_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM13_VS_ClockSourceINT.Signal=TIM13_VS_ClockSourceINT
VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM3_VS_ClockSourceINT.Mode=Internal VP_TIM3_VS_ClockSourceINT.Mode=Internal