diff --git a/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/Device/STM32F4xx/stm32f4xx.h b/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/Device/STM32F4xx/stm32f4xx.h
index f7a23fe..278d1f9 100644
--- a/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/Device/STM32F4xx/stm32f4xx.h
+++ b/MATLAB/MCU_STM32_Matlab/Drivers/CMSIS/Device/STM32F4xx/stm32f4xx.h
@@ -224,61 +224,50 @@ typedef enum
#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL)))
-/* Use of CMSIS compiler intrinsics for register exclusive access */
-/* Atomic 32-bit register access macro to set one or several bits */
+ /* Atomic operations for MinGW/GCC */
+ /* Atomic 32-bit register access macro to set one or several bits */
#define ATOMIC_SET_BIT(REG, BIT) \
do { \
- uint32_t val; \
- do { \
- val = __LDREXW((__IO uint32_t *)&(REG)) | (BIT); \
- } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \
+ __sync_fetch_and_or(&(REG), (BIT)); \
} while(0)
/* Atomic 32-bit register access macro to clear one or several bits */
#define ATOMIC_CLEAR_BIT(REG, BIT) \
do { \
- uint32_t val; \
- do { \
- val = __LDREXW((__IO uint32_t *)&(REG)) & ~(BIT); \
- } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \
+ __sync_fetch_and_and(&(REG), ~(BIT)); \
} while(0)
/* Atomic 32-bit register access macro to clear and set one or several bits */
-#define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK) \
- do { \
- uint32_t val; \
- do { \
- val = (__LDREXW((__IO uint32_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \
- } while ((__STREXW(val,(__IO uint32_t *)&(REG))) != 0U); \
+#define ATOMIC_MODIFY_REG(REG, CLEARMSK, SETMASK) \
+ do { \
+ uint32_t old_val, new_val; \
+ do { \
+ old_val = (REG); \
+ new_val = (old_val & ~(CLEARMSK)) | (SETMASK); \
+ } while (!__sync_bool_compare_and_swap(&(REG), old_val, new_val)); \
} while(0)
/* Atomic 16-bit register access macro to set one or several bits */
#define ATOMIC_SETH_BIT(REG, BIT) \
do { \
- uint16_t val; \
- do { \
- val = __LDREXH((__IO uint16_t *)&(REG)) | (BIT); \
- } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \
+ __sync_fetch_and_or((uint16_t *)&(REG), (BIT)); \
} while(0)
/* Atomic 16-bit register access macro to clear one or several bits */
#define ATOMIC_CLEARH_BIT(REG, BIT) \
do { \
- uint16_t val; \
- do { \
- val = __LDREXH((__IO uint16_t *)&(REG)) & ~(BIT); \
- } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \
+ __sync_fetch_and_and((uint16_t *)&(REG), ~(BIT)); \
} while(0)
/* Atomic 16-bit register access macro to clear and set one or several bits */
-#define ATOMIC_MODIFYH_REG(REG, CLEARMSK, SETMASK) \
+#define ATOMIC_MODIFYH_REG(REG, CLEARMSK, SETMASK) \
do { \
- uint16_t val; \
+ uint16_t old_val, new_val; \
do { \
- val = (__LDREXH((__IO uint16_t *)&(REG)) & ~(CLEARMSK)) | (SETMASK); \
- } while ((__STREXH(val,(__IO uint16_t *)&(REG))) != 0U); \
+ old_val = (REG); \
+ new_val = (old_val & ~(CLEARMSK)) | (SETMASK); \
+ } while (!__sync_bool_compare_and_swap((uint16_t *)&(REG), old_val, new_val)); \
} while(0)
-
/**
* @}
*/
diff --git a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h
index c3163e1..80bdbe3 100644
--- a/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h
+++ b/MATLAB/MCU_Wrapper/mcu_wrapper_conf.h
@@ -167,7 +167,7 @@ typedef struct {
unsigned fInitDone : 1; ///< флаг для выхода из потока программы МК
double SimTime; ///< Текущее время симуляции
- long SystemClock; ///< Счетчик тактов для симуляции системных тиков (в целочисленном формате)
+ long long SystemClock; ///< Счетчик тактов для симуляции системных тиков (в целочисленном формате)
double SystemClockDouble; ///< Счетчик в формате double для точной симуляции системных тиков С промежуточными значений
double sSystemClock_step; ///< Шаг тиков для их симуляции, в формате double
diff --git a/MATLAB/MCU_Wrapper/run_mex.bat b/MATLAB/MCU_Wrapper/run_mex.bat
index 8f7f456..849620d 100644
--- a/MATLAB/MCU_Wrapper/run_mex.bat
+++ b/MATLAB/MCU_Wrapper/run_mex.bat
@@ -95,6 +95,8 @@ set code_PERIPH=.\MCU_STM32_Matlab\stm32_matlab_conf.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c^
.\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c^
+ .\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c^
+ .\MCU_STM32_Matlab\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c^
.\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_matlab_tim.c^
.\MCU_STM32_Matlab\Drivers\STM32_SIMULINK\stm32_matlab_adc.c
diff --git a/MATLAB/app_wrapper/app_init.c b/MATLAB/app_wrapper/app_init.c
index 5850d67..e1f0f65 100644
--- a/MATLAB/app_wrapper/app_init.c
+++ b/MATLAB/app_wrapper/app_init.c
@@ -19,6 +19,7 @@ void app_init(void) {
HAL_Init();
MX_DMA_Init();
MX_IWDG_Init();
+ MX_USART3_UART_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_TIM3_Init();
diff --git a/MATLAB/upp_init.m b/MATLAB/upp_init.m
index a704a3c..a3796d6 100644
--- a/MATLAB/upp_init.m
+++ b/MATLAB/upp_init.m
@@ -1,14 +1,16 @@
clear all
-IadcMax = 200;%50;
+IadcMax = 53;%200;%53;
VadcMax = 1216;
Ts = 5e-6;
-Vnom = 400;
-Inom = 30;%4.2;
+Vnom = 690;
+Inom = 2;%4.2;
Fnom = 50;
-Temperature1 = 2.22; % 20 градусов
-Temperature2 = 2.99; % 34 градусов
+Temperatures1 = [2.22 4.22]; % 20->68 градусов
+TempTimeline1 = [0 100]; % 0 и 10 секунда
+Temperatures2 = [2.99 4.45]; % 34->80 градусов
+TempTimeline2 = [0 50]; % 0 и 5 секунда
diff --git a/MATLAB/upp_r2023.slx b/MATLAB/upp_r2023.slx
index 827ce7c..b12adc6 100644
Binary files a/MATLAB/upp_r2023.slx and b/MATLAB/upp_r2023.slx differ
diff --git a/UPP/Core/Configs/modbus_config.h b/UPP/Core/Configs/modbus_config.h
index 35f4859..365f71e 100644
--- a/UPP/Core/Configs/modbus_config.h
+++ b/UPP/Core/Configs/modbus_config.h
@@ -20,6 +20,7 @@
#ifndef _MODBUS_CONFIG_H_
#define _MODBUS_CONFIG_H_
#include "upp_defs.h"
+#include "upp_params.h"
#include "upp_io.h"
// Общие параметры
@@ -35,8 +36,6 @@
#define MODBUS_MODEL_NAME ""
#define MODBUS_USER_APPLICATION_NAME ""
-#define MODBUS_NUMB_OF_USEROBJECTS 0 ///< Количество пользовательских объектов
-#define MODBUS_USEROBJECT_0_NAME "" ///< Строка пользовательского идентификатора 0. По аналогии можно определить строки до <=128 USEROBJECT
// Периферия (опционально)
//#define mb_huart huart1 ///< Удобный дефайн для модбасовского uart
diff --git a/UPP/Core/Configs/upp_config.h b/UPP/Core/Configs/upp_config.h
index 7ef6765..0b19a66 100644
--- a/UPP/Core/Configs/upp_config.h
+++ b/UPP/Core/Configs/upp_config.h
@@ -22,10 +22,10 @@
* @{
*/
-#define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках
+//#define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках
//#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП
#define UPP_DISABLE_PROTECT_BOARDPOWER ///< Отключить проверки питания плат (+24, +5 В)
-#define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы
+//#define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы
//#define ZC_DISABLE_HYSTERESIS_DEBOUNCE ///< Отключить гиситерезис и дребезг на определении перехода через ноль
diff --git a/UPP/Core/Inc/stm32f4xx_it.h b/UPP/Core/Inc/stm32f4xx_it.h
index 7148ff7..fc9910e 100644
--- a/UPP/Core/Inc/stm32f4xx_it.h
+++ b/UPP/Core/Inc/stm32f4xx_it.h
@@ -57,6 +57,8 @@ void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM1_UP_TIM10_IRQHandler(void);
void TIM2_IRQHandler(void);
+void USART3_IRQHandler(void);
+void TIM8_BRK_TIM12_IRQHandler(void);
void TIM8_UP_TIM13_IRQHandler(void);
void TIM8_TRG_COM_TIM14_IRQHandler(void);
void DMA2_Stream0_IRQHandler(void);
diff --git a/UPP/Core/PowerMonitor/power_protect.c b/UPP/Core/PowerMonitor/power_protect.c
index 74e254b..e5c2f17 100644
--- a/UPP/Core/PowerMonitor/power_protect.c
+++ b/UPP/Core/PowerMonitor/power_protect.c
@@ -133,12 +133,12 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params,
void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *params, UPP_ParamsNominal_t *nominal)
{
/* Переводим внутренние уставки в удобный вид */
- float lFnom = u2f(PARAM_INTERNAL->nominal.F, 100);
- float lFmin = lFnom - lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_minus, 10000);
- float lFmax = lFnom + lFnom*u2f(PARAM_INTERNAL->nominal.F_deviation_plus, 10000);
+ float lFnom = u2f(nominal->F, 100);
+ float lFmin = lFnom - lFnom*u2f(nominal->F_deviation_minus, 10000);
+ float lFmax = lFnom + lFnom*u2f(nominal->F_deviation_plus, 10000);
- float lTwarn = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100);
- float lTerr = u2f(PARAM_INTERNAL->setpoints.TemperatureWarn, 100);
+ float lTwarn = PARAM_INTERNAL->temp.TemperatureWarn;
+ float lTerr = PARAM_INTERNAL->temp.TemperatureWarn;
/*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/
diff --git a/UPP/Core/Src/main.c b/UPP/Core/Src/main.c
index 1b613b2..e231ae7 100644
--- a/UPP/Core/Src/main.c
+++ b/UPP/Core/Src/main.c
@@ -87,7 +87,7 @@ int main(void)
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
-
+
/* USER CODE BEGIN Init */
#ifndef MATLAB
diff --git a/UPP/Core/Src/stm32f4xx_it.c b/UPP/Core/Src/stm32f4xx_it.c
index 5f49f7b..f2780ba 100644
--- a/UPP/Core/Src/stm32f4xx_it.c
+++ b/UPP/Core/Src/stm32f4xx_it.c
@@ -60,6 +60,8 @@ extern DMA_HandleTypeDef hdma_adc3;
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim8;
+extern TIM_HandleTypeDef htim12;
+extern UART_HandleTypeDef huart3;
extern TIM_HandleTypeDef htim14;
/* USER CODE BEGIN EV */
@@ -232,6 +234,46 @@ void TIM2_IRQHandler(void)
/* USER CODE END TIM2_IRQn 1 */
}
+/**
+ * @brief This function handles USART3 global interrupt.
+ */
+void USART3_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART3_IRQn 0 */
+
+ RS_UART_Handler(&hmodbus1);
+ return;
+ /* USER CODE END USART3_IRQn 0 */
+ HAL_UART_IRQHandler(&huart3);
+ /* USER CODE BEGIN USART3_IRQn 1 */
+
+ /* USER CODE END USART3_IRQn 1 */
+}
+
+/**
+ * @brief This function handles TIM8 break interrupt and TIM12 global interrupt.
+ */
+void TIM8_BRK_TIM12_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM8_BRK_TIM12_IRQn 0 */
+ uint32_t itsource = mb_htim.Instance->DIER;
+ uint32_t itflag = mb_htim.Instance->SR;
+ if ((itflag & (TIM_FLAG_UPDATE)) == (TIM_FLAG_UPDATE))
+ {
+ if ((itsource & (TIM_IT_UPDATE)) == (TIM_IT_UPDATE))
+ {
+ RS_TIM_Handler(&hmodbus1);
+ return;
+ }
+ }
+ /* USER CODE END TIM8_BRK_TIM12_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim8);
+ HAL_TIM_IRQHandler(&htim12);
+ /* USER CODE BEGIN TIM8_BRK_TIM12_IRQn 1 */
+
+ /* USER CODE END TIM8_BRK_TIM12_IRQn 1 */
+}
+
/**
* @brief This function handles TIM8 update interrupt and TIM13 global interrupt.
*/
diff --git a/UPP/Core/Src/tim.c b/UPP/Core/Src/tim.c
index ce6afdf..099bbef 100644
--- a/UPP/Core/Src/tim.c
+++ b/UPP/Core/Src/tim.c
@@ -468,6 +468,8 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
__HAL_RCC_TIM8_CLK_ENABLE();
/* TIM8 interrupt Init */
+ HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 15, 0);
@@ -494,6 +496,10 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM12_MspInit 0 */
/* TIM12 clock enable */
__HAL_RCC_TIM12_CLK_ENABLE();
+
+ /* TIM12 interrupt Init */
+ HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
/* USER CODE BEGIN TIM12_MspInit 1 */
/* USER CODE END TIM12_MspInit 1 */
@@ -613,6 +619,14 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
__HAL_RCC_TIM8_CLK_DISABLE();
/* TIM8 interrupt Deinit */
+ /* USER CODE BEGIN TIM8:TIM8_BRK_TIM12_IRQn disable */
+ /**
+ * Uncomment the line below to disable the "TIM8_BRK_TIM12_IRQn" interrupt
+ * Be aware, disabling shared interrupt may affect other IPs
+ */
+ /* HAL_NVIC_DisableIRQ(TIM8_BRK_TIM12_IRQn); */
+ /* USER CODE END TIM8:TIM8_BRK_TIM12_IRQn disable */
+
HAL_NVIC_DisableIRQ(TIM8_UP_TIM13_IRQn);
HAL_NVIC_DisableIRQ(TIM8_TRG_COM_TIM14_IRQn);
/* USER CODE BEGIN TIM8_MspDeInit 1 */
@@ -637,6 +651,16 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM12_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM12_CLK_DISABLE();
+
+ /* TIM12 interrupt Deinit */
+ /* USER CODE BEGIN TIM12:TIM8_BRK_TIM12_IRQn disable */
+ /**
+ * Uncomment the line below to disable the "TIM8_BRK_TIM12_IRQn" interrupt
+ * Be aware, disabling shared interrupt may affect other IPs
+ */
+ /* HAL_NVIC_DisableIRQ(TIM8_BRK_TIM12_IRQn); */
+ /* USER CODE END TIM12:TIM8_BRK_TIM12_IRQn disable */
+
/* USER CODE BEGIN TIM12_MspDeInit 1 */
/* USER CODE END TIM12_MspDeInit 1 */
diff --git a/UPP/Core/Src/usart.c b/UPP/Core/Src/usart.c
index bcd8368..f739e55 100644
--- a/UPP/Core/Src/usart.c
+++ b/UPP/Core/Src/usart.c
@@ -110,6 +110,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ /* USART3 interrupt Init */
+ HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART3_IRQn);
/* USER CODE BEGIN USART3_MspInit 1 */
/* USER CODE END USART3_MspInit 1 */
@@ -157,6 +160,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
*/
HAL_GPIO_DeInit(GPIOB, SCIT1_Pin|SCIR1_Pin);
+ /* USART3 interrupt Deinit */
+ HAL_NVIC_DisableIRQ(USART3_IRQn);
/* USER CODE BEGIN USART3_MspDeInit 1 */
/* USER CODE END USART3_MspDeInit 1 */
diff --git a/UPP/Core/UPP/upp_errors.c b/UPP/Core/UPP/upp_errors.c
index 1ea4619..936a308 100644
--- a/UPP/Core/UPP/upp_errors.c
+++ b/UPP/Core/UPP/upp_errors.c
@@ -151,7 +151,7 @@ void UPP_Errors_LossPhase(void)
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
/* Если хотя бы одна фаза есть проверяем фазы отдельно */
- if(!ERR_PUI->LossPhaseAll)
+ if(!loss_phases_all)
{
ERR_PUI->LossPhaseA = setError( ERR_PRIVATE->ia_min,
ERR_PUI->LossPhaseA,
diff --git a/UPP/Core/UPP/upp_main.c b/UPP/Core/UPP/upp_main.c
index 6a94ed9..ecf5ae7 100644
--- a/UPP/Core/UPP/upp_main.c
+++ b/UPP/Core/UPP/upp_main.c
@@ -10,6 +10,7 @@
- @ref ANGLE_CONTROL - Формирование и регулирование угла открытия тиристора
******************************************************************************/
#include "upp_main.h" // всё остальное по работе с УПП
+#include "usart.h"
#include "tim.h"
#include "iwdg.h"
@@ -34,6 +35,8 @@ int UPP_App_Init(void)
upp.PUI.values = &MB_DATA.InRegs.pui;
upp.call = &MB_INTERNAL.FuncCalls;
+ MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim);
+
if(HAL_TIM_Base_Start(&ustim) != HAL_OK)
{
return 1;
@@ -49,8 +52,7 @@ int UPP_App_Init(void)
if(Angle_Init(&upp.hangle) != HAL_OK)
{
return 1;
- }
-
+ }
if(UPP_Params_Init() != HAL_OK)
{
return 1;
@@ -74,6 +76,7 @@ int UPP_PreWhile(void)
#endif
UPP_DO.CEN(ENABLE);
+ MODBUS_SlaveStart(&hmodbus1, NULL);
return 0;
}
@@ -141,8 +144,8 @@ int UPP_While(void)
UPP_DO.Error(DISABLE);
if(slow_cnt == 0)
{ // начало инициализации - сбрасываем флаги
- memset(&ERR_PRIVATE, 0, sizeof(ERR_PRIVATE));
- memset(&ERR_PUI, 0, sizeof(ERR_PUI));
+ memset(ERR_PRIVATE, 0, sizeof(*ERR_PRIVATE));
+ memset(ERR_PUI, 0, sizeof(*ERR_PUI));
}
if(slow_cnt > MS_TO_SLOW_TICKS(UPP_INIT_BEFORE_READY_MS))
diff --git a/UPP/Core/UPP/upp_params.c b/UPP/Core/UPP/upp_params.c
index fe85ad3..d50f6f5 100644
--- a/UPP/Core/UPP/upp_params.c
+++ b/UPP/Core/UPP/upp_params.c
@@ -372,8 +372,8 @@ void UPP_Params_Saturate(void)
SATURATE_U16(PARAM_PUI->Tdelay, 5, 60);
SATURATE_U16(PARAM_PUI->Interlace, 0, 1);
- SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureWarn, 0, 90);
- SATURATE_U16(PARAM_INTERNAL->setpoints.TemperatureErr, 0, 90);
+ SATURATE_U16(PARAM_INTERNAL->temp.TemperatureWarn, 0, 90);
+ SATURATE_U16(PARAM_INTERNAL->temp.TemperatureErr, 0, 90);
SATURATE_U16(PARAM_INTERNAL->nominal.PhaseNumber, 0, 3);
SATURATE_U16(PARAM_INTERNAL->nominal.U, 0, ADC_U_MAX_V_DEFAULT*10);
@@ -426,8 +426,8 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
if(internal_default)
{
- PARAM_INTERNAL->setpoints.TemperatureWarn = SETPOINT_TEMP_WARN*10;
- PARAM_INTERNAL->setpoints.TemperatureErr = SETPOINT_TEMP_ERR*10;
+ PARAM_INTERNAL->temp.TemperatureWarn = SETPOINT_TEMP_WARN*10;
+ PARAM_INTERNAL->temp.TemperatureErr = SETPOINT_TEMP_ERR*10;
PARAM_INTERNAL->nominal.PhaseNumber = NOM_PHASE_NUMB;
PARAM_INTERNAL->nominal.U = NOM_U_V_DEFAULT*10;
diff --git a/UPP/Core/UPP/upp_params.h b/UPP/Core/UPP/upp_params.h
index 05e4762..06caf58 100644
--- a/UPP/Core/UPP/upp_params.h
+++ b/UPP/Core/UPP/upp_params.h
@@ -10,15 +10,17 @@
#define _UPP_PARAMS_H
#include "upp_defs.h"
+
+
#define u2f(_u16_, _coef_) ((float)_u16_/_coef_)
typedef struct
{
- unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные
- unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные
unsigned go:1; ///< Запустить УПП
unsigned stop:1; ///< Остановка УПП (авария)
+ unsigned set_default_pui:1; ///< Выставить настройки ПУИ в дефолтные
+ unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные
unsigned reserved:11;
unsigned reset_mcu:1;
@@ -27,71 +29,74 @@ typedef struct
typedef struct
{
- uint16_t PhaseSequence; ///< Последовательность фаз todo
- uint16_t PhaseNumber; ///< [Количество]
- uint16_t U; ///< [В x 10]
- uint16_t U_deviation_plus; ///< [Проценты x 100]
- uint16_t U_deviation_minus; ///< [Проценты x 100]
- uint16_t F; ///< [Гц x 100]
- uint16_t F_deviation_plus; ///< [Проценты x 100]
- uint16_t F_deviation_minus; ///< [Проценты x 100]
- uint16_t I; ///< [Амперы x 10]
+ uint16_t PhaseSequence; ///< Адрес 1000: Последовательность фаз todo
+ uint16_t PhaseNumber; ///< Адрес 1001: [Количество]
+ uint16_t U; ///< Адрес 1002: [В x 10]
+ uint16_t U_deviation_plus; ///< Адрес 1003: [Проценты x 100]
+ uint16_t U_deviation_minus; ///< Адрес 1004: [Проценты x 100]
+ uint16_t F; ///< Адрес 1005: [Гц x 100]
+ uint16_t F_deviation_plus; ///< Адрес 1006: [Проценты x 100]
+ uint16_t F_deviation_minus; ///< Адрес 1007: [Проценты x 100]
+ uint16_t I; ///< Адрес 1008: [Амперы x 10]
}UPP_ParamsNominal_t;
typedef struct
{
- uint16_t TemperatureWarn; ///< Предупредительный порог температуры [Градусы x 100]
- uint16_t TemperatureErr; ///< Аварийный порог температуры [Градусы x 100]
}UPP_ParamsSetpoints_t;
typedef struct
{
+ UPP_ParamsNominal_t nominal;
+ /* Параметры Температур */
struct
{
- uint16_t rms_window_size; ///< Размер окна для RMS
- uint16_t rms_exp_alpha; ///< Постоянная времени для сглаживания RMS
- }pm;
-
- UPP_ParamsNominal_t nominal;
- UPP_ParamsSetpoints_t setpoints;
+ uint16_t TemperatureWarn; ///< Адрес 1010: Предупредительный порог температуры [Градусы x 100]
+ uint16_t TemperatureErr; ///< Адрес 1011: Аварийный порог температуры [Градусы x 100]
+ }temp;
/* Параметры АЦП */
struct
{
- uint16_t ADC_Max[4]; ///< Величина в единицах измерения при АЦП = 4095 [В или А x 10]
- uint16_t ADC_Zero[4]; ///< Кванты АЦП когда на входе ноль
+ uint16_t ADC_Max[4]; ///< Адрес 1020: Величина в единицах измерения при АЦП = 4095 [В или А x 10]
+ uint16_t ADC_Zero[4]; ///< Адрес 1021: Кванты АЦП когда на входе ноль
}adc;
+
+ /* Параметры Мониторинга напряжения */
+ struct
+ {
+ uint16_t rms_window_size; ///< Адрес 1030: Размер окна для RMS
+ uint16_t rms_exp_alpha; ///< Адрес 1031: Постоянная времени для сглаживания RMS
+ }pm;
+
/* Параметры ШИМ */
struct
{
- uint16_t PhaseMask; ///< Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c
- uint16_t Frequency; ///< Частота ШИМ для пачки импульсов на тиристоры [Герцы]
- uint16_t Duty; ///< Скважность ШИМ для пачки импульсов на тиристоры [Проценты]
- uint16_t PulseLength; ///< Количесво импульсов в пачке [Количество]
+ uint16_t PhaseMask; ///< Адрес 1040: Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c
+ uint16_t Frequency; ///< Адрес 1041: Частота ШИМ для пачки импульсов на тиристоры [Герцы]
+ uint16_t Duty; ///< Адрес 1042: Скважность ШИМ для пачки импульсов на тиристоры [Проценты]
+ uint16_t PulseLength; ///< Адрес 1043: Количесво импульсов в пачке [Количество]
}pwm;
- /* Параметры Угла */
+ /* Параметры Перехода через ноль */
struct
{
- uint16_t Hysteresis; ///< Гистерезис для определения перехода через ноль [Проценты x 100]
- uint16_t DebouneCouner; ///< Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество]
+ uint16_t Hysteresis; ///< Адрес 1050: Гистерезис для определения перехода через ноль [Проценты x 100]
+ uint16_t DebouneCouner; ///< Адрес 1051: Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество]
}zc;
/* Параметры Угла */
struct
{
- uint16_t PulseLengthReserve;/*!< @brief Сколько запаса закладывать на длительность пачки импульсов [Проценты] @ref __AngleSetLimit
+ uint16_t PulseLengthReserve;/*!< @brief Адрес 1060: Сколько запаса закладывать на длительность пачки импульсов [Проценты] @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]
- uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 10000]
- uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 10000]
- }angle;
-
-
+ uint16_t Angle_Max; ///< Адрес 1061: Максимальный угол открытия тиристора [0..1 x 65535]
+ uint16_t Angle_Min; ///< Адрес 1062: Минимальный угол открытия тиристора [0..1 x 65535]
+ uint16_t PID_Kp; ///< Адрес 1063: Пропорциональный коэфициент ПИ регулятора угла [x 10000]
+ uint16_t PID_Ki; ///< Адрес 1064: Интегральный коэфициент ПИ регулятора угла [x 10000]
+ uint16_t PID_Kd; ///< Адрес 1065: Интегральный коэфициент ПИ регулятора угла [x 10000]
+ }angle;
}UPP_PrvtParams_t;
@@ -108,4 +113,55 @@ void UPP_Params_Saturate(void);
/* Установка параметров на дефолтные значения */
void UPP_Params_SetDefault(int pui_default, int internal_default);
+#define MODBUS_NUMB_OF_USEROBJECTS 128 ///< Количество пользовательских объектов
+/* Номинальные параметры (H1000-H1008) */
+#define MODBUS_USEROBJECT_0_NAME "Nom PhSeq;H1000;[]"
+#define MODBUS_USEROBJECT_1_NAME "Nom PhNum;H1001;[cnt]"
+#define MODBUS_USEROBJECT_2_NAME "Nom U;H1002;[Vx10]"
+#define MODBUS_USEROBJECT_3_NAME "Nom Udev+;H1003;[%x100]"
+#define MODBUS_USEROBJECT_4_NAME "Nom Udev-;H1004;[%x100]"
+#define MODBUS_USEROBJECT_5_NAME "Nom F;H1005;[Hzx100]"
+#define MODBUS_USEROBJECT_6_NAME "Nom Fdev+;H1006;[%x100]"
+#define MODBUS_USEROBJECT_7_NAME "Nom Fdev-;H1007;[%x100]"
+#define MODBUS_USEROBJECT_8_NAME "Nom I;H1008;[Ax10]"
+
+/* Температурные параметры (H1010-H1011) */
+#define MODBUS_USEROBJECT_10_NAME "TempWarn;H1010;[Cx100]"
+#define MODBUS_USEROBJECT_11_NAME "TempErr;H1011;[Cx100]"
+
+/* Параметры АЦП (H1020-H1027) */
+#define MODBUS_USEROBJECT_20_NAME "ADC Max Uba;H1020;[V/Ax10]"
+#define MODBUS_USEROBJECT_21_NAME "ADC Max Uac;H1021;[V/Ax10]"
+#define MODBUS_USEROBJECT_22_NAME "ADC Max Ic;H1022;[V/Ax10]"
+#define MODBUS_USEROBJECT_23_NAME "ADC Max Ia;H1023;[V/Ax10]"
+#define MODBUS_USEROBJECT_24_NAME "ADC Zero Uba;H1024;[Quants]"
+#define MODBUS_USEROBJECT_25_NAME "ADC Zero Uac;H1025;[Quants]"
+#define MODBUS_USEROBJECT_26_NAME "ADC Zero Ic;H1026;[Quants]"
+#define MODBUS_USEROBJECT_27_NAME "ADC Zero Ia;H1027;[Quants]"
+
+/* Мониторинг питания (H1030-H1031) */
+#define MODBUS_USEROBJECT_30_NAME "RMS WindowSize;H1030;[]"
+#define MODBUS_USEROBJECT_31_NAME "RMS Alpha;H1031;[x10000]"
+
+/* ШИМ параметры (H1040-H1043) */
+#define MODBUS_USEROBJECT_40_NAME "PWM Mask;H1040;[bit]"
+#define MODBUS_USEROBJECT_41_NAME "PWM Freq;H1041;[Hz]"
+#define MODBUS_USEROBJECT_42_NAME "PWM Duty;H1042;[%]"
+#define MODBUS_USEROBJECT_43_NAME "PWM Pulses;H1043;[cnt]"
+
+/* Ноль-кросс (H1050-H1051) */
+#define MODBUS_USEROBJECT_50_NAME "ZC Hyst;H1050;[%x100]"
+#define MODBUS_USEROBJECT_51_NAME "ZC Debounce;H1051;[cnt]"
+
+/* Угловые параметры (H1060-H1065) */
+#define MODBUS_USEROBJECT_60_NAME "Angle PulseRes;H1060;[%]"
+#define MODBUS_USEROBJECT_61_NAME "Angle Max;H1061;[x65535]"
+#define MODBUS_USEROBJECT_62_NAME "Angle Min;H1062;[x65535]"
+#define MODBUS_USEROBJECT_63_NAME "Angle PID_Kp;H1063;[x10000]"
+#define MODBUS_USEROBJECT_64_NAME "Angle PID_Ki;H1064;[x10000]"
+#define MODBUS_USEROBJECT_65_NAME "Angle PID_Kd;H1065;[x10000]"
+
+/* Функциональные вызовы - если нужно (битовые поля в одном регистре) */
+#define MODBUS_USEROBJECT2000_NAME "FuncCalls;H2000;[bitmask]"
+
#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 671ac78..283c5c4 100644
--- a/UPP/MDK-ARM/UPP.uvoptx
+++ b/UPP/MDK-ARM/UPP.uvoptx
@@ -12,7 +12,7 @@
*.lib
*.txt; *.h; *.inc; *.md
*.plm
- *.cpp
+ *.cpp; *.cc; *.cxx
0
@@ -93,7 +93,7 @@
1
1
1
- 1
+ 0
1
1
1
@@ -103,7 +103,7 @@
1
0
0
- 6
+ 4
@@ -114,44 +114,54 @@
- STLink\ST-LINKIII-KEIL_SWO.dll
+ Segger\JL2CM3.dll
+
+ 0
+ ARMRTXEVENTFLAGS
+ -L70 -Z18 -C0 -M0 -T1
+
+
+ 0
+ DLGTARM
+ (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)
+
+
+ 0
+ ARMDBGFLAGS
+
+
+
+ 0
+ JL2CM3
+ -U -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -N01("Unknown JTAG device") -D01(06413041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F427ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)
+
+
+ 0
+ DLGUARM
+
+
0
UL2CM3
UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F427ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM))
-
- 0
- ST-LINKIII-KEIL_SWO
- -U-O142 -O2190 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F427ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)
-
-
-
- 0
- 0
- 156
- 1
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- ..\Core\PowerMonitor\power_monitor.c
-
-
-
-
+
+
+
+ 0
+ 1
+ uwTick,0x0A
+
+
0
0
- 1
+ 0
1
0
0
@@ -170,7 +180,7 @@
0
0
0
- 1
+ 0
0
0
0
@@ -270,7 +280,7 @@
1
1
1
- 1
+ 0
1
1
1
@@ -294,11 +304,6 @@
Segger\JL2CM3.dll
-
- 0
- JL2CM3
- -U60145553 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -N01("Unknown JTAG device") -D01(06413041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)
-
0
ARMRTXEVENTFLAGS
@@ -307,13 +312,18 @@
0
DLGTARM
- (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=620,209,878,797,0)(1012=-1,-1,-1,-1,0)
+ (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)
0
ARMDBGFLAGS
+
+ 0
+ JL2CM3
+ -U-O14 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -N01("Unknown JTAG device") -D01(06413041) -L01(5) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)
+
0
DLGUARM
@@ -322,199 +332,59 @@
0
UL2CM3
- UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)
-
-
- 0
- ST-LINKIII-KEIL_SWO
- -U005600373433510237363934 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131123 -TC168000000 -TT10000000 -TP21 -TDS800D -TDT1 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2
+ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM))
-
+
+
+ 0
+ 0
+ 50
+ 1
+ 134253566
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ ../Core/Src/usart.c
+
+ \\Debug_F417\../Core/Src/usart.c\50
+
+
0
1
- upp.call,0x0A
-
-
- 1
- 1
- upp,0x0A
-
-
- 2
- 1
uwTick,0x0A
-
- 3
- 1
- errors.prvt.f.err
-
-
- 4
- 1
- errors.prvt.cnt
-
-
- 5
- 1
- upp.pm.measured
-
-
- 6
- 1
- hbt,0x0A
-
-
- 7
- 1
- \\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing
-
-
- 8
- 1
- dbg_polarity,0x0A
-
-
- 9
- 1
- dbg_iref
-
-
- 10
- 1
- upp.pm.zc.Channel[0].HalfWave
-
-
- 11
- 1
- \\Debug_F417\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c\uwTick,0x0A
-
-
- 12
- 1
- htim1
-
-
- 13
- 1
- htim2
-
-
- 14
- 1
- UPP_DIN,0x0A
-
-
- 15
- 1
- \\Debug_F417\../Core/UPP/upp_io.c\UPP_DIN.Pusk.Sw_FilterDelay
-
-
- 16
- 1
- hadc3
-
-
- 17
- 1
- upp.hangle.Iref
-
-
- 18
- 1
- upp.pm.measured.final.U[0]
-
-
-
-
- 0
- 2
- MB_INTERNAL,0x0A
-
1
- 2
- MB_DATA,0x0A
-
-
- 2
- 2
- errors.prvt.f.err,0x0A
-
-
- 3
- 2
- errors.prvt.cnt,0x0A
-
-
- 4
- 2
- errors.pui,0x0A
-
-
- 5
- 2
- errors.common
-
-
- 6
- 2
- upp.pm.measured.slow.U[0]
-
-
- 7
- 2
- zc->Channel[channel1].PeriodStartTime,0x0A
-
-
- 8
- 2
- zc->Channel[channel2].PeriodStartTime,0x0A
-
-
- 9
- 2
- zc->Channel[channel1].PeriodStartTime - zc->Channel[channel2].PeriodStartTime,0x10
-
-
- 10
- 2
- htim5.Instance,0x0A
-
-
- 11
- 2
- iref_dbg
-
-
- 12
- 2
- upp.pm.measured.slow.U[0]
-
-
- 13
- 2
+ 1
upp,0x0A
- 14
- 2
- htim5,0x0A
+ 2
+ 1
+ MB_DEVID
- 15
- 2
- htim3,0x0A
+ 3
+ 1
+ hmodbus1,0x0A
- 16
- 2
- htim5.Instance->CNT-2605346416,0x0A
+ 4
+ 1
+ RS_Buffer
-
+
+ 5
+ 1
+ pclk,0x0A
+
+
0
@@ -539,7 +409,7 @@
0
0
0
- 1
+ 0
0
0
0
@@ -559,17 +429,17 @@
- System Viewer\ADC3
+ System Viewer\GPIOB
35905
- System Viewer\DMA2
+ System Viewer\USART3
35904
1
- 0
+ 1
0
2
10000000
@@ -1187,7 +1057,7 @@
MyLibs
- 1
+ 0
0
0
0
@@ -1859,7 +1729,7 @@
Application/MDK-ARM
- 1
+ 0
0
0
0
@@ -1899,7 +1769,7 @@
::Compiler
- 1
+ 0
0
0
1
diff --git a/UPP/MDK-ARM/UPP.uvprojx b/UPP/MDK-ARM/UPP.uvprojx
index b764892..1757519 100644
--- a/UPP/MDK-ARM/UPP.uvprojx
+++ b/UPP/MDK-ARM/UPP.uvprojx
@@ -138,7 +138,7 @@
4101
1
- BIN\UL2V8M.DLL
+ BIN\UL2CM3.DLL
diff --git a/UPP/UPP.ioc b/UPP/UPP.ioc
index f2944be..f4e67db 100644
--- a/UPP/UPP.ioc
+++ b/UPP/UPP.ioc
@@ -164,10 +164,12 @@ NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
NVIC.TIM1_UP_TIM10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
+NVIC.TIM8_BRK_TIM12_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM8_TRG_COM_TIM14_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true
NVIC.TIM8_UP_TIM13_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TimeBase=TIM8_TRG_COM_TIM14_IRQn
NVIC.TimeBaseIP=TIM14
+NVIC.USART3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA10.GPIOParameters=GPIO_Label
PA10.GPIO_Label=PWM3