diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h
index 866bb04..65fc927 100644
--- a/UPP/Core/Configs/upp_config.h
+++ b/UPP/Core/Configs/upp_config.h
@@ -33,7 +33,7 @@
#define UPP_SIMULATE_I ///< Симулировт токи а не брать с АЦП
/**
- * @addtogroup UPP_DEFAULT_PARAMS Default params for external flash
+ * @addtogroup UPP_PARAMS_DEFAULT Default params for external flash
* @ingroup UPP_CONFIG
* @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке
* @details Префиксы
@@ -41,11 +41,10 @@
*/
-/* Номинальные параметры */
+/* Уставки по температурам */
#define SETPOINT_TEMP_WARN 70
#define SETPOINT_TEMP_ERR 85
-
/* Номинальные параметры */
#define NOM_PHASE_NUMB 3
#define NOM_U_V_DEFAULT 690
@@ -78,7 +77,7 @@
#define ANGLE_MAX_PERCENT_DEFAULT 0.8
#define ANGLE_MIN_PERCENT_DEFAULT 0.1
#define ANGLE_PID_KP_COEF_DEFAULT 1.0
-#define ANGLE_PID_KI_COEF_DEFAULT 0.1
+#define ANGLE_PID_KI_COEF_DEFAULT 0.01
#define ANGLE_PID_KD_COEF_DEFAULT 0
#define ANGLE_REF_ALPHA_COEF_DEFAULT 0.0001
@@ -99,7 +98,7 @@
#define PWM_THYR_FREQUENCY_HZ_DEFAULT 20000
#define PWM_THYR_PULSE_NUMBER_DEFAULT 20
-/** //UPP_DEFAULT_PARAMS
+/** //UPP_PARAMS_DEFAULT
* @}
*/
@@ -111,19 +110,18 @@
* @{
*/
-/* Периоды вызова всякого */
-#define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс
-#define PM_SLOW_PERIOD_CNT 20 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
-#define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT
-#define PM_F_SLOW_PERIOD_CNT 2000 ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
-
-#define UPP_SLOW_TICKS_FOR_INIT 20000 ///< Сколько тиков ждать медленных измерений ждать перед переходом в готовность
+/* Периоды обновления всякого */
+#define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс
+#define PM_SLOW_PERIOD_US 500 ///< Период обновления медленных расчетов в мкс (чтобы делилось на @ref PM_ADC_PERIOD_US)
+#define PM_TEMP_SLOW_PERIOD_MS 1000 ///< Период опроса АЦП в мс
+#define PM_F_SLOW_PERIOD_MS 40 ///< Период обновления частоты в мс
+#define UPP_INIT_BEFORE_READY_MS 2000 ///< Сколько сканировать сеть, перед выставлением состояния готовности
/* Частоты таймеров в МГц*/
-#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 каналы)
+#define PWM_TIM8_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (5-6 каналы)
+#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков микросекундного таймера
+#define ADC_TIM3_FREQ_MZH 90 ///< Частота тиков таймера АЦП
#define ANGLE_TIM2_FREQ_MHZ 90 ///< Частота тиков таймера отсчета угла открытия тиристоров
@@ -132,17 +130,17 @@
// ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 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 PWM_TIM8_FREQ_MHZ
+#undef US_TIM5_FREQ_MHZ
+#undef ADC_TIM3_FREQ_MZH
#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 каналы)
+#define PWM_TIM8_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (5-6 каналы)
+#define US_TIM5_FREQ_MHZ 84 ///< Частота тиков микросекундного таймера
+#define ADC_TIM3_FREQ_MZH 84 ///< Частота тиков таймера АЦП
#define ANGLE_TIM2_FREQ_MHZ 84 ///< Частота тиков таймера отсчета угла открытия тиристоров
#define HAL_PWREx_EnableOverDrive() HAL_ERROR
diff --git a/UPP/Core/Configs/upp_defs.h b/UPP/Core/Configs/upp_defs.h
index db8fcda..6520ea4 100644
--- a/UPP/Core/Configs/upp_defs.h
+++ b/UPP/Core/Configs/upp_defs.h
@@ -27,7 +27,7 @@
* @brief Список аварий УПП
*/
typedef enum {
- UPP_Not_Init = 0, ///< УПП не инициализирован
+ UPP_Init = 0, ///< УПП не инициализирован
UPP_Ready = 1, ///< УПП в готовности
UPP_Work = 2, ///< УПП в работе, управляет тиристорами
UPP_Error = 3, ///< УПП в аварии
@@ -96,7 +96,7 @@ typedef struct {
/**
* @brief Структура параметров УПП от ПУИ
- * @details Параметры по умолчанию приведены в @ref UPP_DEFAULT_PARAMS
+ * @details Параметры по умолчанию приведены в @ref UPP_PARAMS_DEFAULT
* @note Защиты №X приведены в @ref UPP_ErrorType_t
*/
typedef struct {
@@ -149,20 +149,26 @@ typedef struct {
* @brief Дефайны УПП которые используютяс исключительно внутри программы
* @{
*/
-#define PM_SLOW_PERIOD_US (PM_ADC_PERIOD_US*PM_SLOW_PERIOD_CNT)
-#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000)
-
+/* Перерасчеты в тики */
+#define PM_SLOW_PERIOD_CNT (PM_SLOW_PERIOD_US/PM_ADC_PERIOD_US) ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
#define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US)
#define MS_TO_SLOW_TICKS(_ms_) US_TO_SLOW_TICKS((_ms_)*1000)
+#define PM_F_SLOW_PERIOD_CNT (MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS)) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
+
+
+/* Перерасчеты в тики */
+#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
+
-
+/* Дефайны для "удобного" доступа к структурам */
#define PARAM_INTERNAL MB_INTERNAL.param
#define PARAM_PUI MB_DATA.HoldRegs.pui_params
#define ERR_PUI errors.pui.err
#define ERR_PRIVATE errors.prvt.f.err
#define ERR_PRIVATE_CNT errors.prvt.cnt
+/* Enum'ы УПП */
/**
* @brief Состояния полуволны
*/
diff --git a/UPP/Core/Inc/main.h b/UPP/Core/Inc/main.h
index 2fa1fad..dc1f029 100644
--- a/UPP/Core/Inc/main.h
+++ b/UPP/Core/Inc/main.h
@@ -62,6 +62,7 @@ void Error_Handler(void);
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
+#define angletim htim2
#define mb_huart huart3
#define mbdbg_htim htim11
#define PWM_CHANNEL_1 TIM_CHANNEL_1
@@ -69,19 +70,18 @@ void Error_Handler(void);
#define PWM_CHANNEL_3 TIM_CHANNEL_3
#define PWM_CHANNEL_4 TIM_CHANNEL_4
#define mem_hspi hspi3
+#define ANGLE_CHANNEL_2 TIM_CHANNEL_2
+#define ANGLE_CHANNEL_3 TIM_CHANNEL_3
+#define ANGLE_CHANNEL_1 TIM_CHANNEL_1
#define PWM_CHANNEL_5 TIM_CHANNEL_3
#define PWM_CHANNEL_6 TIM_CHANNEL_4
#define mb_htim htim12
-#define adc_tim htim8
+#define adc_tim htim3
#define usTick ustim.Instance->CNT
-#define hpwm2 htim3
+#define hpwm2 htim8
#define mb_dbg_huart huart6
#define ustim htim5
#define hpwm1 htim1
-#define ANGLE_CHANNEL_1 TIM_CHANNEL_1
-#define ANGLE_CHANNEL_2 TIM_CHANNEL_2
-#define ANGLE_CHANNEL_3 TIM_CHANNEL_3
-#define angletim htim2
#define UM_LED_GREEN2_Pin GPIO_PIN_2
#define UM_LED_GREEN2_GPIO_Port GPIOE
#define CEN_Pin GPIO_PIN_3
diff --git a/UPP/Core/PowerMonitor/adc_tools.c b/UPP/Core/PowerMonitor/adc_tools.c
index 7e3841d..f959c46 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_FORCE(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM4_FREQ_MZH-1));
+ __HAL_TIM_SET_AUTORELOAD_FORCE(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM3_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 e0184f0..78cd965 100644
--- a/UPP/Core/PowerMonitor/power_monitor.c
+++ b/UPP/Core/PowerMonitor/power_monitor.c
@@ -88,7 +88,7 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
/* Инициализация среднего фильтра для температур */
for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; i++)
{
- if(FilterAverage_Init(&hpm->avg[AVG_TEMP1+i], PM_TEMP_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT))
+ if(FilterAverage_Init(&hpm->avg[AVG_TEMP1+i], MS_TO_SLOW_TICKS(PM_TEMP_SLOW_PERIOD_MS), FILTER_MODE_DEFAULT))
return HAL_ERROR;
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);
@@ -96,7 +96,7 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
/* Инициализация среднего фильтра для частот */
for(int i = 0; i < 3; i++)
{
- if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], PM_F_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT))
+ if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS), FILTER_MODE_DEFAULT))
return HAL_ERROR;
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);
diff --git a/UPP/Core/Src/adc.c b/UPP/Core/Src/adc.c
index 1e47c8a..0da022a 100644
--- a/UPP/Core/Src/adc.c
+++ b/UPP/Core/Src/adc.c
@@ -50,7 +50,7 @@ void MX_ADC3_Init(void)
hadc3.Init.ContinuousConvMode = DISABLE;
hadc3.Init.DiscontinuousConvMode = DISABLE;
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
- hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T8_TRGO;
+ hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc3.Init.NbrOfConversion = 6;
hadc3.Init.DMAContinuousRequests = ENABLE;
diff --git a/UPP/Core/Src/gpio.c b/UPP/Core/Src/gpio.c
index 6746ace..8d3dd37 100644
--- a/UPP/Core/Src/gpio.c
+++ b/UPP/Core/Src/gpio.c
@@ -62,13 +62,13 @@ void MX_GPIO_Init(void)
HAL_GPIO_WritePin(DO2_GPIO_Port, DO2_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, GPIO_PIN_SET);
+ HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(DO5_GPIO_Port, DO5_Pin, GPIO_PIN_RESET);
+ HAL_GPIO_WritePin(GPIOA, DO5_Pin|DO4_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOA, DO4_Pin|RDO4_Pin, GPIO_PIN_SET);
+ HAL_GPIO_WritePin(RDO4_GPIO_Port, RDO4_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, DO1_Pin|RDO1_Pin|SCIDE2_Pin|SCIDE1_Pin
diff --git a/UPP/Core/Src/main.c b/UPP/Core/Src/main.c
index 3b44545..89df5ce 100644
--- a/UPP/Core/Src/main.c
+++ b/UPP/Core/Src/main.c
@@ -22,7 +22,6 @@
#include "can.h"
#include "dma.h"
#include "iwdg.h"
-#include "rtc.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
@@ -108,7 +107,6 @@ int main(void)
MX_USART3_UART_Init();
MX_CAN1_Init();
MX_IWDG_Init();
- //MX_RTC_Init();
MX_TIM1_Init();
MX_TIM3_Init();
MX_USART6_UART_Init();
@@ -123,11 +121,11 @@ int main(void)
__HAL_TIM_SET_PRESCALER_FORCE(&ustim, US_TIM5_FREQ_MHZ-1);
#if defined(STM32F417xx)
// т.к. нет епромки выставляем дефолтные
- UPP_SetDefault(1, 1);
+ UPP_Params_SetDefault(1, 1);
#endif
#else //MATLAB
#endif //MATLAB
- UPP_Init();
+ UPP_App_Init();
/* USER CODE END 2 */
/* Infinite loop */
diff --git a/UPP/Core/Src/tim.c b/UPP/Core/Src/tim.c
index 9d46689..97a009e 100644
--- a/UPP/Core/Src/tim.c
+++ b/UPP/Core/Src/tim.c
@@ -53,7 +53,7 @@ void MX_TIM1_Init(void)
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim1.Init.RepetitionCounter = 0;
+ htim1.Init.RepetitionCounter = 20;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
@@ -68,6 +68,10 @@ void MX_TIM1_Init(void)
{
Error_Handler();
}
+ if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK)
+ {
+ Error_Handler();
+ }
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
@@ -184,9 +188,7 @@ void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
- TIM_SlaveConfigTypeDef sSlaveConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
- TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM3_Init 1 */
@@ -206,42 +208,15 @@ void MX_TIM3_Init(void)
{
Error_Handler();
}
- if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE) != HAL_OK)
- {
- Error_Handler();
- }
- sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
- sSlaveConfig.InputTrigger = TIM_TS_ITR0;
- if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK)
- {
- Error_Handler();
- }
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+ sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
- sConfigOC.OCMode = TIM_OCMODE_PWM1;
- sConfigOC.Pulse = 0;
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
- if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
- {
- Error_Handler();
- }
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */
- HAL_TIM_MspPostInit(&htim3);
}
/* TIM5 init function */
@@ -294,6 +269,8 @@ void MX_TIM8_Init(void)
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
+ TIM_OC_InitTypeDef sConfigOC = {0};
+ TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM8_Init 1 */
@@ -301,9 +278,9 @@ void MX_TIM8_Init(void)
htim8.Instance = TIM8;
htim8.Init.Prescaler = 0;
htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim8.Init.Period = 1800-1;
+ htim8.Init.Period = 65535;
htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim8.Init.RepetitionCounter = 0;
+ htim8.Init.RepetitionCounter = 20;
htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim8) != HAL_OK)
{
@@ -314,15 +291,50 @@ void MX_TIM8_Init(void)
{
Error_Handler();
}
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
+ if (HAL_TIM_PWM_Init(&htim8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_TIM_OnePulse_Init(&htim8, TIM_OPMODE_SINGLE) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
+ sConfigOC.OCMode = TIM_OCMODE_PWM1;
+ sConfigOC.Pulse = 0;
+ sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+ sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
+ sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+ sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
+ sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
+ if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
+ sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
+ sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
+ sBreakDeadTimeConfig.DeadTime = 0;
+ sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
+ sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
+ sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
+ if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
/* USER CODE BEGIN TIM8_Init 2 */
/* USER CODE END TIM8_Init 2 */
+ HAL_TIM_MspPostInit(&htim8);
}
/* TIM11 init function */
@@ -505,27 +517,27 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
/* USER CODE END TIM1_MspPostInit 1 */
}
- else if(timHandle->Instance==TIM3)
+ else if(timHandle->Instance==TIM8)
{
- /* USER CODE BEGIN TIM3_MspPostInit 0 */
+ /* USER CODE BEGIN TIM8_MspPostInit 0 */
- /* USER CODE END TIM3_MspPostInit 0 */
+ /* USER CODE END TIM8_MspPostInit 0 */
__HAL_RCC_GPIOC_CLK_ENABLE();
- /**TIM3 GPIO Configuration
- PC8 ------> TIM3_CH3
- PC9 ------> TIM3_CH4
+ /**TIM8 GPIO Configuration
+ PC8 ------> TIM8_CH3
+ PC9 ------> TIM8_CH4
*/
GPIO_InitStruct.Pin = PWM5_Pin|PWM6_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+ GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- /* USER CODE BEGIN TIM3_MspPostInit 1 */
+ /* USER CODE BEGIN TIM8_MspPostInit 1 */
- /* USER CODE END TIM3_MspPostInit 1 */
+ /* USER CODE END TIM8_MspPostInit 1 */
}
}
diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c
index 76357a1..d97c748 100644
--- a/UPP/Core/UPP/angle_control.c
+++ b/UPP/Core/UPP/angle_control.c
@@ -38,12 +38,10 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle)
Angle_Reset(hangle, UPP_PHASE_B);
Angle_Reset(hangle, UPP_PHASE_C);
-
// Инициализация углов
float angle_max = to_float(PARAM_INTERNAL.angle.Angle_Max, 65535);
float angle_min = to_float(PARAM_INTERNAL.angle.Angle_Min, 65535);
-
hangle->f.Initialized = 1;
return HAL_OK;
}
@@ -121,8 +119,8 @@ void Angle_PID_Reset(Angle_Handle_t *hangle)
* @brief Выставление степени открытия тиристоров.
* @param hangle Указатель на таймер
* @param OpenLevel Насколько открыть тиристор:
- - 0 - полностбю закрыт,
- - 1 - полностью открыт
+ - 0 - максимально закрыт,
+ - 1 - максимально открыт
* @return HAL Status.
*/
HAL_StatusTypeDef Angle_SetAngle(Angle_Handle_t *hangle, float OpenLevel)
@@ -190,6 +188,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P
switch(Phase)
{
case UPP_PHASE_A:
+ __HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC1); // очищаем флаг навсякий
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_1, ccr_ticks);
// Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание:
if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_1) <= __HAL_TIM_GET_COUNTER(hangle->htim))
@@ -203,6 +202,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P
break;
case UPP_PHASE_B:
+ __HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC2); // очищаем флаг навсякий
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_2, ccr_ticks);
// Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание:
if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_2) <= __HAL_TIM_GET_COUNTER(hangle->htim))
@@ -215,6 +215,7 @@ HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float P
break;
case UPP_PHASE_C:
+ __HAL_TIM_CLEAR_IT(hangle->htim, TIM_IT_CC3); // очищаем флаг навсякий
__HAL_TIM_SET_COMPARE(hangle->htim, ANGLE_CHANNEL_3, ccr_ticks);
// Если слишком маленький timer_tick и счетчик уже перевалил за ccr, но не сгенерил прервыание:
if (__HAL_TIM_GET_COMPARE(hangle->htim, ANGLE_CHANNEL_3) <= __HAL_TIM_GET_COUNTER(hangle->htim))
diff --git a/UPP/Core/UPP/pwm_thyristors.c b/UPP/Core/UPP/pwm_thyristors.c
index 0aafba6..02ee9eb 100644
--- a/UPP/Core/UPP/pwm_thyristors.c
+++ b/UPP/Core/UPP/pwm_thyristors.c
@@ -60,14 +60,17 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm)
PWM_SetConfig(hpwm, PARAM_INTERNAL.pwm.PhaseMask, PARAM_INTERNAL.pwm.Frequency, PARAM_INTERNAL.pwm.PulseNumber);
- PWM_Stop(hpwm, 0, 1);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_1);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_2);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_3);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_4);
HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_5);
HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_6);
+ PWM_Stop(hpwm, 0, 1);
+
+#ifndef PWM_HARDWARE_IMPULSES_CONTROL
HAL_TIM_Base_Start_IT(&hpwm1);
+#endif
return HAL_OK;
}
@@ -103,13 +106,26 @@ HAL_StatusTypeDef PWM_Start(PWM_Handle_t *hpwm, UPP_Phase_t Phase)
// Запуск только если таймер в режиме ожидания
case PWM_THYR_TIM_WAIT:
+#ifndef PWM_HARDWARE_IMPULSES_CONTROL
hpwm->Phase[Phase]->State = PWM_THYR_TIM_START;
- return HAL_OK;
+ return HAL_OK;
+#else
+ hpwm->Phase[Phase]->State = PWM_THYR_TIM_ACTIVE;
+
+ if(hpwm->Config.PulseNumber)
+ hpwm->Phase[Phase]->htim->Instance->RCR = hpwm->Config.PulseNumber-1;
+ else
+ return HAL_ERROR;
+
+ __PWM_SetOutputState(hpwm->Phase[Phase], PWM_ENABLE);
+
+ hpwm->f.Running++;
+ return HAL_TIM_Base_Start_IT(hpwm->Phase[Phase]->htim);
+#endif
default:
return HAL_ERROR;
}
-
return HAL_ERROR;
}
@@ -127,30 +143,44 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_
{
if(assert_upp(hpwm))
return HAL_ERROR;
- // Если канал дурацкий - возвращаем ошибку
- if(Phase >= 3)
- {
- return HAL_ERROR;
- }
- if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN])
- return HAL_ERROR;
- hpwm->Phase[Phase]->State = PWM_THYR_DISABLED;
-
- // Если не force_stop_all - сбрасываем только текущий канал
- if (!force_stop_all)
- {
- __PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE);
- }
// Если force_stop_all - сбрасываем ВСЕ КАНАЛЫ
- else {
+ if(force_stop_all)
+ {
+ // в первую очередь выключаем канал, потом выставим режим каналов
+ __HAL_TIM_MOE_DISABLE(&hpwm1);
+ // в первую очередь выключаем канал, потом выставим режим каналов
+ __HAL_TIM_MOE_DISABLE(&hpwm2);
+
+
for(int ch = 0; ch < 6; ch++)
{
__PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE);
}
+ return HAL_OK;
+ }
+ // Если НЕ force_stop_all - сбрасываем ТОЛЬКО заданный канал
+ else
+ {
+ // Если канал дурацкий - возвращаем ошибку
+ if(Phase >= 3)
+ {
+ return HAL_ERROR;
+ }
+ if (hpwm->Phase[Phase] == NULL || hpwm->Phase[Phase] == &hpwm->AllPhases[PHASE_UNKNOWN])
+ return HAL_ERROR;
+
+ hpwm->Phase[Phase]->State = PWM_THYR_DISABLED;
+ // Если не force_stop_all - сбрасываем только текущий канал
+ __PWM_SetOutputState(hpwm->Phase[Phase], PWM_DISABLE);
+#ifdef PWM_HARDWARE_IMPULSES_CONTROL
+ if(hpwm->f.Running)
+ hpwm->f.Running--;
+
+ HAL_TIM_Base_Stop(hpwm->Phase[Phase]->htim);
+#endif
+ return HAL_OK;
}
-
- return HAL_OK;
}
/**
* @brief Хендл ШИМ тиристоров.
@@ -172,6 +202,7 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm)
if (hPhase->htim == NULL)
continue;
+#ifndef PWM_HARDWARE_IMPULSES_CONTROL
switch (hPhase->State)
{
case PWM_THYR_DISABLED: // канал отключен
@@ -208,6 +239,14 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm)
__PWM_SetOutputState(hPhase, PWM_DISABLE);
break;
}
+#else //PWM_HARDWARE_IMPULSES_CONTROL
+ // после того как пачка импульсов прошла отключаем активный канал
+ if (hPhase->State == PWM_THYR_TIM_ACTIVE)
+ {
+ __PWM_SetOutputState(hPhase, PWM_DISABLE);
+ HAL_TIM_Base_Stop(hPhase->htim);
+ }
+#endif
}
return HAL_OK;
}
@@ -233,7 +272,7 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t
hpwm->Config.Frequency = Frequency;
// Высставление периодов
__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));
+ __HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM8_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);
@@ -248,8 +287,12 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t
__HAL_TIM_SET_COUNTER(&hpwm2, 0);
PWM_Stop(hpwm, 0, 1);
-
+
+#ifndef PWM_HARDWARE_IMPULSES_CONTROL
return HAL_TIM_Base_Start_IT(&hpwm1);
+#else
+ return HAL_OK;
+#endif
}
@@ -317,7 +360,8 @@ HAL_StatusTypeDef PWM_SetPolarity(PWM_Handle_t *hpwm, int polarity)
}
return HAL_OK;
}
-/**
+
+/**
* @brief Установка режима для канала ШИМ.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @param Phase Для какой фазы надо установить состояние
@@ -331,9 +375,9 @@ static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state
if (hCh->htim == NULL)
return HAL_ERROR;
-
uint32_t ch_mode = state;
+ // выставляем режим каналов
switch(hCh->ChMask)
{
case TIM_CHANNEL_1:
@@ -355,5 +399,12 @@ static HAL_StatusTypeDef __PWM_SetOutputState(PWM_Channel_t *hCh, uint32_t state
default:
break;
}
+
+ // в последнюю очередь включаем выход. Перед этим настраиваем каналы на ШИМ
+ if(state == PWM_ENABLE)
+ {
+ __HAL_TIM_MOE_ENABLE(hCh->htim);
+ }
+
return HAL_OK;
-}
+}
\ No newline at end of file
diff --git a/UPP/Core/UPP/pwm_thyristors.h b/UPP/Core/UPP/pwm_thyristors.h
index 85fc1d3..6516a6e 100644
--- a/UPP/Core/UPP/pwm_thyristors.h
+++ b/UPP/Core/UPP/pwm_thyristors.h
@@ -10,11 +10,11 @@
-
+#define PWM_HARDWARE_IMPULSES_CONTROL
#define PWM_ENABLE TIM_OCMODE_PWM2
-#define PWM_DISABLE TIM_OCMODE_FORCED_ACTIVE
+#define PWM_DISABLE TIM_OCMODE_FORCED_INACTIVE
diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c
index c2a2396..b32b125 100644
--- a/UPP/Core/UPP/upp_main.c
+++ b/UPP/Core/UPP/upp_main.c
@@ -11,15 +11,15 @@
UPP_t upp;
float dbg_iref = 1;
-int dbg_polarity = 1;
-// ОСНОВНОЙ ЦИКЛ main.c
+int dbg_polarity = 0;
/**
* @brief Инициализация УПП.
* @return 0 - если ОК, >1 если ошибка.
*/
-int UPP_Init(void)
+int UPP_App_Init(void)
{
+ upp.workmode = UPP_Init;
/* Очищаем входы */
UPP_IO_Init();
@@ -45,9 +45,7 @@ int UPP_Init(void)
if(Angle_Init(&upp.hangle) != HAL_OK)
{
return 1;
- }
-
- upp.workmode = UPP_Ready;
+ }
return 0;
}
@@ -57,7 +55,7 @@ int UPP_Init(void)
*/
int UPP_PreWhile(void)
{
- UPP_Params_InternalControl();
+ UPP_Params_ControlInternal();
if(Angle_SetRange(&upp.hangle, 0.0, 0.8) != HAL_OK)
return 1;
@@ -102,7 +100,7 @@ int UPP_While(void)
// Сброс на дефолтные по запросу
if(upp.call->set_default_pui || upp.call->set_default_internal)
{
- UPP_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal);
+ UPP_Params_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal);
}
// Медленные расчеты
@@ -115,11 +113,16 @@ int UPP_While(void)
switch(upp.workmode)
{
/* Состояние инициализации */
- case UPP_Not_Init:
- if(slow_cnt > UPP_SLOW_TICKS_FOR_INIT)
+ case UPP_Init:
+ if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS))
{
+ slow_cnt = 0; // сбрасываем чтобы потом еще раз инициализироватся
upp.workmode = UPP_Ready;
}
+ else
+ {
+ slow_cnt++;
+ }
break;
/* Состояние готовности */
@@ -147,7 +150,7 @@ int UPP_While(void)
UPP_DO.Error(DISABLE);
// если пришла команда на остановку
if (!upp.call->go)
- upp.workmode = UPP_Ready;
+ upp.workmode = UPP_Init;
// Регулирование тиристоров
#ifndef UPP_SIMULATE_I // берем с АЦП
@@ -181,7 +184,7 @@ int UPP_While(void)
UPP_DO.Error(ENABLE);
// Находимся до тех пор пока ошибки не будет устранена
if(errors.common == Err_None)
- upp.workmode = UPP_Not_Init;
+ upp.workmode = UPP_Init;
retval = 1;
break;
@@ -189,7 +192,7 @@ int UPP_While(void)
UPP_Errors_Handle();
- UPP_Params_InternalControl();
+ UPP_Params_ControlInternal();
upp.pm.f.runSlow = 0;
@@ -209,7 +212,7 @@ int UPP_While(void)
*/
void UPP_Tick(void)
{
- if(upp.workmode == UPP_Not_Init)
+ if(upp.workmode == UPP_Init)
return;
}
diff --git a/UPP/Core/UPP/upp_main.h b/UPP/Core/UPP/upp_main.h
index 9d45809..4d07896 100644
--- a/UPP/Core/UPP/upp_main.h
+++ b/UPP/Core/UPP/upp_main.h
@@ -49,7 +49,7 @@ extern UPP_t upp;
/* Инициализация УПП */
-int UPP_Init(void);
+int UPP_App_Init(void);
/* Инициализация основного цикла УПП. */
int UPP_PreWhile(void);
/* Основной цикл УПП. */
diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c
index 5474851..66314c7 100644
--- a/UPP/Core/UPP/upp_params.c
+++ b/UPP/Core/UPP/upp_params.c
@@ -18,7 +18,7 @@ static void __AngleSetLimit(void);
* @brief Контроль внутренних параметров УПП.
* @return HAL Status.
*/
-void UPP_Params_InternalControl(void)
+void UPP_Params_ControlInternal(void)
{
__AngleSetLimit();
if(upp.call->go) // при запущеном УПП ничего не меняем
@@ -171,13 +171,22 @@ void UPP_Params_InternalControl(void)
}
+
/**
- * @brief Установка параметров на дефолтные значения @ref UPP_DEFAULT_PARAMS.
+ * @brief Контроль внутренних параметров УПП.
+ * @return HAL Status.
+ */
+void UPP_Params_Saturate(void)
+{
+}
+
+/**
+ * @brief Установка параметров на дефолтные значения @ref UPP_PARAMS_DEFAULT.
* @param pui_default Сбросить параметры ПУИ
* @param internal_default Сбросить внутренние параметры
* @return HAL Status.
*/
-void UPP_SetDefault(int pui_default, int internal_default)
+void UPP_Params_SetDefault(int pui_default, int internal_default)
{
if(pui_default)
{
diff --git a/UPP/Core/UPP/upp_params.h b/UPP/Core/UPP/upp_params.h
index 9f80af0..22a3db6 100644
--- a/UPP/Core/UPP/upp_params.h
+++ b/UPP/Core/UPP/upp_params.h
@@ -96,8 +96,8 @@ typedef struct
/* Контроль внутренних параметров УПП. */
-void UPP_Params_InternalControl(void);
+void UPP_Params_ControlInternal(void);
/* Установка параметров на дефолтные значения */
-void UPP_SetDefault(int pui_default, int internal_default);
+void UPP_Params_SetDefault(int pui_default, int internal_default);
#endif //_UPP_PARAMS_H
\ No newline at end of file
diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx
index 511f869..5c7eb76 100644
--- a/UPP/MDK-ARM/UPP.uvoptx
+++ b/UPP/MDK-ARM/UPP.uvoptx
@@ -331,7 +331,7 @@