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