diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.h b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.h index 15572a8..bca554e 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.h +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.h @@ -72,7 +72,7 @@ struct TIM_Sim int Updated; // счетчик таймера double tx_cnt; // счетчик таймера double tx_step; // шаг счета за один шаг симуляции - int RELOAD; // буфер, если PRELOAD = 1 + long long RELOAD; // буфер, если PRELOAD = 1 struct Channels_Sim Channels; // структура для симуляции каналов }; ///////////////////////////////////////////////////////////////////// diff --git a/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c b/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c index bd6379c..4107892 100644 --- a/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c +++ b/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c @@ -49,7 +49,7 @@ void deInitialize_MCU(void) ClearStruct(htim8); ClearStruct(htim11); ClearStruct(htim12); - ClearStruct(htim13); + ClearStruct(htim5); ClearStruct(hadc3); ClearStruct(hdma_adc3); } diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper.c b/MATLAB/MCU_Wrapper/mcu_wrapper.c index 6a07287..d654635 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper.c +++ b/MATLAB/MCU_Wrapper/mcu_wrapper.c @@ -37,14 +37,16 @@ const int inOffsets[IN_PORT_NUMB] = { */ const int outLengths[OUT_PORT_NUMB] = { THYR_PORT_1_WIDTH, - OUT_PORT_2_WIDTH + OUT_PORT_2_WIDTH, + OUT_PORT_3_WIDTH }; /** * @brief Таблица смещений в выходном массиве OUT */ const int outOffsets[OUT_PORT_NUMB] = { OFFSET_OUT_ARRAY_1, - OFFSET_OUT_ARRAY_2 + OFFSET_OUT_ARRAY_2, + OFFSET_OUT_ARRAY_3 }; // INPUT/OUTPUTS AUTO-PARAMS END diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h index 93edc3f..534cd4a 100644 --- a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h +++ b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h @@ -53,9 +53,10 @@ #define ADC_PORT_1_WIDTH 6 #define IN_PORT_2_WIDTH 1 -#define OUT_PORT_NUMB 2 +#define OUT_PORT_NUMB 3 #define THYR_PORT_1_WIDTH 6 #define OUT_PORT_2_WIDTH 6 +#define OUT_PORT_3_WIDTH 16 // INPUT/OUTPUTS PARAMS END /** WRAPPER_CONF @@ -94,11 +95,12 @@ #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_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 diff --git a/MATLAB/app_wrapper/app_init.c b/MATLAB/app_wrapper/app_init.c index 854cc3a..176d679 100644 --- a/MATLAB/app_wrapper/app_init.c +++ b/MATLAB/app_wrapper/app_init.c @@ -21,6 +21,7 @@ void app_init(void) { MX_TIM1_Init(); MX_TIM3_Init(); MX_TIM8_Init(); + MX_TIM5_Init(); MX_ADC3_Init(); UPP_Init(); UPP_PreWhile(); diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 170e597..2f0e131 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -54,6 +54,10 @@ void app_writeOutputBuffer(real_T* Buffer) { { 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; @@ -61,5 +65,25 @@ void app_writeOutputBuffer(real_T* Buffer) { { 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 } \ No newline at end of file diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 50d8c6f..2f5d6e8 100644 Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ diff --git a/UPP/AllLibs/MyLibs b/UPP/AllLibs/MyLibs index 9b9969d..48dacce 160000 --- a/UPP/AllLibs/MyLibs +++ b/UPP/AllLibs/MyLibs @@ -1 +1 @@ -Subproject commit 9b9969dd7ce85e3e317e6fef71c9e1e591d52e46 +Subproject commit 48daccef2d1fefe965f020e5b342ed683fe40a62 diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 38c29af..5c60f54 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -14,10 +14,24 @@ #define _UPP_CONFIG_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_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_ diff --git a/UPP/Core/Inc/main.h b/UPP/Core/Inc/main.h index e875bd5..a2211ec 100644 --- a/UPP/Core/Inc/main.h +++ b/UPP/Core/Inc/main.h @@ -40,7 +40,6 @@ extern "C" { /* Exported types ------------------------------------------------------------*/ /* USER CODE BEGIN ET */ - /* USER CODE END ET */ /* Exported constants --------------------------------------------------------*/ @@ -74,8 +73,9 @@ extern __IO uint32_t micros; #define adc_tim htim8 #define hpwm2 htim2 #define mb_dbg_huart huart6 -#define ustim htim13 +#define ustim htim5 #define hpwm1 htim1 +#define usTick ustim.Instance->CNT #define UM_LED_GREEN2_Pin GPIO_PIN_2 #define UM_LED_GREEN2_GPIO_Port GPIOE #define CEN_O_Pin GPIO_PIN_3 @@ -168,7 +168,7 @@ extern __IO uint32_t micros; #define UM_LED_GREEN1_GPIO_Port GPIOE /* USER CODE BEGIN Private defines */ - +extern TIM_HandleTypeDef ustim; /* USER CODE END Private defines */ #ifdef __cplusplus diff --git a/UPP/Core/Inc/tim.h b/UPP/Core/Inc/tim.h index 2dfa292..6a9d43b 100644 --- a/UPP/Core/Inc/tim.h +++ b/UPP/Core/Inc/tim.h @@ -36,24 +36,24 @@ extern TIM_HandleTypeDef htim1; extern TIM_HandleTypeDef htim3; +extern TIM_HandleTypeDef htim5; + extern TIM_HandleTypeDef htim8; extern TIM_HandleTypeDef htim11; extern TIM_HandleTypeDef htim12; -extern TIM_HandleTypeDef htim13; - /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void MX_TIM1_Init(void); void MX_TIM3_Init(void); +void MX_TIM5_Init(void); void MX_TIM8_Init(void); void MX_TIM11_Init(void); void MX_TIM12_Init(void); -void MX_TIM13_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); diff --git a/UPP/Core/PowerMonitor/adc_tools.c b/UPP/Core/PowerMonitor/adc_tools.c index fc49b7a..cd95ac9 100644 --- a/UPP/Core/PowerMonitor/adc_tools.c +++ b/UPP/Core/PowerMonitor/adc_tools.c @@ -7,7 +7,31 @@ ******************************************************************************/ #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) @@ -20,11 +44,17 @@ static void ADC_EnableAllFilters(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++) { - Filter_Init(&adc->filter[i], Filter_Coef); + Filter_Init(&adc->filter[i], Filter_Initializator); } - FilterLUTInt_Init(&adc->temp_map[0], (int32_t *)adc_temp_quants, (int32_t *)adc_temp_vals, @@ -147,16 +177,6 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc) uint16_t *raw = adc->RawData; 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++) { @@ -165,6 +185,17 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc) 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++) { @@ -221,7 +252,7 @@ void ADC_UpdateStatistics(ADC_Periodic_t *adc, uint8_t channel, ADC_StatLevel_t stat->SampleCount++; // Расчет Avg/RMS (периодически или по запросу) - if (stat->SampleCount >= 1000) { // Пример: пересчет каждые 1000 samples + if (stat->SampleCount >= 4000) { // Пример: пересчет каждые 1000 samples stat->Avg = stat->Sum / stat->SampleCount; stat->RMS = sqrtf(stat->SumSquares / stat->SampleCount); // Сброс накопителей diff --git a/UPP/Core/PowerMonitor/adc_tools.h b/UPP/Core/PowerMonitor/adc_tools.h index 47fa0f6..ad5c6e9 100644 --- a/UPP/Core/PowerMonitor/adc_tools.h +++ b/UPP/Core/PowerMonitor/adc_tools.h @@ -51,10 +51,9 @@ static const int32_t adc_temp_vals[] = ADC_TEMPERATURES; static const int32_t adc_temp_quants[] = ADC_TEMPERATURES_QUANTS; -#define Filter_t FilterMedianInt_t -#define Filter_Init FilterMedianInt_Init -#define Filter_Process FilterMedianInt_Process -#define Filter_Coef 10 +#define Filter_t FilterMedian_t +#define Filter_Init FilterMedian_Init +#define Filter_Initializator 5 /** * @brief Коэфициенты канала АЦП для пересчета в единицы измерения @@ -88,8 +87,6 @@ typedef struct float SumSquares; ///< Накопитель для RMS }ADC_Statistics; - - /** * @brief Хендл АЦП */ @@ -104,6 +101,7 @@ typedef struct ADC_Coefs_t Coefs[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t для регулярных каналов (не температуры) Filter_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП + FilterLUTInt_t temp_map[2]; ///< Коррекция нелинейности датчиков температуры float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах) diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index d456648..c16178a 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -15,23 +15,25 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm) if(ADC_Init(&hpm->adc, &adc_tim, &hadc3) != HAL_OK) 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; - 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; - 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; - 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; - 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; - if(ZC_ConfigChannel(&hpm->zc, ADC_CHANNEL_UBA, ZC_BOTH_EDGES) != HAL_OK) - return HAL_ERROR; - if(ZC_ConfigChannel(&hpm->zc, ADC_CHANNEL_UAC, 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, 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; } @@ -49,15 +51,31 @@ HAL_StatusTypeDef PowerMonitor_Start(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); - 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->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; } \ No newline at end of file diff --git a/UPP/Core/PowerMonitor/power_monitor.h b/UPP/Core/PowerMonitor/power_monitor.h index ad34cf0..858a8a0 100644 --- a/UPP/Core/PowerMonitor/power_monitor.h +++ b/UPP/Core/PowerMonitor/power_monitor.h @@ -14,12 +14,12 @@ typedef struct { ADC_Periodic_t adc; ZeroCross_Handle_t zc; - uint32_t ZC_Detected[ADC_NUMB_OF_U_CHANNELS]; + uint32_t ZC_Detected[3]; float U[3]; + float F[3]; float I[3]; - float T[3]; - + float T[3]; }PowerMonitor_t; extern PowerMonitor_t pm; diff --git a/UPP/Core/PowerMonitor/zero_cross.c b/UPP/Core/PowerMonitor/zero_cross.c index 6322067..e6ae71f 100644 --- a/UPP/Core/PowerMonitor/zero_cross.c +++ b/UPP/Core/PowerMonitor/zero_cross.c @@ -18,7 +18,7 @@ * @return HAL Status. */ 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) { 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) { return; - } - + } if (channel >= zc->NumChannels) { return; } + int zc_detected = 0; ZC_Channel_t *zc_ch = &zc->Channel[channel]; zc_ch->CurrentValue = value; // Фильтрация дребезга - if(zc_ch->DebounceCounter) + if(zc_ch->DebounceCounter > 0) { zc_ch->DebounceCounter--; return; @@ -112,43 +112,59 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin // Детектирование rising edge (отрицательное -> положительное) 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->LastCrossTime != 0) { - // Расчет периода и частоты - zc_ch->Period = timestamp - zc_ch->LastCrossTime; - if (zc_ch->Period > 0) { - zc_ch->Frequency = 1000000.0f / zc_ch->Period; + if(zc->DebounceSamples) + { + if(zc_ch->DebounceCounter == 0) + { + zc_ch->DebounceCounter = zc->DebounceSamples; } } - zc_ch->LastCrossTime = timestamp; - zc_ch->CrossCount++; - zc_ch->StableState = 1; + zc_detected = 1; } } // Детектирование falling edge (положительное -> отрицательное) 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->LastCrossTime != 0) { - // Расчет периода и частоты - zc_ch->Period = timestamp - zc_ch->LastCrossTime; - if (zc_ch->Period > 0) { - zc_ch->Frequency = 1000000.0f / zc_ch->Period; + if(zc->DebounceSamples) + { + if(zc_ch->DebounceCounter == 0) + { + zc_ch->DebounceCounter = zc->DebounceSamples; } } - zc_ch->LastCrossTime = timestamp; - zc_ch->CrossCount++; - zc_ch->StableState = 0; + zc_detected = -1; } } + 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)) { @@ -162,7 +178,7 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin * @param values Массив значений сигналов * @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) { 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++) { 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; } } -} - -/** - * @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; } \ No newline at end of file diff --git a/UPP/Core/PowerMonitor/zero_cross.h b/UPP/Core/PowerMonitor/zero_cross.h index a109023..fc91202 100644 --- a/UPP/Core/PowerMonitor/zero_cross.h +++ b/UPP/Core/PowerMonitor/zero_cross.h @@ -72,7 +72,7 @@ ZC_Init(&zc_low_sensitivity, 2, 0.5f, 2); // 0.5 гистерезис, 2 samp #include "main.h" #ifndef ZC_MAX_CHANNELS -#define ZC_MAX_CHANNELS 8 ///< Максимальное количество каналов на хендл +#define ZC_MAX_CHANNELS 3 ///< Максимальное количество каналов на хендл #endif /** @@ -91,7 +91,7 @@ typedef struct { uint32_t CrossCount; ///< Счетчик переходов float LastValue; ///< Предыдущее значение float CurrentValue; ///< Текущее значение - uint8_t DebounceCounter; ///< Счетчик антидребезга + uint16_t DebounceCounter; ///< Счетчик антидребезга uint8_t StableState; ///< Стабильное состояние (0=отриц, 1=полож) uint32_t LastCrossTime; ///< Время последнего перехода uint32_t Period; ///< Период сигнала (в тактах таймера) @@ -106,16 +106,19 @@ typedef struct { ZC_Channel_t Channel[ZC_MAX_CHANNELS]; ///< Каналы @ref ZC_Channel_t uint8_t NumChannels; ///< Количество используемых каналов для этого хендла float Hysteresis; ///< Гистерезис для избежания дребезга - uint8_t DebounceSamples; ///< Количество samples для антидребезга + uint16_t DebounceSamples; ///< Количество samples для антидребезга + struct { unsigned Initialized:1; ///< Флаг инициализации unsigned Monitoring:1; ///< Флаг активности мониторинга } f; ///< Флаги + + uint32_t LastTick; ///< Послднее время вызова } ZeroCross_Handle_t; /* Инициализация детектора нуля с индивидуальными настройками */ 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, @@ -126,7 +129,7 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uint32_t timestamp); /* Пакетная обработка всех каналов */ -void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float values[], +void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values, uint32_t timestamp); /* Получение частоты сигнала */ diff --git a/UPP/Core/Src/main.c b/UPP/Core/Src/main.c index bfbb14c..16e30e8 100644 --- a/UPP/Core/Src/main.c +++ b/UPP/Core/Src/main.c @@ -98,7 +98,6 @@ int main(void) MX_USART3_UART_Init(); MX_CAN1_Init(); MX_IWDG_Init(); - MX_TIM13_Init(); MX_RTC_Init(); MX_TIM1_Init(); MX_TIM3_Init(); @@ -107,6 +106,7 @@ int main(void) MX_TIM11_Init(); MX_TIM12_Init(); MX_TIM8_Init(); + MX_TIM5_Init(); /* USER CODE BEGIN 2 */ #else //MATLAB #endif //MATLAB diff --git a/UPP/Core/Src/tim.c b/UPP/Core/Src/tim.c index 943d2fa..a9cc642 100644 --- a/UPP/Core/Src/tim.c +++ b/UPP/Core/Src/tim.c @@ -26,10 +26,10 @@ TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim5; TIM_HandleTypeDef htim8; TIM_HandleTypeDef htim11; TIM_HandleTypeDef htim12; -TIM_HandleTypeDef htim13; /* TIM1 init function */ void MX_TIM1_Init(void) @@ -170,6 +170,49 @@ void MX_TIM3_Init(void) /* USER CODE END TIM3_Init 2 */ 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 */ void MX_TIM8_Init(void) @@ -270,32 +313,6 @@ void MX_TIM12_Init(void) /* 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) @@ -360,16 +377,34 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* 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 */ - /* TIM13 clock enable */ - __HAL_RCC_TIM13_CLK_ENABLE(); - /* USER CODE BEGIN TIM13_MspInit 1 */ + /* USER CODE END TIM5_MspInit 0 */ + /* TIM5 clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); - /* 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) @@ -485,16 +520,27 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) /* 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 */ - __HAL_RCC_TIM13_CLK_DISABLE(); - /* USER CODE BEGIN TIM13_MspDeInit 1 */ + __HAL_RCC_TIM5_CLK_DISABLE(); - /* 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 */ } } diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 7f56710..052684c 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -16,6 +16,7 @@ PowerMonitor_t pm; */ int UPP_Init(void) { + HAL_TIM_Base_Start(&ustim); PowerMonitor_Init(&pm); return 0; } diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index 082976d..ba12a47 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -1283,7 +1283,7 @@ ::Compiler - 0 + 1 0 0 1 diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index 02feebd..6284731 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -339,7 +339,7 @@ 0 - USE_HAL_DRIVER,STM32F427xx + USE_HAL_DRIVER,STM32F427xx, ARM_MATH_CM4 ../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 diff --git a/UPP/UPP.ioc b/UPP/UPP.ioc index 78d8d19..af2d530 100644 --- a/UPP/UPP.ioc +++ b/UPP/UPP.ioc @@ -55,10 +55,10 @@ Mcu.Family=STM32F4 Mcu.IP0=ADC3 Mcu.IP1=CAN1 Mcu.IP10=TIM3 -Mcu.IP11=TIM8 -Mcu.IP12=TIM11 -Mcu.IP13=TIM12 -Mcu.IP14=TIM13 +Mcu.IP11=TIM5 +Mcu.IP12=TIM8 +Mcu.IP13=TIM11 +Mcu.IP14=TIM12 Mcu.IP15=USART3 Mcu.IP16=USART6 Mcu.IP2=DMA @@ -80,64 +80,64 @@ Mcu.Pin12=PF10 Mcu.Pin13=PH0/OSC_IN Mcu.Pin14=PH1/OSC_OUT Mcu.Pin15=PC0 -Mcu.Pin16=PA4 -Mcu.Pin17=PA5 -Mcu.Pin18=PA6 -Mcu.Pin19=PB0 +Mcu.Pin16=PA0/WKUP +Mcu.Pin17=PA4 +Mcu.Pin18=PA5 +Mcu.Pin19=PA6 Mcu.Pin2=PE4 -Mcu.Pin20=PB1 -Mcu.Pin21=PF11 -Mcu.Pin22=PB10 -Mcu.Pin23=PB11 -Mcu.Pin24=PB13 -Mcu.Pin25=PG6 -Mcu.Pin26=PC6 -Mcu.Pin27=PC7 -Mcu.Pin28=PC8 -Mcu.Pin29=PC9 +Mcu.Pin20=PB0 +Mcu.Pin21=PB1 +Mcu.Pin22=PF11 +Mcu.Pin23=PB10 +Mcu.Pin24=PB11 +Mcu.Pin25=PB13 +Mcu.Pin26=PG6 +Mcu.Pin27=PC6 +Mcu.Pin28=PC7 +Mcu.Pin29=PC8 Mcu.Pin3=PE5 -Mcu.Pin30=PA8 -Mcu.Pin31=PA9 -Mcu.Pin32=PA10 -Mcu.Pin33=PA11 -Mcu.Pin34=PA12 -Mcu.Pin35=PA13 -Mcu.Pin36=PA14 -Mcu.Pin37=PA15 -Mcu.Pin38=PC10 -Mcu.Pin39=PC11 +Mcu.Pin30=PC9 +Mcu.Pin31=PA8 +Mcu.Pin32=PA9 +Mcu.Pin33=PA10 +Mcu.Pin34=PA11 +Mcu.Pin35=PA12 +Mcu.Pin36=PA13 +Mcu.Pin37=PA14 +Mcu.Pin38=PA15 +Mcu.Pin39=PC10 Mcu.Pin4=PE6 -Mcu.Pin40=PC12 -Mcu.Pin41=PD2 -Mcu.Pin42=PD3 -Mcu.Pin43=PD6 -Mcu.Pin44=PG12 -Mcu.Pin45=PG15 -Mcu.Pin46=PB3 -Mcu.Pin47=PB6 -Mcu.Pin48=PB7 -Mcu.Pin49=PB8 +Mcu.Pin40=PC11 +Mcu.Pin41=PC12 +Mcu.Pin42=PD2 +Mcu.Pin43=PD3 +Mcu.Pin44=PD6 +Mcu.Pin45=PG12 +Mcu.Pin46=PG15 +Mcu.Pin47=PB3 +Mcu.Pin48=PB6 +Mcu.Pin49=PB7 Mcu.Pin5=PC13 -Mcu.Pin50=PB9 -Mcu.Pin51=PE0 -Mcu.Pin52=PE1 -Mcu.Pin53=VP_IWDG_VS_IWDG -Mcu.Pin54=VP_RTC_VS_RTC_Activate -Mcu.Pin55=VP_RTC_VS_RTC_Calendar -Mcu.Pin56=VP_SYS_VS_tim14 -Mcu.Pin57=VP_TIM1_VS_ClockSourceINT -Mcu.Pin58=VP_TIM3_VS_ClockSourceINT -Mcu.Pin59=VP_TIM8_VS_ClockSourceINT +Mcu.Pin50=PB8 +Mcu.Pin51=PB9 +Mcu.Pin52=PE0 +Mcu.Pin53=PE1 +Mcu.Pin54=VP_IWDG_VS_IWDG +Mcu.Pin55=VP_RTC_VS_RTC_Activate +Mcu.Pin56=VP_RTC_VS_RTC_Calendar +Mcu.Pin57=VP_SYS_VS_tim14 +Mcu.Pin58=VP_TIM1_VS_ClockSourceINT +Mcu.Pin59=VP_TIM3_VS_ClockSourceINT Mcu.Pin6=PC14/OSC32_IN -Mcu.Pin60=VP_TIM11_VS_ClockSourceINT -Mcu.Pin61=VP_TIM12_VS_ClockSourceINT -Mcu.Pin62=VP_TIM13_VS_ClockSourceINT +Mcu.Pin60=VP_TIM8_VS_ClockSourceINT +Mcu.Pin61=VP_TIM11_VS_ClockSourceINT +Mcu.Pin62=VP_TIM12_VS_ClockSourceINT Mcu.Pin7=PC15/OSC32_OUT Mcu.Pin8=PF6 Mcu.Pin9=PF7 Mcu.PinsNb=63 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 MxCube.Version=6.12.1 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.TimeBaseIP=TIM14 NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA0/WKUP.Signal=S_TIM5_CH1 PA10.GPIOParameters=GPIO_Label PA10.GPIO_Label=PWM3 PA10.Locked=true @@ -394,7 +395,7 @@ ProjectManager.ToolChainLocation= ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptBeforePath= 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.AHBFreq_Value=180000000 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_CH4.0=TIM3_CH4,PWM Generation4 CH4 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.Direction=SPI_DIRECTION_2LINES SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate @@ -468,11 +471,12 @@ TIM11.IPParameters=Prescaler TIM11.Prescaler=180-1 TIM12.IPParameters=Prescaler TIM12.Prescaler=90-1 -TIM13.IPParameters=Prescaler -TIM13.Prescaler=90-1 TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 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.Period=1800-1 TIM8.Prescaler=0 @@ -494,8 +498,6 @@ VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT VP_TIM12_VS_ClockSourceINT.Mode=Internal 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.Signal=TIM1_VS_ClockSourceINT VP_TIM3_VS_ClockSourceINT.Mode=Internal