Коэфы альфа в дефолтах проставлены чтобы были независимыми от частоты дискретизации и всякое другое

This commit is contained in:
Razvalyaev 2025-11-21 18:49:57 +03:00
parent 21379c6188
commit 925bfbe01e
11 changed files with 93 additions and 42 deletions

View File

@ -31,8 +31,10 @@
#define TEMP_2 1
#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 ///< Отключить проверки на потерянные фазы
/**
* @addtogroup UPP_PARAMS_DEFAULT Default params for external flash
@ -49,7 +51,7 @@
/* Номинальные параметры */
#define NOM_PHASE_NUMB 3
#define NOM_U_V_DEFAULT 690
#define NOM_U_V_DEFAULT 1216
#define NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT 6
#define NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT 10
#define NOM_F_HZ_DEFAULT 50
@ -78,13 +80,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.01
#define ANGLE_PID_KP_COEF_DEFAULT 0.0001
#define ANGLE_PID_KI_COEF_DEFAULT 0.0001
#define ANGLE_PID_KD_COEF_DEFAULT 0
#define ANGLE_REF_ALPHA_COEF_DEFAULT 0.0001
#define ANGLE_REF_TAU_COEF_DEFAULT 20.0
/* Параметри мониторинга сети */
#define PM_EXP_ALPHA_COEF_DEFAULT 0.01
#define PM_EXP_TAU_COEF_DEFAULT 0.05
/* Параметры АЦП */
#define ADC_U_MAX_V_DEFAULT 1216.0

View File

@ -155,11 +155,11 @@ typedef struct {
#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 CALC_TAU_COEF(tau, TsUs) (((float)TsUs/1000000) / (((float)TsUs/1000000) + (tau)))
/* Дефайны для "удобного" доступа к структурам */
#define PARAM_INTERNAL MB_INTERNAL.param

View File

@ -176,6 +176,18 @@ void Error_Handler(void);
/* USER CODE BEGIN Private defines */
extern TIM_HandleTypeDef ustim;
void SystemClock_Config_STM32F417(void);
#if defined(STM32F417xx)
#undef ERR_24V_GPIO_Port
#undef ERR_24V_Pin
#undef DIN1_GPIO_Port
#undef DIN1_Pin
#define ERR_24V_Pin GPIO_PIN_15
#define ERR_24V_GPIO_Port GPIOG
#define DIN1_Pin GPIO_PIN_12
#define DIN1_GPIO_Port GPIOG
#endif
/* USER CODE END Private defines */
#ifdef __cplusplus

View File

@ -147,11 +147,17 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PGPin PGPin */
GPIO_InitStruct.Pin = ERR_24V_Pin|DIN1_Pin;
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = ERR_24V_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
HAL_GPIO_Init(ERR_24V_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = DIN1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(DIN1_GPIO_Port, &GPIO_InitStruct);
}

View File

@ -25,6 +25,7 @@
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
@ -102,6 +103,7 @@ int main(void)
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC3_Init();
MX_USART3_UART_Init();

View File

@ -33,11 +33,15 @@ void UPP_Errors_Handle(void)
/*====== Программные ошибки ======*/
UPP_Errors_Program();
/*====== Ошибки питания плат ======*/
#ifndef UPP_DISABLE_PROTECT_BOARDPOWER
UPP_Errors_Power();
#endif
/*====== Ошибки выхода за допустимые пределы ======*/
UPP_Errors_Ranges();
/*====== Потери фазы ======*/
#ifndef UPP_DISABLE_PROTECT_LOSS_PHASE
UPP_Errors_LossPhase();
#endif
/*====== Остальные ======*/
UPP_Errors_Other();

View File

@ -15,7 +15,7 @@
UPP_t upp;
HAL_StatusTypeDef res; // сюда сохраняется результат от выполения всяких функций
float dbg_iref = 1;
float dbg_iref = 2;
int dbg_polarity = 0;
/**
@ -90,11 +90,19 @@ int UPP_While(void)
res = HAL_IWDG_Refresh(&hiwdg);
// Медленные расчеты
PowerMonitor_SlowCalc(&upp.pm);
// Защиты // Определенные защиты включаем только в режиме работы
PowerMonitor_Protect(&upp.pm, upp.workmode == UPP_Work);
// если ошибка вызываем СТОП
#ifdef UPP_SIMULATE_I // симулируем токи
upp.pm.measured.final.Iamp = upp.hangle.Iref/2;
// Защиты // При симуляции тока не включаем его проверку
PowerMonitor_Protect(&upp.pm, 0);
#else
// Защиты // Определенные защиты по току включаем только в после разгона
PowerMonitor_Protect(&upp.pm, (fabsf(upp.hangle.Iref - dbg_iref) < 0.1));
#endif
#ifndef UPP_DISABLE_ERROR_BLOCK
// если ошибка вызываем СТОП
upp.call->stop = (errors.common != Err_None);
#endif
@ -160,11 +168,8 @@ int UPP_While(void)
upp.workmode = UPP_Init;
// Регулирование тиристоров
#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))
{
@ -221,6 +226,15 @@ void UPP_Tick(void)
UPP_Errors_Handle();
//
UPP_Params_ControlInternal();
if(GPIO_Read_Switch(&UPP_DIN.Pusk))
{
upp.call->go = 1;
}
else
{
upp.call->go = 0;
}
}

View File

@ -215,7 +215,7 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
PARAM_INTERNAL.nominal.F_deviation_minus = NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT*100;
PARAM_INTERNAL.nominal.I = NOM_I_A_DEFAULT*10;
PARAM_INTERNAL.pm.mean_alpha = PM_EXP_ALPHA_COEF_DEFAULT*65535;
PARAM_INTERNAL.pm.mean_alpha = CALC_TAU_COEF(PM_EXP_TAU_COEF_DEFAULT,PM_SLOW_PERIOD_US)*65535;
PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UBA] = ADC_U_MAX_V_DEFAULT*10;
PARAM_INTERNAL.adc.ADC_Max[ADC_CHANNEL_UAC] = ADC_U_MAX_V_DEFAULT*10;
@ -237,7 +237,7 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
PARAM_INTERNAL.angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*10000;
PARAM_INTERNAL.angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*10000;
PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*10000;
PARAM_INTERNAL.angle.PID_ExpAlpha = ANGLE_REF_ALPHA_COEF_DEFAULT*65535;
PARAM_INTERNAL.angle.PID_ExpAlpha = CALC_TAU_COEF(ANGLE_REF_TAU_COEF_DEFAULT,PM_SLOW_PERIOD_US)*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;

View File

@ -347,7 +347,7 @@
<Type>0</Type>
<LineNumber>136</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134256008</Address>
<Address>134256304</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
@ -429,30 +429,20 @@
<Ww>
<count>10</count>
<WinNumber>1</WinNumber>
<ItemText>upp.call-&gt;reset_mcu</ItemText>
<ItemText>upp.pm.zc.Channel[0].HalfWave</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>1</WinNumber>
<ItemText>upp.pm.zc.Channel[0].HalfWave</ItemText>
<ItemText>\\Debug_F417\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c\uwTick</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>
<Ww>
<count>15</count>
<count>13</count>
<WinNumber>1</WinNumber>
<ItemText>htim2</ItemText>
</Ww>
@ -518,6 +508,11 @@
<WinNumber>2</WinNumber>
<ItemText>iref_dbg</ItemText>
</Ww>
<Ww>
<count>12</count>
<WinNumber>2</WinNumber>
<ItemText>upp.pm.measured.slow.U[0]</ItemText>
</Ww>
</WatchWindow2>
<Tracepoint>
<THDelay>0</THDelay>
@ -539,7 +534,7 @@
<AscS3>0</AscS3>
<aSer3>0</aSer3>
<eProf>0</eProf>
<aLa>0</aLa>
<aLa>1</aLa>
<aPa1>0</aPa1>
<AscS4>0</AscS4>
<aSer4>0</aSer4>
@ -573,6 +568,10 @@
<Name>System Viewer\DBG</Name>
<WinId>35902</WinId>
</Entry>
<Entry>
<Name>System Viewer\GPIOG</Name>
<WinId>35899</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM1</Name>
<WinId>35901</WinId>

View File

@ -358,8 +358,9 @@ PG12.GPIOParameters=GPIO_Label
PG12.GPIO_Label=ERR_24V
PG12.Locked=true
PG12.Signal=GPIO_Input
PG15.GPIOParameters=GPIO_Label
PG15.GPIOParameters=GPIO_PuPd,GPIO_Label
PG15.GPIO_Label=DIN1
PG15.GPIO_PuPd=GPIO_PULLUP
PG15.Locked=true
PG15.Signal=GPIO_Input
PG6.GPIOParameters=GPIO_PuPd,GPIO_Label
@ -402,7 +403,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-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
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-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

View File

@ -0,0 +1,11 @@
clc
clear all
alpha = 0.01
ts = 500;
tau = (ts/1000000) * (1-alpha)/alpha
alpha2 = ts/1000000 / (ts/1000000 + tau )