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