diff --git a/UPP/AllLibs/PeriphGeneral b/UPP/AllLibs/PeriphGeneral index 2344926..74d692f 160000 --- a/UPP/AllLibs/PeriphGeneral +++ b/UPP/AllLibs/PeriphGeneral @@ -1 +1 @@ -Subproject commit 2344926f92f837703ae7a6d484daf6ca3210472a +Subproject commit 74d692fdd5c92c6b624391b89f397e4ffcb823cc diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 9769d7b..db3e6fd 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -111,11 +111,12 @@ /* Периоды вызова всякого */ #define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс -#define PM_SLOW_PERIOD_CNT 25 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US +#define PM_SLOW_PERIOD_CNT 50 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US #define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT /* Частоты таймеров в МГц*/ +#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (1-4 каналы) #define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП #define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы) #define PWM_TIM3_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (5-6 каналы) @@ -127,12 +128,14 @@ // ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 417 ====== #if defined(STM32F417xx) +#undef US_TIM5_FREQ_MHZ #undef ADC_TIM8_FREQ_MZH #undef PWM_TIM1_FREQ_MHZ #undef PWM_TIM3_FREQ_MHZ #undef ANGLE_TIM2_FREQ_MHZ // У 417 меньше частота поэтому меняем прескалер +#define US_TIM5_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (1-4 каналы) #define ADC_TIM8_FREQ_MZH 168 ///< Частота тиков таймера АЦП #define PWM_TIM1_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (1-4 каналы) #define PWM_TIM3_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (5-6 каналы) diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h index 1b48108..db8fcda 100644 --- a/UPP/Core/Configs/upp_defs.h +++ b/UPP/Core/Configs/upp_defs.h @@ -27,11 +27,11 @@ * @brief Список аварий УПП */ typedef enum { - WM_Not_Init = 0, ///< УПП не инициализирован - WM_Ready = 1, ///< УПП в готовности - WM_Running = 2, ///< УПП в работе, управляет тиристорами - WM_Done = 3, ///< УПП закончил свою работу - WM_Error = 4, ///< УПП в аварии + UPP_Not_Init = 0, ///< УПП не инициализирован + UPP_Ready = 1, ///< УПП в готовности + UPP_Work = 2, ///< УПП в работе, управляет тиристорами + UPP_Error = 3, ///< УПП в аварии +// WM_Done = 3, ///< УПП закончил свою работу } UPP_WorkModeType_t; /** diff --git a/UPP/Core/PowerMonitor/adc_tools.c b/UPP/Core/PowerMonitor/adc_tools.c index 9eb1717..7ff342d 100644 --- a/UPP/Core/PowerMonitor/adc_tools.c +++ b/UPP/Core/PowerMonitor/adc_tools.c @@ -104,7 +104,7 @@ HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, float PeriodUs) HAL_TIM_Base_Stop(adc->htim); // Запускаем таймер который будет запускать опрос АЦП с заданным периодом - __HAL_TIM_SET_AUTORELOAD(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM8_FREQ_MZH)); + __HAL_TIM_SET_AUTORELOAD(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM8_FREQ_MZH-1)); res = HAL_TIM_Base_Start(adc->htim); if(res != HAL_OK) diff --git a/UPP/Core/PowerMonitor/power_monitor.c b/UPP/Core/PowerMonitor/power_monitor.c index 55d3451..e293f6a 100644 --- a/UPP/Core/PowerMonitor/power_monitor.c +++ b/UPP/Core/PowerMonitor/power_monitor.c @@ -147,7 +147,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) for(int i = 0; i < 3; i++) { /* Получение частоты фазы */ - meas->final.F[i] = ZC_GetFrequency(&hpm->zc, i) / 2; + meas->final.F[i] = ZC_GetFrequency(&hpm->zc, i); + meas->final.Offset[i] = ZC_GetOffset(&hpm->zc, i); fmean += meas->final.F[i]; /* Средниее напряжение фазы */ @@ -162,9 +163,17 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm) meas->real.I[i] = meas->slow.I[i]*i_base; meas->real.U[i] = meas->slow.U[i]*u_base; } - /* Получение средней частоты по трем фазам */ - + /* Получение средней частоты по трем фазам */ meas->final.Fmean = fmean / 3; + /* Оределение сдвига фаз */ + static uint32_t prev_tick_phase_a = 0; + if(prev_tick_phase_a != hpm->zc.Channel[0].PeriodStartTime) + { // Определяем только когда начался новый период фазы A + prev_tick_phase_a = hpm->zc.Channel[0].PeriodStartTime; + meas->final.Phase[0] = 0; + meas->final.Phase[1] = ZC_GetPhaseShift(&hpm->zc, 0, 1); + meas->final.Phase[2] = ZC_GetPhaseShift(&hpm->zc, 0, 2); + } /* Расчет амплитуд трехфазной сети */ @@ -202,8 +211,6 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm) meas->fast.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]/i_base; meas->fast.I[I_B] = I_B_calc(meas->fast.I[I_A], meas->fast.I[I_C]); - /* Преобразуем в относительные единицы (о.е.) */ - /* Ищем переход через ноль */ ZC_ProcessAllChannels(&hpm->zc, meas->fast.U, usTick); diff --git a/UPP/Core/PowerMonitor/power_monitor.h b/UPP/Core/PowerMonitor/power_monitor.h index 332db9f..551316b 100644 --- a/UPP/Core/PowerMonitor/power_monitor.h +++ b/UPP/Core/PowerMonitor/power_monitor.h @@ -43,13 +43,15 @@ typedef struct /** @brief Усредненные величины (о.е.) */ struct { - float Uamp; ///< Результирующий вектор Напряжения по трем фазам - float Iamp; ///< Результирующий вектор Тока по трем фазам - float U[3]; ///< Среднее Наряжение по трем фазам - float I[3]; ///< Средний Ток по трем фазам - float Fmean; ///< Средняя Частота по трем фазам - float F[3]; ///< Частота от Zero Cross (обновляется в main) - float T[2]; ///< Температура (обновляется в main) + float Uamp; ///< Результирующий вектор Напряжения по трем фазам + float Iamp; ///< Результирующий вектор Тока по трем фазам + float U[3]; ///< Среднее Наряжение по трем фазам + float I[3]; ///< Средний Ток по трем фазам + float Fmean; ///< Средняя Частота по трем фазам + float F[3]; ///< Частота от Zero Cross (обновляется в main) + float Phase[3]; ///< Фазовое смещение по отношению к фазе A + float Offset[3]; ///< Смещение синуса относителньо нуля (определяется по отношению полупериодов) + float T[2]; ///< Температура (обновляется в main) }final; /** @brief Быстрые величины (в о.е.) - обновляются в каждом прерывании АЦП @ref PowerMonitor_FastCalc */ diff --git a/UPP/Core/PowerMonitor/zero_cross.c b/UPP/Core/PowerMonitor/zero_cross.c index 621f08e..abf2f2d 100644 --- a/UPP/Core/PowerMonitor/zero_cross.c +++ b/UPP/Core/PowerMonitor/zero_cross.c @@ -155,10 +155,17 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin 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; + float curr_half_period = RealTimestamp - zc_ch->LastCrossTime; + if (curr_half_period > 0) { + if(zc_ch->HalfWave == UPP_WAVE_POSITIVE) + { + zc_ch->PeriodStartTime = RealTimestamp; + zc_ch->Period = zc_ch->halfPeriod + curr_half_period; + zc_ch->Frequency = 1000000.0f / zc_ch->Period; + zc_ch->FrequencyOffset = (float)zc_ch->halfPeriod / curr_half_period; + } } + zc_ch->halfPeriod = curr_half_period; } zc_ch->LastCrossTime = RealTimestamp; @@ -245,6 +252,54 @@ float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel) return zc->Channel[channel].Frequency; } +/** + * @brief Получение смещение частот полупериода сигнала. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала + * @return Отношение длительности первой полуволны к второй полуволне. + */ +float ZC_GetOffset(ZeroCross_Handle_t *zc, uint8_t channel) +{ + if (assert_upp(zc)){ + return 0.0f; + } + if (channel >= zc->Config.NumChannels) { + return 0.0f; + } + + return zc->Channel[channel].FrequencyOffset; +} + + +/** + * @brief Получить сдвиг между двумя фазами. + * @param zc Указатель на хендл детектора нуля + * @param channel Номер канала от которого считать сдвиг + * @param channe2 Номер канала для которого расчитать сдвиг +* @return Фазовый сдвиг в процентах от периода от 1 до 2 канала + */ +float ZC_GetPhaseShift(ZeroCross_Handle_t *zc, uint8_t channel1, uint8_t channel2) +{ + if (assert_upp(zc)){ + return 0.0f; + } + + if ((channel1 >= zc->Config.NumChannels) || (channel2 >= zc->Config.NumChannels)){ + return 0.0f; + } + + float delta_time = 0; + if(zc->Channel[channel1].PeriodStartTime >= zc->Channel[channel2].PeriodStartTime) + delta_time = (zc->Channel[channel1].PeriodStartTime - zc->Channel[channel2].PeriodStartTime); + else + delta_time = (zc->Channel[channel2].PeriodStartTime - zc->Channel[channel1].PeriodStartTime); + + + float phase_ratio = delta_time/zc->Channel[channel1].Period; + return phase_ratio; +} + + /** * @brief Включение/выключение мониторинга. * @param zc Указатель на хендл детектора нуля diff --git a/UPP/Core/PowerMonitor/zero_cross.h b/UPP/Core/PowerMonitor/zero_cross.h index ae0ab6f..08857a8 100644 --- a/UPP/Core/PowerMonitor/zero_cross.h +++ b/UPP/Core/PowerMonitor/zero_cross.h @@ -94,8 +94,11 @@ typedef struct { float CurrentValue; ///< Текущее значение uint16_t DebounceCounter; ///< Счетчик антидребезга uint32_t LastCrossTime; ///< Время последнего перехода + float halfPeriod; ///< Длительность полупериода (в тактах таймера) + uint32_t PeriodStartTime; ///< Время начала периода (в тактах таймера) uint32_t Period; ///< Период сигнала (в тактах таймера) float Frequency; ///< Частота + float FrequencyOffset; ///< Смещение частот полупериода - насколько сигнал смещен UPP_HalfWave_t HalfWave; ///< Текущая полуволна ZC_EdgeType_t EdgeType; ///< Тип детектируемого перехода } ZC_Channel_t; @@ -152,6 +155,10 @@ void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values, int ZC_isOccurred(ZeroCross_Handle_t *zc, uint8_t channel); /* Получение частоты сигнала */ float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel); +/* Получение смещение частот полупериода сигнала */ +float ZC_GetOffset(ZeroCross_Handle_t *zc, uint8_t channel); +/* Получить сдвиг между двумя фазами. */ +float ZC_GetPhaseShift(ZeroCross_Handle_t *zc, uint8_t channel1, uint8_t channel2); /* Получение полуволны (после последнего zero-cross) */ UPP_HalfWave_t ZC_GetHalfWave(ZeroCross_Handle_t *zc, uint8_t channel); diff --git a/UPP/Core/Src/main.c b/UPP/Core/Src/main.c index f702212..3b44545 100644 --- a/UPP/Core/Src/main.c +++ b/UPP/Core/Src/main.c @@ -108,7 +108,7 @@ int main(void) MX_USART3_UART_Init(); MX_CAN1_Init(); MX_IWDG_Init(); - MX_RTC_Init(); + //MX_RTC_Init(); MX_TIM1_Init(); MX_TIM3_Init(); MX_USART6_UART_Init(); @@ -119,10 +119,10 @@ int main(void) MX_TIM5_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ + // меняем прескалер на частоту по дефайну + __HAL_TIM_SET_PRESCALER_FORCE(&ustim, US_TIM5_FREQ_MHZ-1); #if defined(STM32F417xx) - // У 417 меньше частота поэтому меняем прескалер - __HAL_TIM_SET_PRESCALER(&ustim, 84-1); - // И т.к. нет епромки выставляем дефолтные + // т.к. нет епромки выставляем дефолтные UPP_SetDefault(1, 1); #endif #else //MATLAB diff --git a/UPP/Core/Src/tim.c b/UPP/Core/Src/tim.c index 85caab9..5742d7e 100644 --- a/UPP/Core/Src/tim.c +++ b/UPP/Core/Src/tim.c @@ -256,8 +256,8 @@ void MX_TIM5_Init(void) /* USER CODE END TIM5_Init 0 */ + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_IC_InitTypeDef sConfigIC = {0}; /* USER CODE BEGIN TIM5_Init 1 */ @@ -268,7 +268,12 @@ void MX_TIM5_Init(void) 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) + if (HAL_TIM_Base_Init(&htim5) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } @@ -278,14 +283,6 @@ void MX_TIM5_Init(void) { 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 */ @@ -436,6 +433,17 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM3_MspInit 1 */ } + else if(tim_baseHandle->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspInit 0 */ + + /* USER CODE END TIM5_MspInit 0 */ + /* TIM5 clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); + /* USER CODE BEGIN TIM5_MspInit 1 */ + + /* USER CODE END TIM5_MspInit 1 */ + } else if(tim_baseHandle->Instance==TIM8) { /* USER CODE BEGIN TIM8_MspInit 0 */ @@ -474,35 +482,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM12_MspInit 1 */ } } - -void HAL_TIM_IC_MspInit(TIM_HandleTypeDef* tim_icHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(tim_icHandle->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspInit 0 */ - - /* USER CODE END TIM5_MspInit 0 */ - /* TIM5 clock enable */ - __HAL_RCC_TIM5_CLK_ENABLE(); - - __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) { @@ -597,6 +576,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) /* USER CODE END TIM3_MspDeInit 1 */ } + else if(tim_baseHandle->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspDeInit 0 */ + + /* USER CODE END TIM5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM5_CLK_DISABLE(); + /* USER CODE BEGIN TIM5_MspDeInit 1 */ + + /* USER CODE END TIM5_MspDeInit 1 */ + } else if(tim_baseHandle->Instance==TIM8) { /* USER CODE BEGIN TIM8_MspDeInit 0 */ @@ -635,28 +625,6 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) } } -void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef* tim_icHandle) -{ - - if(tim_icHandle->Instance==TIM5) - { - /* USER CODE BEGIN TIM5_MspDeInit 0 */ - - /* USER CODE END TIM5_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_TIM5_CLK_DISABLE(); - - /**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 */ - } -} - /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/UPP/Core/UPP/pwm_thyristors.c b/UPP/Core/UPP/pwm_thyristors.c index 383645b..1b2038d 100644 --- a/UPP/Core/UPP/pwm_thyristors.c +++ b/UPP/Core/UPP/pwm_thyristors.c @@ -232,8 +232,8 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t hpwm->Config.PulseNumber = PulseNumber; hpwm->Config.Frequency = Frequency; // Высставление периодов - __HAL_TIM_SET_AUTORELOAD(&hpwm1, TIM_FreqToTick(Frequency, PWM_TIM1_FREQ_MHZ)); - __HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM3_FREQ_MHZ)); + __HAL_TIM_SET_AUTORELOAD(&hpwm1, TIM_FreqToTick(Frequency, PWM_TIM1_FREQ_MHZ-1)); + __HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM3_FREQ_MHZ-1)); // Скважности 50/50 __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_1, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_2, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index 4b67418..7c86712 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -46,7 +46,7 @@ int UPP_Init(void) return 1; } - upp.workmode = WM_Ready; + upp.workmode = UPP_Ready; return 0; } @@ -75,10 +75,9 @@ int UPP_PreWhile(void) int UPP_While(void) { int retval = 0; - HAL_IWDG_Refresh(&hiwdg); if(upp.pm.f.runSlow) { - + HAL_IWDG_Refresh(&hiwdg); BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY); UPP_DO.CEN(ENABLE); @@ -92,28 +91,27 @@ int UPP_While(void) { upp.call->stop = 0; } + // Если СТОП - переходим в ошибку if (upp.call->stop) - upp.workmode = WM_Error; + upp.workmode = UPP_Error; // Сброс на дефолтные по запросу - if(upp.call->set_default_pui) + if(upp.call->set_default_pui || upp.call->set_default_internal) { - UPP_SetDefault(1, 0); - } - if(upp.call->set_default_internal) - { - UPP_SetDefault(0, 1); + UPP_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal); } + // Медленные расчеты PowerMonitor_SlowCalc(&upp.pm); + + // Защиты // Определенные защиты включаем только в режиме работы + PowerMonitor_Protect(&upp.pm, upp.workmode == UPP_Work); - - // Если СТОП - переходим в ошибку // Автомат состояний УПП switch(upp.workmode) { /* Состояние готовности */ - case WM_Ready: + case UPP_Ready: PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ // Индикация UPP_DO.Ready(ENABLE); @@ -123,21 +121,21 @@ int UPP_While(void) // если пришла команда на запуск if (upp.call->go) { - upp.workmode = WM_Running; + upp.workmode = UPP_Work; Angle_PID_Reset(&upp.hangle); upp.StartTick = local_time(); } break; /* Состояние В работе */ - case WM_Running: + case UPP_Work: // Индикация UPP_DO.Ready(DISABLE); UPP_DO.Work(ENABLE); UPP_DO.Error(DISABLE); // если пришла команда на остановку if (!upp.call->go) - upp.workmode = WM_Ready; + upp.workmode = UPP_Ready; // Регулирование тиристоров Angle_PID(&upp.hangle, iref_dbg, upp.pm.measured.final.Iamp); @@ -159,7 +157,7 @@ int UPP_While(void) // break; /* Состояние Ошибки */ - case WM_Error: + case UPP_Error: default: PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ // Индикация @@ -168,7 +166,7 @@ int UPP_While(void) UPP_DO.Error(ENABLE); // Находимся до тех пор пока ошибки не будет устранена if(errors.common == Err_None) - upp.workmode = WM_Ready; + upp.workmode = UPP_Ready; retval = 1; break; @@ -191,7 +189,7 @@ int UPP_While(void) */ void UPP_Tick(void) { - if(upp.workmode == WM_Not_Init) + if(upp.workmode == UPP_Not_Init) return; UPP_Errors_Handle(); UPP_Params_InternalControl(); @@ -214,15 +212,13 @@ void UPP_ADC_Handle(void) PowerMonitor_FastCalc(&upp.pm); - PowerMonitor_Protect(&upp.pm, upp.workmode == WM_Running); - for(int phase = 0; phase < 3; phase++) { // Если произошел Zero Cross if(ZC_isOccurred(&upp.pm.zc, phase)) { // Если УПП в работе - if(upp.workmode == WM_Running) + if(upp.workmode == UPP_Work) { // Меняем полуволну тиристора UPP_HalfWave_t curr_halfwave = ZC_GetHalfWave(&upp.pm.zc, phase); @@ -250,7 +246,7 @@ void UPP_Angle_Handle(void) UPP_Phase_t phase = Angle_Handle(&upp.hangle); Angle_Reset(&upp.hangle, phase); // Если УПП в работе - if(upp.workmode == WM_Running) + if(upp.workmode == UPP_Work) { switch(phase) { @@ -278,8 +274,8 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim) } void HAL_IncTick(void) { - BenchTime_Start(BT_SYSTICK, angletim.Instance->CNT, HAL_MAX_DELAY); + //BenchTime_Start(BT_SYSTICK, angletim.Instance->CNT, HAL_MAX_DELAY); uwTick += uwTickFreq; - UPP_Tick(); - upp.Timings.isr_systick_us = BenchTime_End(BT_SYSTICK, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; + //UPP_Tick(); + //upp.Timings.isr_systick_us = BenchTime_End(BT_SYSTICK, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; } \ No newline at end of file diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index ee7ee15..bc35c46 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -329,18 +329,34 @@ 0 0 - 136 + 407 1 -
134258308
+
134233290
0 0 0 0 0 1 - ../Core/Src/stm32f4xx_it.c + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c - \\Debug_F417\../Core/Src/stm32f4xx_it.c\136 + \\Debug_F417\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c\407 +
+ + 1 + 0 + 27 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\Core\Src\DBG_stm32f417_support.c + +
@@ -369,6 +385,36 @@ 1 hbt,0x0A + + 5 + 1 + htim5.Instance->CNT,0x0A + + + 6 + 1 + htim14.Instance->PSC,0x0A + + + 7 + 1 + htim5.Instance->PSC,0x0A + + + 8 + 1 + SystemCoreClock,0x0A + + + 9 + 1 + sysclockfreq,0x0A + + + 10 + 1 + \\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing + @@ -401,6 +447,31 @@ 2 errors.common + + 6 + 2 + upp.pm.measured.slow.U[0] + + + 7 + 2 + zc->Channel[channel1].PeriodStartTime,0x0A + + + 8 + 2 + zc->Channel[channel2].PeriodStartTime,0x0A + + + 9 + 2 + zc->Channel[channel1].PeriodStartTime - zc->Channel[channel2].PeriodStartTime,0x10 + + + 10 + 2 + htim5.Instance,0x0A + 0 @@ -444,9 +515,34 @@ + + + 0 + `upp.pm.measured.real.U[0] + 0000000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B305D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000001000000731CC7711CC7D13F1400000000000000000000000000000000000000A49F0008 + + + 1 + `upp.pm.measured.real.U[1] + 0080000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B315D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000002000000398EE3388EE3D83F1400000000000000000000000000000000000000A49F0008 + + + 2 + `upp.pm.measured.final.F[0] + 0000800000000000000000000000000000805140000000000000000000000000000000007570702E706D2E6D656173757265642E66696E616C2E465B305D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000003000000555555555555D53F140000000000000000000000000000000000000028020008 + + - System Viewer\DMA2 + System Viewer\DBG + 35902 + + + System Viewer\TIM14 + 35903 + + + System Viewer\TIM5 35905 @@ -1362,7 +1458,7 @@ PeriphGeneral - 0 + 1 0 0 0 diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index 20b686b..45f9920 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -17,8 +17,8 @@ STM32F427ZGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.16.0 - http://www.keil.com/pack/ + Keil.STM32F4xx_DFP.2.17.1 + https://www.keil.com/pack/ IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ @@ -1004,8 +1004,8 @@ STM32F417ZGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.16.0 - http://www.keil.com/pack/ + Keil.STM32F4xx_DFP.2.17.1 + https://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE diff --git a/UPP/MDK-ARM/startup_stm32f417xx.s b/UPP/MDK-ARM/startup_stm32f417xx.s index de989f8..c730079 100644 --- a/UPP/MDK-ARM/startup_stm32f417xx.s +++ b/UPP/MDK-ARM/startup_stm32f417xx.s @@ -40,7 +40,7 @@ __initial_sp ; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; -Heap_Size EQU 0x200 +Heap_Size EQU 0x400 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base diff --git a/UPP/UPP.ioc b/UPP/UPP.ioc index 6d204d7..aca7cbf 100644 --- a/UPP/UPP.ioc +++ b/UPP/UPP.ioc @@ -82,63 +82,63 @@ Mcu.Pin12=PF10 Mcu.Pin13=PH0/OSC_IN Mcu.Pin14=PH1/OSC_OUT Mcu.Pin15=PC0 -Mcu.Pin16=PA0/WKUP -Mcu.Pin17=PA4 -Mcu.Pin18=PA5 -Mcu.Pin19=PA6 +Mcu.Pin16=PA4 +Mcu.Pin17=PA5 +Mcu.Pin18=PA6 +Mcu.Pin19=PB0 Mcu.Pin2=PE4 -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.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.Pin3=PE5 -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.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.Pin4=PE6 -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.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.Pin5=PC13 -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_TIM1_VS_OPM +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_TIM1_VS_OPM +Mcu.Pin59=VP_TIM2_VS_ClockSourceINT Mcu.Pin6=PC14/OSC32_IN -Mcu.Pin60=VP_TIM2_VS_ClockSourceINT -Mcu.Pin61=VP_TIM2_VS_no_output1 -Mcu.Pin62=VP_TIM2_VS_no_output2 -Mcu.Pin63=VP_TIM2_VS_no_output3 -Mcu.Pin64=VP_TIM3_VS_ControllerModeTrigger -Mcu.Pin65=VP_TIM3_VS_ClockSourceINT -Mcu.Pin66=VP_TIM3_VS_ClockSourceITR -Mcu.Pin67=VP_TIM3_VS_OPM +Mcu.Pin60=VP_TIM2_VS_no_output1 +Mcu.Pin61=VP_TIM2_VS_no_output2 +Mcu.Pin62=VP_TIM2_VS_no_output3 +Mcu.Pin63=VP_TIM3_VS_ControllerModeTrigger +Mcu.Pin64=VP_TIM3_VS_ClockSourceINT +Mcu.Pin65=VP_TIM3_VS_ClockSourceITR +Mcu.Pin66=VP_TIM3_VS_OPM +Mcu.Pin67=VP_TIM5_VS_ClockSourceINT Mcu.Pin68=VP_TIM8_VS_ClockSourceINT Mcu.Pin69=VP_TIM11_VS_ClockSourceINT Mcu.Pin7=PC15/OSC32_OUT @@ -168,7 +168,6 @@ 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 @@ -466,8 +465,6 @@ 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 @@ -497,8 +494,7 @@ TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,TIM_MasterSlaveMode,TIM_MasterOutputTrigger TIM3.TIM_MasterOutputTrigger=TIM_TRGO_RESET TIM3.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_ENABLE -TIM5.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1 -TIM5.IPParameters=Channel-Input_Capture1_from_TI1,Prescaler +TIM5.IPParameters=Prescaler TIM5.Prescaler=90-1 TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger TIM8.Period=1800-1 @@ -541,6 +537,8 @@ VP_TIM3_VS_ControllerModeTrigger.Mode=Trigger Mode VP_TIM3_VS_ControllerModeTrigger.Signal=TIM3_VS_ControllerModeTrigger VP_TIM3_VS_OPM.Mode=OPM_bit VP_TIM3_VS_OPM.Signal=TIM3_VS_OPM +VP_TIM5_VS_ClockSourceINT.Mode=Internal +VP_TIM5_VS_ClockSourceINT.Signal=TIM5_VS_ClockSourceINT VP_TIM8_VS_ClockSourceINT.Mode=Internal VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT board=custom