diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h b/MATLAB/MCU_STM32_Matlab/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h index 22d687c..3cc8caa 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h @@ -1247,7 +1247,7 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval None */ -#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR &= ~(__INTERRUPT__)) /** * @brief Indicates whether or not the TIM Counter is used as downcounter. diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/MATLAB/MCU_STM32_Matlab/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h index dab5756..53f3167 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h @@ -1254,7 +1254,7 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval None */ -#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR &= ~(__INTERRUPT__)) /** * @brief Indicates whether or not the TIM Counter is used as downcounter. diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.c b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.c index 4e4ea46..74c2933 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.c +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.c @@ -13,10 +13,14 @@ void TIM_Call_IRQHandller(TIM_TypeDef* TIMx); /* Базовая функция для симуляции таймера: она вызывается каждый шаг симуляции */ void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS) { + if (!(TIMx->CR1 & TIM_CR1_CEN)) // таймер не включен - возврат + { + TIMS->RepititiveCnt = 0; + return; + } + Overflow_Check(TIMx, TIMS); - - // Выбор режима работы таймера switch (TIMx->SMCR & TIM_SMCR_SMS) // TIMER MODE { @@ -50,9 +54,9 @@ void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS) /* Счет таймера за один такт */ void TIMx_Count(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS) { - if ((TIMx->CR1 & TIM_CR1_DIR) && TIMx->CR1) // up COUNTER and COUNTER ENABLE + if ((TIMx->CR1 & TIM_CR1_DIR)) // up COUNTER ENABLE TIMS->tx_cnt -= TIMS->tx_step / (TIMx->PSC + 1); - else if (((TIMx->CR1 & TIM_CR1_DIR) == 0) && TIMx->CR1) // down COUNTER and COUNTER ENABLE + else if (((TIMx->CR1 & TIM_CR1_DIR) == 0)) // down COUNTER ENABLE TIMS->tx_cnt += TIMS->tx_step / (TIMx->PSC + 1); TIMx->CNT = (uint32_t)TIMS->tx_cnt; } @@ -66,20 +70,40 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS) if ((TIMx->CR1 & TIM_CR1_ARPE) == 0) TIMS->RELOAD = TIMx->ARR; // PRELOAD disable - update ARR every itteration if (TIMS->tx_cnt > TIMS->RELOAD || TIMS->tx_cnt < 0) // OVERFLOW { + TIMS->RELOAD = TIMx->ARR; // RELOAD ARR + + if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER + TIMS->tx_cnt -= TIMS->RELOAD + 1; + else if (TIMS->tx_cnt < 0) + TIMS->tx_cnt += TIMS->RELOAD + 1; + + if (TIMS->tx_step > TIMS->RELOAD) + TIMS->tx_cnt = 0; + + if (!(TIMx->CR1 & TIM_CR1_OPM)) // if no one pulse + { TIMS->Updated = 1; - TIMS->RELOAD = TIMx->ARR; // RELOAD ARR - - if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER - TIMS->tx_cnt -= TIMS->RELOAD+1; - else if (TIMS->tx_cnt < 0) - TIMS->tx_cnt += TIMS->RELOAD+1; - - if(TIMS->tx_step > TIMS->RELOAD) - TIMS->tx_cnt = 0; - if (TIMx->DIER & TIM_DIER_UIE) { - TIMx->SR |= TIM_SR_UIF; + TIMx->SR |= TIM_SR_UIF; } + } + else // if one pulse mode enabled + { + if (TIMS->RepititiveCnt >= TIMx->RCR) + { + TIMS->RepititiveCnt = 0; + TIMS->Updated = 1; + TIMx->CR1 &= ~TIM_CR1_CEN; + if (TIMx->DIER & TIM_DIER_UIE) { + TIMx->SR |= TIM_SR_UIF; + } + } + else + { + TIMS->RepititiveCnt++; + } + } + } } } diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.h b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.h index 9314aec..0561697 100644 --- a/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.h +++ b/MATLAB/MCU_STM32_Matlab/Drivers/STM32_SIMULINK/stm32_matlab_tim.h @@ -73,6 +73,7 @@ struct TIM_Sim double tx_cnt; // счетчик таймера double tx_step; // шаг счета за один шаг симуляции long long RELOAD; // буфер, если PRELOAD = 1 + long long RepititiveCnt; // буфер, если PRELOAD = 1 struct Channels_Sim Channels; // структура для симуляции каналов }; ///////////////////////////////////////////////////////////////////// diff --git a/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c b/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c index 4d04c32..abac0d6 100644 --- a/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c +++ b/MATLAB/MCU_STM32_Matlab/stm32_matlab_conf.c @@ -217,10 +217,10 @@ void Init_TIM_SIM(void) tim8s.Channels.OC1_PIN_SHIFT = 0; tim8s.Channels.OC2_GPIOx = GPIOA; tim8s.Channels.OC2_PIN_SHIFT = 0; - tim8s.Channels.OC3_GPIOx = GPIOA; - tim8s.Channels.OC3_PIN_SHIFT = 0; - tim8s.Channels.OC4_GPIOx = GPIOA; - tim8s.Channels.OC4_PIN_SHIFT = 0; + tim8s.Channels.OC3_GPIOx = GPIOC; + tim8s.Channels.OC3_PIN_SHIFT = 8; + tim8s.Channels.OC4_GPIOx = GPIOC; + tim8s.Channels.OC4_PIN_SHIFT = 9; #endif #ifdef USE_TIM9 memset(&tim9s, 0, sizeof(tim9s)); diff --git a/MATLAB/app_wrapper/app_init.c b/MATLAB/app_wrapper/app_init.c index f107614..5850d67 100644 --- a/MATLAB/app_wrapper/app_init.c +++ b/MATLAB/app_wrapper/app_init.c @@ -18,14 +18,15 @@ void app_init(void) { // если не используется отдельный поток для main(). HAL_Init(); MX_DMA_Init(); + MX_IWDG_Init(); MX_TIM1_Init(); MX_TIM2_Init(); MX_TIM3_Init(); MX_TIM8_Init(); MX_TIM5_Init(); MX_ADC3_Init(); - UPP_SetDefault(1, 1); - UPP_Init(); + UPP_Params_SetDefault(1, 1); + UPP_App_Init(); UPP_PreWhile(); UPP_DO.CEN(DISABLE); diff --git a/MATLAB/app_wrapper/app_io.c b/MATLAB/app_wrapper/app_io.c index 47b461d..fa2bff6 100644 --- a/MATLAB/app_wrapper/app_io.c +++ b/MATLAB/app_wrapper/app_io.c @@ -92,7 +92,7 @@ void Write_AngleControl(real_T* Buffer, int ind_port) int nn = 0; WriteOutputArray(upp.hangle.Iref, ind_port, nn++); - WriteOutputArray(upp.pm.measured.final.Iamp, ind_port, nn++); + WriteOutputArray(upp.hangle.Imeas, ind_port, nn++); WriteOutputArray(upp.hangle.alpha, ind_port, nn++); @@ -125,8 +125,8 @@ void app_readInputs(const real_T* Buffer) { MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(1, 6) * 10000; MB_INTERNAL.param.angle.PID_ExpAlpha = ReadInputArray(1, 7) * 65535; - MB_INTERNAL.param.nominal.U = ReadInputArray(1, 8) * 10000; - MB_INTERNAL.param.nominal.I = ReadInputArray(1, 9) * 65535; + MB_INTERNAL.param.nominal.U = ReadInputArray(1, 8) * 10; + MB_INTERNAL.param.nominal.I = ReadInputArray(1, 9) * 10; // USER APP INPUT END } diff --git a/MATLAB/app_wrapper/app_wrapper.c b/MATLAB/app_wrapper/app_wrapper.c index 3941387..01369f2 100644 --- a/MATLAB/app_wrapper/app_wrapper.c +++ b/MATLAB/app_wrapper/app_wrapper.c @@ -9,6 +9,13 @@ void app_step(void) { // USER APP STEP START + static int first_step = 0; + if(first_step == 0) + { + first_step = 1; + UPP_DO.CEN(ENABLE); + } + UPP_While(); diff --git a/MATLAB/upp_init.m b/MATLAB/upp_init.m index cf3093d..7aaf9df 100644 --- a/MATLAB/upp_init.m +++ b/MATLAB/upp_init.m @@ -2,6 +2,7 @@ clear all Ts = 5e-6; Vnom = 400; +Inom = 30; Fnom = 50; Temperature1 = 2.22; % 20 градусов diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx index 3576746..3864d75 100644 Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ diff --git a/MATLAB/upp_r2023.slx.original b/MATLAB/upp_r2023.slx.original new file mode 100644 index 0000000..361b02d Binary files /dev/null and b/MATLAB/upp_r2023.slx.original differ diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h index 65fc927..f4f1cc9 100644 --- a/UPP/Core/Configs/upp_config.h +++ b/UPP/Core/Configs/upp_config.h @@ -30,7 +30,7 @@ #define TEMP_1 0 #define TEMP_2 1 -#define UPP_SIMULATE_I ///< Симулировт токи а не брать с АЦП +//#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП /** * @addtogroup UPP_PARAMS_DEFAULT Default params for external flash @@ -144,6 +144,16 @@ #define ANGLE_TIM2_FREQ_MHZ 84 ///< Частота тиков таймера отсчета угла открытия тиристоров #define HAL_PWREx_EnableOverDrive() HAL_ERROR +#endif +// ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ MATLAB ====== + +#if defined(MATLAB) +#undef UPP_INIT_BEFORE_READY_MS + + +#define UPP_INIT_BEFORE_READY_MS 100 ///< Сколько сканировать сеть, перед выставлением состояния готовности + + #endif /** //UPP_COMPILED_PARAMS * @} diff --git a/UPP/Core/UPP/angle_control.c b/UPP/Core/UPP/angle_control.c index d97c748..e25d7d3 100644 --- a/UPP/Core/UPP/angle_control.c +++ b/UPP/Core/UPP/angle_control.c @@ -81,9 +81,9 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement) return; hangle->Iref = Filter_Process(&hangle->refFilter, setpoint); - + hangle->Imeas = measurement; /* Ошибка регулирования = уставка - измеренное */ - float err = hangle->Iref - measurement; + float err = hangle->Iref - hangle->Imeas; /* ПИД регулирование */ float open_control = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано diff --git a/UPP/Core/UPP/angle_control.h b/UPP/Core/UPP/angle_control.h index b218f31..9b72f8b 100644 --- a/UPP/Core/UPP/angle_control.h +++ b/UPP/Core/UPP/angle_control.h @@ -27,6 +27,7 @@ typedef struct Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров float Iref; ///< текущее задание тока в о.е. [0..1] + float Imeas; ///< измеренное значение тока в о.е. [0..1] float alpha; ///< текущий угол открытия в о.е. [0..1] (% от периода) arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c index b32b125..8f5c4d2 100644 --- a/UPP/Core/UPP/upp_main.c +++ b/UPP/Core/UPP/upp_main.c @@ -30,6 +30,8 @@ int UPP_App_Init(void) upp.PUI.values = &MB_DATA.InRegs.pui; upp.call = &MB_INTERNAL.FuncCalls; + UPP_DO.CEN(ENABLE); + if(HAL_TIM_Base_Start(&ustim) != HAL_OK) { return 1; @@ -46,6 +48,7 @@ int UPP_App_Init(void) { return 1; } + return 0; } @@ -82,7 +85,6 @@ int UPP_While(void) HAL_IWDG_Refresh(&hiwdg); BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY); - UPP_DO.CEN(ENABLE); // если ошибка вызываем СТОП if(errors.pui.all) { diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c index 66314c7..cf41e0f 100644 --- a/UPP/Core/UPP/upp_params.c +++ b/UPP/Core/UPP/upp_params.c @@ -173,7 +173,7 @@ void UPP_Params_ControlInternal(void) /** - * @brief Контроль внутренних параметров УПП. + * @brief Контроль параметров УПП на корректные значения. * @return HAL Status. */ void UPP_Params_Saturate(void) diff --git a/UPP/MDK-ARM/UPP.uvoptx b/UPP/MDK-ARM/UPP.uvoptx index 5c7eb76..aa75c66 100644 --- a/UPP/MDK-ARM/UPP.uvoptx +++ b/UPP/MDK-ARM/UPP.uvoptx @@ -358,6 +358,22 @@ + + 2 + 0 + 136 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ../Core/Src/stm32f4xx_it.c + + +
@@ -1193,7 +1209,7 @@ MyLibs - 1 + 0 0 0 0 diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx index 45f9920..20b686b 100644 --- a/UPP/MDK-ARM/UPP.uvprojx +++ b/UPP/MDK-ARM/UPP.uvprojx @@ -17,8 +17,8 @@ STM32F427ZGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.17.1 - https://www.keil.com/pack/ + Keil.STM32F4xx_DFP.2.16.0 + http://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.17.1 - https://www.keil.com/pack/ + Keil.STM32F4xx_DFP.2.16.0 + http://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE