Compare commits

...

2 Commits

Author SHA1 Message Date
d918ffb860 ШИМ и контроль угла отлажене на 417 более менее
Оптимизированы конфиг дефайны - в мкс и мс, а не тиках
2025-11-20 19:14:21 +03:00
2b22c5b0eb TIM3 и TIM8 поменяты местами
плюс по мелочи:
- полряность каналов
- симуляция тока для отладки без тока на АЦП
- регулируемый запас на максимальнйы угол
2025-11-20 10:57:47 +03:00
21 changed files with 361 additions and 222 deletions

View File

@ -88,6 +88,7 @@ set code_PERIPH=.\MCU_STM32_Matlab\stm32_matlab_conf.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_iwdg.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c^

View File

@ -7,7 +7,7 @@
#include "app_wrapper.h"
float dbg[16];
extern float iref_dbg;
extern float dbg_iref;
#define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0
void Write_UPP_Outputs(real_T* Buffer, int ind_port)
@ -115,7 +115,7 @@ void app_readInputs(const real_T* Buffer) {
ADC_Set_Channel_Value(ADC3, 8, ReadInputArray(0,4));
ADC_Set_Channel_Value(ADC3, 10, ReadInputArray(0,5));
iref_dbg = ReadInputArray(1, 0);
dbg_iref = ReadInputArray(1, 0);
upp.call->go = ReadInputArray(1, 1);
MB_INTERNAL.param.angle.Angle_Max = ReadInputArray(1, 2)*65535;

View File

@ -30,21 +30,21 @@
#define TEMP_1 0
#define TEMP_2 1
#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 Префиксы
* @{
*/
/* Номинальные параметры */
/* Уставки по температурам */
#define SETPOINT_TEMP_WARN 70
#define SETPOINT_TEMP_ERR 85
/* Номинальные параметры */
#define NOM_PHASE_NUMB 3
#define NOM_U_V_DEFAULT 690
@ -56,12 +56,12 @@
#define NOM_I_A_DEFAULT 5
/* Параметры ПУИ */
#define PUI_Iref_PERCENT_DEFAULT 150
#define PUI_Iref_PERCENT_DEFAULT 1.5
#define PUI_Tnt_MS_DEFAULT 300
#define PUI_Umin_PERCENT_DEFAULT 80
#define PUI_Umax_PERCENT_DEFAULT 120
#define PUI_Imax_PERCENT_DEFAULT 99
#define PUI_Imin_PERCENT_DEFAULT 7
#define PUI_Umin_PERCENT_DEFAULT 0.8
#define PUI_Umax_PERCENT_DEFAULT 1.2
#define PUI_Imax_PERCENT_DEFAULT 0.99
#define PUI_Imin_PERCENT_DEFAULT 0.07
#define PUI_TiMax_US_DEFAULT 5000
#define PUI_Tdelay_SECONDS_DEFAULT 30
#define PUI_Interlace_EN_DEFAULT 5000
@ -73,12 +73,13 @@
/* Параметры регулятора угла */
#define ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT 1.0
#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.01
#define ANGLE_REF_ALPHA_COEF_DEFAULT 0.0001
/* Параметри мониторинга сети */
#define PM_EXP_ALPHA_COEF_DEFAULT 0.01
@ -97,7 +98,7 @@
#define PWM_THYR_FREQUENCY_HZ_DEFAULT 20000
#define PWM_THYR_PULSE_NUMBER_DEFAULT 20
/** //UPP_DEFAULT_PARAMS
/** //UPP_PARAMS_DEFAULT
* @}
*/
@ -109,18 +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 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 ///< Частота тиков таймера отсчета угла открытия тиристоров
@ -129,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

View File

@ -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 Состояния полуволны
*/

View File

@ -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

View File

@ -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-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)

View File

@ -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,10 +96,10 @@ 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[AVG_FBA+i]);
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);
}
return HAL_OK;

View File

@ -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;

View File

@ -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

View File

@ -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 */

View File

@ -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 */
}
}

View File

@ -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))

View File

@ -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
}
@ -295,6 +338,30 @@ HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_Hal
}
/**
* @brief Установка полярности шим.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @param polarity Какая полярность: состяоние бита CCxP
* @return HAL Status.
*/
HAL_StatusTypeDef PWM_SetPolarity(PWM_Handle_t *hpwm, int polarity)
{
if(assert_upp(hpwm))
return HAL_ERROR;
if(polarity)
{
hpwm1.Instance->CCER |= TIM_CCER_CC1P | TIM_CCER_CC2P | TIM_CCER_CC3P | TIM_CCER_CC4P;
hpwm2.Instance->CCER |= TIM_CCER_CC1P | TIM_CCER_CC2P | TIM_CCER_CC3P | TIM_CCER_CC4P;
}
else
{
hpwm1.Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P | TIM_CCER_CC3P | TIM_CCER_CC4P);
hpwm2.Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P | TIM_CCER_CC3P | TIM_CCER_CC4P);
}
return HAL_OK;
}
/**
* @brief Установка режима для канала ШИМ.
* @param hpwm Указатель на хендл ШИМ тиристоров
* @param Phase Для какой фазы надо установить состояние
@ -308,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:
@ -332,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;
}
}

View File

@ -10,7 +10,7 @@
#define PWM_HARDWARE_IMPULSES_CONTROL
#define PWM_ENABLE TIM_OCMODE_PWM2
@ -99,7 +99,8 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_
HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t Frequency, uint8_t PulseNumber);
/* Установка полуволны для слежения. */
HAL_StatusTypeDef PWM_SetHalfWave(PWM_Handle_t *hpwm, UPP_Phase_t Phase, UPP_HalfWave_t halfwave);
/* Установка полярности шим. */
HAL_StatusTypeDef PWM_SetPolarity(PWM_Handle_t *hpwm, int polarity);
// ====== СЕРВИС ==========
/* Хендл ШИМ тиристоров. */
HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm);

View File

@ -10,15 +10,16 @@
#include "iwdg.h"
UPP_t upp;
float iref_dbg = 0;
// ОСНОВНОЙ ЦИКЛ main.c
float dbg_iref = 1;
int dbg_polarity = 0;
/**
* @brief Инициализация УПП.
* @return 0 - если ОК, >1 если ошибка.
*/
int UPP_Init(void)
int UPP_App_Init(void)
{
upp.workmode = UPP_Init;
/* Очищаем входы */
UPP_IO_Init();
@ -44,9 +45,7 @@ int UPP_Init(void)
if(Angle_Init(&upp.hangle) != HAL_OK)
{
return 1;
}
upp.workmode = UPP_Ready;
}
return 0;
}
@ -56,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;
@ -74,9 +73,12 @@ int UPP_PreWhile(void)
*/
int UPP_While(void)
{
PWM_SetPolarity(&upp.hpwm, dbg_polarity);
int retval = 0;
if(upp.pm.f.runSlow)
{
static uint32_t slow_cnt = 0;
HAL_IWDG_Refresh(&hiwdg);
BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY);
@ -98,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);
}
// Медленные расчеты
@ -110,6 +112,19 @@ int UPP_While(void)
// Автомат состояний УПП
switch(upp.workmode)
{
/* Состояние инициализации */
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;
/* Состояние готовности */
case UPP_Ready:
PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ
@ -135,11 +150,14 @@ int UPP_While(void)
UPP_DO.Error(DISABLE);
// если пришла команда на остановку
if (!upp.call->go)
upp.workmode = UPP_Ready;
upp.workmode = UPP_Init;
// Регулирование тиристоров
Angle_PID(&upp.hangle, iref_dbg, upp.pm.measured.final.Iamp);
// Регулирование тиристоров
#ifndef UPP_SIMULATE_I // берем с АЦП
Angle_PID(&upp.hangle, dbg_iref, upp.pm.measured.final.Iamp);
#else // симулируем
Angle_PID(&upp.hangle, dbg_iref, upp.hangle.Iref/2);
#endif
// если слишком долгий запуск
if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000))
{
@ -166,7 +184,7 @@ int UPP_While(void)
UPP_DO.Error(ENABLE);
// Находимся до тех пор пока ошибки не будет устранена
if(errors.common == Err_None)
upp.workmode = UPP_Ready;
upp.workmode = UPP_Init;
retval = 1;
break;
@ -174,7 +192,7 @@ int UPP_While(void)
UPP_Errors_Handle();
UPP_Params_InternalControl();
UPP_Params_ControlInternal();
upp.pm.f.runSlow = 0;
@ -194,7 +212,7 @@ int UPP_While(void)
*/
void UPP_Tick(void)
{
if(upp.workmode == UPP_Not_Init)
if(upp.workmode == UPP_Init)
return;
}

View File

@ -49,7 +49,7 @@ extern UPP_t upp;
/* Инициализация УПП */
int UPP_Init(void);
int UPP_App_Init(void);
/* Инициализация основного цикла УПП. */
int UPP_PreWhile(void);
/* Основной цикл УПП. */

View File

@ -18,8 +18,9 @@ static void __AngleSetLimit(void);
* @brief Контроль внутренних параметров УПП.
* @return HAL Status.
*/
void UPP_Params_InternalControl(void)
void UPP_Params_ControlInternal(void)
{
__AngleSetLimit();
if(upp.call->go) // при запущеном УПП ничего не меняем
return;
@ -162,34 +163,39 @@ void UPP_Params_InternalControl(void)
if(PWM_SetConfig(&upp.hpwm, pwm_phase_mask, pwm_freq, pwm_pulse_num) == HAL_OK)
{
pwm_update = 0;
__AngleSetLimit();
}
else
ERR_PRIVATE_CNT.pwm_reinit_err++;
}
if ((upp.hangle.Config.PeriodLimit == 0) || (upp.hangle.Config.PeriodLimit >= 0.999))
{
__AngleSetLimit();
}
}
/**
* @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)
{
PARAM_PUI.Iref = PUI_Iref_PERCENT_DEFAULT;
PARAM_PUI.Iref = PUI_Iref_PERCENT_DEFAULT*100;
PARAM_PUI.Tnt = PUI_Tnt_MS_DEFAULT;
PARAM_PUI.Umin = PUI_Umin_PERCENT_DEFAULT;
PARAM_PUI.Umax = PUI_Umax_PERCENT_DEFAULT;
PARAM_PUI.Imax = PUI_Imax_PERCENT_DEFAULT;
PARAM_PUI.Imin = PUI_Imin_PERCENT_DEFAULT;
PARAM_PUI.Umin = PUI_Umin_PERCENT_DEFAULT*100;
PARAM_PUI.Umax = PUI_Umax_PERCENT_DEFAULT*100;
PARAM_PUI.Imax = PUI_Imax_PERCENT_DEFAULT*100;
PARAM_PUI.Imin = PUI_Imin_PERCENT_DEFAULT*100;
PARAM_PUI.TiMax = PUI_TiMax_US_DEFAULT;
PARAM_PUI.Tdelay = PUI_Tdelay_SECONDS_DEFAULT;
PARAM_PUI.Interlace = PUI_Interlace_EN_DEFAULT;
@ -234,6 +240,7 @@ void UPP_SetDefault(int pui_default, int internal_default)
PARAM_INTERNAL.angle.PID_ExpAlpha = ANGLE_REF_ALPHA_COEF_DEFAULT*65535;
PARAM_INTERNAL.angle.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535;
PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535;
PARAM_INTERNAL.angle.PulseLengthReserve = ANGLE_PULSE_LENGTH_RESERVE_PERCENT_DEFAULT*100;
//__AngleSetLimit();
}
}
@ -243,9 +250,10 @@ void UPP_SetDefault(int pui_default, int internal_default)
// Перерасчет максимально допустимого угла
static void __AngleSetLimit(void)
{ // Сколько пачка ипульсов занимает процентов от всего периода
float pulses_percent_of_period = (((float)PARAM_INTERNAL.pwm.PulseNumber / PARAM_INTERNAL.pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(NOM_F_HZ_DEFAULT);
float pulses_percent_of_period = (((float)PARAM_INTERNAL.pwm.PulseNumber / PARAM_INTERNAL.pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(upp.pm.measured.final.Fmean);
// Вычитаем этот процент из 1 - получаем максимально безопасный угол
float angle_limit = 1 - pulses_percent_of_period*1.5; // добавляем запас в половину пачки импульсов
float angle_limit = 1 - pulses_percent_of_period;
angle_limit -= pulses_percent_of_period*to_float(PARAM_INTERNAL.angle.PulseLengthReserve, 100); // добавляем запас в PulseLengthReserve процентов от пачки импульсов
Angle_SetLimit(&upp.hangle, angle_limit);
}

View File

@ -80,6 +80,8 @@ typedef struct
/* Параметры Угла */
struct
{
uint16_t PulseLengthReserve;/*!< @brief Сколько запаса закладывать на длительность пачки импульсов [Проценты] @ref __AngleSetLimit
@details Пример: 100% - будет запас в одну пачку импульсов */
uint16_t Angle_Max; ///< Максимальный угол открытия тиристора [0..1 x 65535]
uint16_t Angle_Min; ///< Минимальный угол открытия тиристора [0..1 x 65535]
uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 10000]
@ -94,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

View File

@ -331,7 +331,7 @@
<Type>0</Type>
<LineNumber>407</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134233366</Address>
<Address>134233418</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
@ -363,52 +363,77 @@
<Ww>
<count>0</count>
<WinNumber>1</WinNumber>
<ItemText>upp,0x0A</ItemText>
<ItemText>upp.call,0x0A</ItemText>
</Ww>
<Ww>
<count>1</count>
<WinNumber>1</WinNumber>
<ItemText>uwTick,0x0A</ItemText>
<ItemText>upp,0x0A</ItemText>
</Ww>
<Ww>
<count>2</count>
<WinNumber>1</WinNumber>
<ItemText>errors.prvt.f.err,0x0A</ItemText>
<ItemText>uwTick,0x0A</ItemText>
</Ww>
<Ww>
<count>3</count>
<WinNumber>1</WinNumber>
<ItemText>errors.prvt.cnt,0x0A</ItemText>
<ItemText>errors.prvt.f.err</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>1</WinNumber>
<ItemText>hbt,0x0A</ItemText>
<ItemText>errors.prvt.cnt</ItemText>
</Ww>
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>htim5.Instance-&gt;CNT,0x0A</ItemText>
<ItemText>hbt,0x0A</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>htim5.Instance-&gt;PSC,0x0A</ItemText>
<ItemText>sysclockfreq,0x0A</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>SystemCoreClock,0x0A</ItemText>
<ItemText>\\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>sysclockfreq,0x0A</ItemText>
<ItemText>dbg_polarity,0x0A</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>1</WinNumber>
<ItemText>\\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing</ItemText>
<ItemText>dbg_iref</ItemText>
</Ww>
<Ww>
<count>10</count>
<WinNumber>1</WinNumber>
<ItemText>upp.call-&gt;reset_mcu</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>1</WinNumber>
<ItemText>upp.pm.zc.Channel[0].HalfWave</ItemText>
</Ww>
<Ww>
<count>12</count>
<WinNumber>1</WinNumber>
<ItemText>upp.call-&gt;reserved</ItemText>
</Ww>
<Ww>
<count>13</count>
<WinNumber>1</WinNumber>
<ItemText>\\Debug_F417\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c\uwTick</ItemText>
</Ww>
<Ww>
<count>14</count>
<WinNumber>1</WinNumber>
<ItemText>htim1</ItemText>
</Ww>
</WatchWindow1>
<WatchWindow2>
@ -518,18 +543,8 @@
<LogicAnalyzers>
<Wi>
<IntNumber>0</IntNumber>
<FirstString>`upp.pm.measured.real.U[0]</FirstString>
<SecondString>0000000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B305D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000001000000731CC7711CC7D13F1400000000000000000000000000000000000000A49F0008</SecondString>
</Wi>
<Wi>
<IntNumber>1</IntNumber>
<FirstString>`upp.pm.measured.real.U[1]</FirstString>
<SecondString>0080000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B315D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000002000000398EE3388EE3D83F1400000000000000000000000000000000000000A49F0008</SecondString>
</Wi>
<Wi>
<IntNumber>2</IntNumber>
<FirstString>`upp.pm.measured.final.F[0]</FirstString>
<SecondString>0000800000000000000000000000000000805140000000000000000000000000000000007570702E706D2E6D656173757265642E66696E616C2E465B305D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000003000000555555555555D53F140000000000000000000000000000000000000028020008</SecondString>
<FirstString>`upp.pm.zc.Channel[0].HalfWave</FirstString>
<SecondString>0000000000000000000000000000000000000040000000000000000000000000000000007570702E706D2E7A632E4368616E6E656C5B305D2E48616C66576176650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000001000000000000000000F03F1400000000000000000000000000000000000000FC9E0008</SecondString>
</Wi>
</LogicAnalyzers>
<SystemViewers>
@ -545,6 +560,10 @@
<Name>System Viewer\TIM14</Name>
<WinId>35903</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM2</Name>
<WinId>35900</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM5</Name>
<WinId>35905</WinId>

View File

@ -7,7 +7,7 @@ ADC3.Channel-19\#ChannelRegularConversion=ADC_CHANNEL_8
ADC3.Channel-20\#ChannelRegularConversion=ADC_CHANNEL_10
ADC3.DMAContinuousRequests=ENABLE
ADC3.EOCSelection=ADC_EOC_SEQ_CONV
ADC3.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T8_TRGO
ADC3.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T3_TRGO
ADC3.IPParameters=Rank-15\#ChannelRegularConversion,Channel-15\#ChannelRegularConversion,SamplingTime-15\#ChannelRegularConversion,NbrOfConversionFlag,NbrOfConversion,ScanConvMode,Rank-16\#ChannelRegularConversion,Channel-16\#ChannelRegularConversion,SamplingTime-16\#ChannelRegularConversion,Rank-17\#ChannelRegularConversion,Channel-17\#ChannelRegularConversion,SamplingTime-17\#ChannelRegularConversion,Rank-18\#ChannelRegularConversion,Channel-18\#ChannelRegularConversion,SamplingTime-18\#ChannelRegularConversion,Rank-19\#ChannelRegularConversion,Channel-19\#ChannelRegularConversion,SamplingTime-19\#ChannelRegularConversion,Rank-20\#ChannelRegularConversion,Channel-20\#ChannelRegularConversion,SamplingTime-20\#ChannelRegularConversion,ExternalTrigConv,EOCSelection,DMAContinuousRequests
ADC3.NbrOfConversion=6
ADC3.NbrOfConversionFlag=1
@ -128,25 +128,24 @@ 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_TIM2_VS_ClockSourceINT
Mcu.Pin59=VP_TIM2_VS_no_output1
Mcu.Pin58=VP_TIM1_VS_OPM
Mcu.Pin59=VP_TIM2_VS_ClockSourceINT
Mcu.Pin6=PC14/OSC32_IN
Mcu.Pin60=VP_TIM2_VS_no_output2
Mcu.Pin61=VP_TIM2_VS_no_output3
Mcu.Pin62=VP_TIM3_VS_ControllerModeTrigger
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_ClockSourceINT
Mcu.Pin64=VP_TIM3_VS_ClockSourceITR
Mcu.Pin65=VP_TIM3_VS_OPM
Mcu.Pin66=VP_TIM5_VS_ClockSourceINT
Mcu.Pin67=VP_TIM8_VS_ClockSourceINT
Mcu.Pin68=VP_TIM11_VS_ClockSourceINT
Mcu.Pin69=VP_TIM12_VS_ClockSourceINT
Mcu.Pin64=VP_TIM5_VS_ClockSourceINT
Mcu.Pin65=VP_TIM8_VS_ClockSourceINT
Mcu.Pin66=VP_TIM8_VS_OPM
Mcu.Pin67=VP_TIM11_VS_ClockSourceINT
Mcu.Pin68=VP_TIM12_VS_ClockSourceINT
Mcu.Pin7=PC15/OSC32_OUT
Mcu.Pin8=PF6
Mcu.Pin9=PF7
Mcu.PinsNb=70
Mcu.PinsNb=69
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;usTick,ustim.Instance->CNT;hpwm2,htim3;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1;ANGLE_CHANNEL_1,TIM_CHANNEL_1;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;angletim,htim2
Mcu.UserConstants=angletim,htim2;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;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;ANGLE_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim3;usTick,ustim.Instance->CNT;hpwm2,htim8;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1
Mcu.UserName=STM32F427ZGTx
MxCube.Version=6.12.1
MxDb.Version=DB.6.0.121
@ -192,7 +191,7 @@ PA4.Signal=GPIO_Output
PA5.GPIOParameters=PinState,GPIO_Label
PA5.GPIO_Label=DO4
PA5.Locked=true
PA5.PinState=GPIO_PIN_SET
PA5.PinState=GPIO_PIN_RESET
PA5.Signal=GPIO_Output
PA6.GPIOParameters=PinState,GPIO_Label
PA6.GPIO_Label=RDO4
@ -262,10 +261,9 @@ PC12.GPIOParameters=GPIO_Label
PC12.GPIO_Label=UM_SPI_MOSI
PC12.Mode=Full_Duplex_Master
PC12.Signal=SPI3_MOSI
PC13.GPIOParameters=PinState,GPIO_Label
PC13.GPIOParameters=GPIO_Label
PC13.GPIO_Label=DO3
PC13.Locked=true
PC13.PinState=GPIO_PIN_SET
PC13.Signal=GPIO_Output
PC14/OSC32_IN.Mode=LSE-External-Oscillator
PC14/OSC32_IN.Signal=RCC_OSC32_IN
@ -277,16 +275,15 @@ PC6.Mode=Asynchronous
PC6.Signal=USART6_TX
PC7.GPIOParameters=GPIO_Label
PC7.GPIO_Label=SCIR2
PC7.Locked=true
PC7.Mode=Asynchronous
PC7.Signal=USART6_RX
PC8.GPIOParameters=GPIO_Label
PC8.GPIO_Label=PWM5
PC8.Locked=true
PC8.Signal=S_TIM3_CH3
PC8.Signal=S_TIM8_CH3
PC9.GPIOParameters=GPIO_Label
PC9.GPIO_Label=PWM6
PC9.Locked=true
PC9.Signal=S_TIM3_CH4
PC9.Signal=S_TIM8_CH4
PD2.GPIOParameters=GPIO_Label
PD2.GPIO_Label=DIN3
PD2.Locked=true
@ -405,7 +402,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_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,16-MX_TIM5_Init-TIM5-false-HAL-true,17-MX_TIM2_Init-TIM2-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_RTC_Init-RTC-true-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,16-MX_TIM5_Init-TIM5-false-HAL-true,17-MX_TIM2_Init-TIM2-false-HAL-true
RCC.48MHZClocksFreq_Value=90000000
RCC.AHBFreq_Value=180000000
RCC.APB1CLKDivider=RCC_HCLK_DIV4
@ -460,10 +457,10 @@ SH.S_TIM1_CH3.0=TIM1_CH3,PWM Generation3 CH3
SH.S_TIM1_CH3.ConfNb=1
SH.S_TIM1_CH4.0=TIM1_CH4,PWM Generation4 CH4
SH.S_TIM1_CH4.ConfNb=1
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_TIM8_CH3.0=TIM8_CH3,PWM Generation3 CH3
SH.S_TIM8_CH3.ConfNb=1
SH.S_TIM8_CH4.0=TIM8_CH4,PWM Generation4 CH4
SH.S_TIM8_CH4.ConfNb=1
SPI3.CalculateBaudRate=22.5 MBits/s
SPI3.Direction=SPI_DIRECTION_2LINES
SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate
@ -473,8 +470,9 @@ TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM1.IPParameters=Prescaler,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger
TIM1.IPParameters=Prescaler,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger,RepetitionCounter
TIM1.Prescaler=0
TIM1.RepetitionCounter=20
TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM11.IPParameters=Prescaler
TIM11.Prescaler=180-1
@ -487,17 +485,19 @@ TIM2.IPParameters=Channel-Output Compare2 No Output,Channel-Output Compare1 No O
TIM2.OCMode_1=TIM_OCMODE_TIMING
TIM2.OCMode_2=TIM_OCMODE_TIMING
TIM2.OCMode_3=TIM_OCMODE_TIMING
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,TIM_MasterSlaveMode,TIM_MasterOutputTrigger
TIM3.TIM_MasterOutputTrigger=TIM_TRGO_RESET
TIM3.IPParameters=TIM_MasterSlaveMode,TIM_MasterOutputTrigger
TIM3.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM3.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_ENABLE
TIM5.IPParameters=Prescaler
TIM5.Prescaler=90-1
TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger
TIM8.Period=1800-1
TIM8.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM8.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,OC4Preload_PWM,RepetitionCounter
TIM8.OC4Preload_PWM=ENABLE
TIM8.Period=65535
TIM8.Prescaler=0
TIM8.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM8.RepetitionCounter=20
TIM8.TIM_MasterOutputTrigger=TIM_TRGO_RESET
TIM8.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_DISABLE
USART3.IPParameters=VirtualMode
USART3.VirtualMode=VM_ASYNC
@ -517,6 +517,8 @@ VP_TIM12_VS_ClockSourceINT.Mode=Internal
VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT
VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM1_VS_OPM.Mode=OPM_bit
VP_TIM1_VS_OPM.Signal=TIM1_VS_OPM
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM2_VS_no_output1.Mode=Output Compare1 No Output
@ -527,14 +529,10 @@ VP_TIM2_VS_no_output3.Mode=Output Compare3 No Output
VP_TIM2_VS_no_output3.Signal=TIM2_VS_no_output3
VP_TIM3_VS_ClockSourceINT.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
VP_TIM3_VS_ClockSourceITR.Mode=TriggerSource_ITR0
VP_TIM3_VS_ClockSourceITR.Signal=TIM3_VS_ClockSourceITR
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
VP_TIM8_VS_OPM.Mode=OPM_bit
VP_TIM8_VS_OPM.Signal=TIM8_VS_OPM
board=custom