проверены напряжение, токи и температуры

This commit is contained in:
2026-02-07 09:53:51 +03:00
parent 163b69ccc5
commit 2ba2ae77b2
13 changed files with 189 additions and 99 deletions

View File

@@ -59,7 +59,7 @@
* @details Терминалка от двигателей использует для чтения регистров комманду R_HOLD_REGS вместо R_IN_REGS * @details Терминалка от двигателей использует для чтения регистров комманду R_HOLD_REGS вместо R_IN_REGS
* Поэтому чтобы считывать Input Regs - надо поменять их местами. * Поэтому чтобы считывать Input Regs - надо поменять их местами.
*/ */
//#define MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS #define MODBUS_SWITCH_COMMAND_R_IN_REGS_AND_R_HOLD_REGS
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
/////////////////////////---CALC DEFINES---////////////////////////// /////////////////////////---CALC DEFINES---//////////////////////////

View File

@@ -22,11 +22,14 @@
* @{ * @{
*/ */
#define UPP_SET_DEFAULT ///< Установить настройки по умолчанию
#define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках #define UPP_DISABLE_ERROR_BLOCK ///< Отключить блокировку УПП при ошибках
//#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП //#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП
//#define UPP_DISABLE_PROTECT_BOARDPOWER ///< Отключить проверки питания плат (+24, +5 В) //#define UPP_DISABLE_PROTECT_BOARDPOWER ///< Отключить проверки питания плат (+24, +5 В)
//#define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы //#define UPP_DISABLE_PROTECT_LOSS_PHASE ///< Отключить проверки на потерянные фазы
//#define ZC_DISABLE_HYSTERESIS_DEBOUNCE ///< Отключить гиситерезис и дребезг на определении перехода через ноль //#define ZC_DISABLE_HYSTERESIS_DEBOUNCE ///< Отключить гиситерезис и дребезг на определении перехода через ноль
/** //UPP_PARAMS_TEST /** //UPP_PARAMS_TEST
@@ -117,10 +120,14 @@
#define PM_RMS_EXT_TAU_US_DEFAULT 0.02*3 // 3 периода 50 Гц #define PM_RMS_EXT_TAU_US_DEFAULT 0.02*3 // 3 периода 50 Гц
/* Параметры АЦП */ /* Параметры АЦП */
#define ADC_U_MAX_V_DEFAULT 1216.0 // Колво квантов ацп для 1.5 Вольт при опорном 3.3 В
#define ADC_I_MAX_A_DEFAULT 53.0 #define ADC_U_ZERO_DEFAULT ((1.5/3.3)*4095)
#define ADC_U_ZERO_DEFAULT 2048 #define ADC_I_ZERO_DEFAULT ((1.5/3.3)*4095)
#define ADC_I_ZERO_DEFAULT 2048 #define ADC_T_ZERO_DEFAULT ((1.5/3.3)*4095)
// Максимальное значение для 3.3 В рассчитанное из максимального значения X для 3 В
// X/ZERO_DEFAULT*(4095-ZERO_DEFAULT)
#define ADC_U_MAX_V_DEFAULT (1216.0/ADC_U_ZERO_DEFAULT*(4095-ADC_U_ZERO_DEFAULT))
#define ADC_I_MAX_A_DEFAULT (53.0/ADC_I_ZERO_DEFAULT*(4095-ADC_I_ZERO_DEFAULT))
/* Параметры определения перехода через ноль */ /* Параметры определения перехода через ноль */
#define ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT 2.0 #define ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT 2.0

View File

@@ -13,8 +13,7 @@
#define FreqTableSize 200 #define FreqTableSize 200
float phase_table[FreqTableSize]; float phase_table[FreqTableSize];
float freq_table[FreqTableSize]; float freq_table[FreqTableSize];
//float freq_table[FreqTableSize] = { 49.0f, 49.1f, 49.2f, 49.3f, 49.4f, 49.5f, 49.6f, 49.7f, 49.8f, 49.9f, \
// 50.0f, 50.1f, 50.2f, 50.3f, 50.4f, 50.5f, 50.6f, 50.7f, 50.8f, 50.9f, 51.0f };
static void ADC_InitAllFilters(ADC_Periodic_t *adc) static void ADC_InitAllFilters(ADC_Periodic_t *adc)
{ {
@@ -26,7 +25,7 @@ static void ADC_InitAllFilters(ADC_Periodic_t *adc)
FilterLUT_Init(&adc->temp_map[i], FilterLUT_Init(&adc->temp_map[i],
(float *)adc_temp_quants, (float *)adc_temp_quants,
(float *)adc_temp_vals, (float *)adc_temp_vals,
numbof(adc_temp_quants), 1); numbof(adc_temp_quants), 1, 0);
} }
float freq_temp = FreqTableFreqStart; float freq_temp = FreqTableFreqStart;
@@ -91,7 +90,7 @@ HAL_StatusTypeDef ADC_Init(ADC_Periodic_t *adc, TIM_HandleTypeDef *htim, ADC_Han
adc->htim = htim; adc->htim = htim;
adc->hadc = hadc; adc->hadc = hadc;
ADC_InitAllFilters(adc); ADC_InitAllFilters(adc);
adc->f.AdcRunning = 0; adc->f.AdcRunning = 0;
adc->f.DataReady = 0; adc->f.DataReady = 0;
@@ -192,9 +191,9 @@ HAL_StatusTypeDef ADC_UpdateRegular(ADC_Periodic_t *adc)
int u_ind = ADC_U_CHANNELS_START + i; int u_ind = ADC_U_CHANNELS_START + i;
int i_ind = ADC_I_CHANNELS_START + i; int i_ind = ADC_I_CHANNELS_START + i;
// заменяем сырые данные на отфильтрованные данные // заменяем сырые данные на отфильтрованные данные
int raw_u = Filter_Process(&adc->u_fltr[i], (int)raw[u_ind]-2048); int raw_u = Filter_Process(&adc->u_fltr[i], (int)raw[u_ind]-coefs->lZero);
int raw_i = Filter_Process(&adc->i_fltr[i], raw[i_ind]); int raw_i = Filter_Process(&adc->i_fltr[i], raw[i_ind]);
raw[u_ind] = raw_u+2048; raw[u_ind] = raw_u+coefs->lZero;
raw[i_ind] = raw_i; raw[i_ind] = raw_i;
} }
@@ -223,7 +222,7 @@ HAL_StatusTypeDef ADC_UpdateTemperatures(ADC_Periodic_t *adc)
uint16_t *raw = adc->RawData; uint16_t *raw = adc->RawData;
// Преобразования температуры по таблице // Преобразования температуры по таблице
for (int i = ADC_TEMP_CHANNELS_START; i < ADC_TEMP_CHANNELS_END; i++) for (int i = ADC_TEMP_CHANNELS_START; i <= ADC_TEMP_CHANNELS_END; i++)
{ {
data[i] = Filter_Process(&adc->temp_map[i-ADC_TEMP_CHANNELS_START], raw[i]); data[i] = Filter_Process(&adc->temp_map[i-ADC_TEMP_CHANNELS_START], raw[i]);
} }

View File

@@ -55,8 +55,8 @@
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, \ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, \
82, 83, 84, 85, 86, 87, 88, 89, 90} 82, 83, 84, 85, 86, 87, 88, 89, 90}
static const float adc_temp_vals[] = ADC_TEMPERATURES; static float adc_temp_vals[] = ADC_TEMPERATURES;
static const float adc_temp_quants[] = ADC_TEMPERATURES_QUANTS; static float adc_temp_quants[] = ADC_TEMPERATURES_QUANTS;
/** /**
* @brief Коэфициенты канала АЦП для пересчета в единицы измерения * @brief Коэфициенты канала АЦП для пересчета в единицы измерения

View File

@@ -88,7 +88,8 @@ HAL_StatusTypeDef PowerMonitor_Start(PowerMonitor_t *hpm)
return HAL_OK; return HAL_OK;
} }
int temp_i_max = 0;
int temp_reset = 0;
/** /**
* @brief Медленные расчеты АЦП. * @brief Медленные расчеты АЦП.
* @param hpm Указатель на структуру мониторинга сети * @param hpm Указатель на структуру мониторинга сети
@@ -163,7 +164,17 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
float iamp = imean / 3; float iamp = imean / 3;
meas->final.Uamp = uamp;//Filter_Process(&hpm->rms_exp[RMS_EXP_U], uamp); meas->final.Uamp = uamp;//Filter_Process(&hpm->rms_exp[RMS_EXP_U], uamp);
meas->final.Iamp = iamp;//Filter_Process(&hpm->rms_exp[RMS_EXP_I], iamp); meas->final.Iamp = iamp;//Filter_Process(&hpm->rms_exp[RMS_EXP_I], iamp);
static int ch_i = 3;
if(hpm->adc.RawData[ch_i] > temp_i_max)
{
temp_i_max = hpm->adc.RawData[ch_i];
}
if(temp_reset)
{
temp_reset = 0;
temp_i_max = 0;
}
hpm->slow_cnt++; hpm->slow_cnt++;
} }

View File

@@ -133,7 +133,8 @@ int main(void)
#endif //defined(STM32F417xx) #endif //defined(STM32F417xx)
#else //MATLAB #else //MATLAB
#endif //MATLAB #endif //MATLAB
UPP_App_Init(); if(UPP_App_Init())
Error_Handler();
TxHeader.StdId = 0x0100 + 1; TxHeader.StdId = 0x0100 + 1;
TxHeader.ExtId = 0; TxHeader.ExtId = 0;
@@ -146,7 +147,8 @@ int main(void)
/* Infinite loop */ /* Infinite loop */
/* USER CODE BEGIN WHILE */ /* USER CODE BEGIN WHILE */
UPP_PreWhile(); if(UPP_PreWhile())
Error_Handler();
while (1) while (1)
{ {
UPP_While(); UPP_While();

View File

@@ -109,14 +109,17 @@ static void UPP_CEN_Write(int state)
static void UPP_RDO1_Write(int state) static void UPP_RDO1_Write(int state)
{ {
HAL_GPIO_WritePin(RDO1_GPIO_Port, RDO1_Pin, state); HAL_GPIO_WritePin(RDO1_GPIO_Port, RDO1_Pin, state);
GPIO_LED_Set(&UPP_LEDS.red, state);
} }
static void UPP_RDO2_Write(int state) static void UPP_RDO2_Write(int state)
{ {
HAL_GPIO_WritePin(RDO2_GPIO_Port, RDO2_Pin, state); HAL_GPIO_WritePin(RDO2_GPIO_Port, RDO2_Pin, state);
GPIO_LED_Set(&UPP_LEDS.green2, state);
} }
static void UPP_RDO3_Write(int state) static void UPP_RDO3_Write(int state)
{ {
HAL_GPIO_WritePin(RDO3_GPIO_Port, RDO3_Pin, state); HAL_GPIO_WritePin(RDO3_GPIO_Port, RDO3_Pin, state);
GPIO_LED_Set(&UPP_LEDS.green1, state);
} }
static void UPP_RDO4_Write(int state) static void UPP_RDO4_Write(int state)
{ {

View File

@@ -38,6 +38,10 @@ int UPP_App_Init(void)
upp.PUI.values = &MB_DATA.InRegs.pui; upp.PUI.values = &MB_DATA.InRegs.pui;
upp.call = &MB_INTERNAL.FuncCalls; upp.call = &MB_INTERNAL.FuncCalls;
#ifdef UPP_SET_DEFAULT
UPP_Params_SetDefault(1, 1);
#endif
MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim, UPP_UART2_SetDirection); MODBUS_FirstInit(&hmodbus1, &mb_huart, &mb_htim, UPP_UART2_SetDirection);
MODBUS_FirstInit(&hmodbus_pui, &mb_pui_huart, &mb_pui_htim, UPP_UART1_SetDirection); MODBUS_FirstInit(&hmodbus_pui, &mb_pui_huart, &mb_pui_htim, UPP_UART1_SetDirection);
@@ -81,9 +85,9 @@ int UPP_PreWhile(void)
#endif #endif
// GPIO_LED_Fading_Start(&UPP_LEDS.red, 1000); // GPIO_LED_Fading_Start(&UPP_LEDS.red, 1000);
GPIO_LED_Duty_Set(&UPP_LEDS.green1, 25); // GPIO_LED_Duty_Set(&UPP_LEDS.green1, 25);
GPIO_LED_Duty_Set(&UPP_LEDS.green2, 50); // GPIO_LED_Duty_Set(&UPP_LEDS.green2, 50);
GPIO_LED_Duty_Set(&UPP_LEDS.red, 5); // GPIO_LED_Duty_Set(&UPP_LEDS.red, 5);
HAL_CAN_Start(&hcan1); HAL_CAN_Start(&hcan1);
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_RX_FIFO1_MSG_PENDING | HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_RX_FIFO1_MSG_PENDING |
@@ -91,7 +95,8 @@ int UPP_PreWhile(void)
MODBUS_SlaveStart(&hmodbus1, NULL); MODBUS_SlaveStart(&hmodbus1, NULL);
// UPP_DO.CEN(ENABLE);
UPP_DO.CEN(ENABLE);
return 0; return 0;
} }
@@ -108,6 +113,10 @@ int UPP_While(void)
{ {
PWM_SetPolarity(&upp.hpwm, dbg_polarity); PWM_SetPolarity(&upp.hpwm, dbg_polarity);
int retval = 0; int retval = 0;
if(upp.pm.adc.RawData[0] < 2000)
{
__NOP();
}
if(upp.pm.f.runSlow) if(upp.pm.f.runSlow)
{ {
GPIO_LED_Duty_Set(&UPP_LEDS.green1, test_green1); GPIO_LED_Duty_Set(&UPP_LEDS.green1, test_green1);

View File

@@ -105,7 +105,7 @@ void UPP_Params_ControlInternal(void)
// флаги обновились ли конфиги // флаги обновились ли конфиги
static int alpha_update = 0; static int alpha_update = 0;
static int adc_channel_update[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; static int adc_channel_update[ADC_NUMB_OF_CHANNELS] = {0};
static int zc_update = 0; static int zc_update = 0;
static int pwm_update = 0; static int pwm_update = 0;
@@ -118,6 +118,7 @@ void UPP_Params_ControlInternal(void)
// временная переменная для параметров каналов АЦП // временная переменная для параметров каналов АЦП
float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
uint16_t adc_channel_zero[ADC_NUMB_OF_REGULAR_CHANNELS] = {0}; uint16_t adc_channel_zero[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
uint16_t adc_temp_offset[ADC_NUMB_OF_T_CHANNELS] = {0};
// временная переменная для параметров перехода через ноль // временная переменная для параметров перехода через ноль
float zc_hysteresis = upp.pm.zc.Config.Hysteresis; float zc_hysteresis = upp.pm.zc.Config.Hysteresis;
uint16_t zc_debounce = upp.pm.zc.Config.DebounceSamples; uint16_t zc_debounce = upp.pm.zc.Config.DebounceSamples;
@@ -172,7 +173,15 @@ void UPP_Params_ControlInternal(void)
adc_channel_update[i] = 1; adc_channel_update[i] = 1;
} }
} }
for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; i++)
{
adc_temp_offset[i] = (int)upp.pm.adc.temp_map[i].offset + 2048;
if(__CheckParamU16(&adc_temp_offset[i], PARAM_INTERNAL->adc.Temp_Zero[i]))
{
adc_channel_update[ADC_TEMP_CHANNELS_START+i] = 1;
}
}
// Параметры алгоритма перехода через ноль // Параметры алгоритма перехода через ноль
if(__CheckParamF(&zc_hysteresis, PARAM_INTERNAL->zc.Hysteresis, 10000)) if(__CheckParamF(&zc_hysteresis, PARAM_INTERNAL->zc.Hysteresis, 10000))
{ {
@@ -240,14 +249,26 @@ void UPP_Params_ControlInternal(void)
ERR_PRIVATE_CNT->angle_reinit_err++; ERR_PRIVATE_CNT->angle_reinit_err++;
} }
// Обновление АЦП конфигов // Обновление АЦП конфигов
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++) for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
{ {
if(adc_channel_update[i]) if(adc_channel_update[i])
{ {
if(ADC_ConfigChannel(&upp.pm.adc, i, adc_channel_zero[i], adc_channel_max[i], 4095) == HAL_OK) if(i < ADC_NUMB_OF_REGULAR_CHANNELS)
adc_channel_update[i] = 0; {
if(ADC_ConfigChannel(&upp.pm.adc, i, adc_channel_zero[i], adc_channel_max[i], 4095) == HAL_OK)
adc_channel_update[i] = 0;
else
ERR_PRIVATE_CNT->adc_reinit_err++;
}
else else
ERR_PRIVATE_CNT->adc_reinit_err++; {
int temp_i = i-ADC_TEMP_CHANNELS_START;
upp.pm.adc.temp_map[temp_i].reset(&upp.pm.adc.temp_map[temp_i],
(float *)adc_temp_quants,
(float *)adc_temp_vals,
numbof(adc_temp_quants), 1, (int)adc_temp_offset[temp_i]-2048);
Filter_Start(&upp.pm.adc.temp_map[temp_i]);
}
} }
} }
// Обновление Zero-Cross конфигов // Обновление Zero-Cross конфигов
@@ -449,6 +470,8 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC] = ADC_U_ZERO_DEFAULT; PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_UAC] = ADC_U_ZERO_DEFAULT;
PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC] = ADC_I_ZERO_DEFAULT; PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IC] = ADC_I_ZERO_DEFAULT;
PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA] = ADC_I_ZERO_DEFAULT; PARAM_INTERNAL->adc.ADC_Zero[ADC_CHANNEL_IA] = ADC_I_ZERO_DEFAULT;
PARAM_INTERNAL->adc.Temp_Zero[TEMP_1] = ADC_T_ZERO_DEFAULT;
PARAM_INTERNAL->adc.Temp_Zero[TEMP_2] = ADC_T_ZERO_DEFAULT;
PARAM_INTERNAL->pwm.PhaseMask = 7; // (все три фазы) PARAM_INTERNAL->pwm.PhaseMask = 7; // (все три фазы)
PARAM_INTERNAL->pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT; PARAM_INTERNAL->pwm.Frequency = PWM_THYR_FREQUENCY_HZ_DEFAULT;

View File

@@ -53,50 +53,57 @@ typedef struct
{ {
uint16_t TemperatureWarn; ///< Адрес 1010: Предупредительный порог температуры [Градусы x 100] uint16_t TemperatureWarn; ///< Адрес 1010: Предупредительный порог температуры [Градусы x 100]
uint16_t TemperatureErr; ///< Адрес 1011: Аварийный порог температуры [Градусы x 100] uint16_t TemperatureErr; ///< Адрес 1011: Аварийный порог температуры [Градусы x 100]
uint16_t reserved[8];
}temp; }temp;
/* Параметры АЦП */ /* Параметры АЦП */
struct struct
{ {
uint16_t ADC_Max[4]; ///< Адрес 1020: Величина в единицах измерения при АЦП = 4095 [В или А x 10] uint16_t ADC_Max[4]; ///< Адрес 1020-1023: Величина в единицах измерения при АЦП = 4095 [В или А x 10]
uint16_t ADC_Zero[4]; ///< Адрес 1021: Кванты АЦП когда на входе ноль uint16_t ADC_Zero[4]; ///< Адрес 1024-1027: Кванты АЦП когда на входе ноль
uint16_t Temp_Zero[2]; ///< Адрес 1028-1029: Кванты АЦП когда датчик не подключен
uint16_t reserved[10];
}adc; }adc;
/* Параметры Мониторинга напряжения */ /* Параметры Мониторинга напряжения */
struct struct
{ {
uint16_t lImaxAmp; ///< Адрес 1031: Амплитудное значение максимально допустимого тока (рассчитывается само) uint16_t lImaxAmp; ///< Адрес 1040: Амплитудное значение максимально допустимого тока (рассчитывается само)
uint16_t rms_window_size; ///< Адрес 1032: Размер окна для RMS uint16_t rms_window_size; ///< Адрес 1041: Размер окна для RMS
uint16_t rms_exp_alpha; ///< Адрес 1033: Постоянная времени для сглаживания RMS uint16_t rms_exp_alpha; ///< Адрес 1042: Постоянная времени для сглаживания RMS
uint16_t reserved[7];
}pm; }pm;
/* Параметры ШИМ */ /* Параметры ШИМ */
struct struct
{ {
uint16_t PhaseMask; ///< Адрес 1040: Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c uint16_t PhaseMask; ///< Адрес 1050: Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c
uint16_t Frequency; ///< Адрес 1041: Частота ШИМ для пачки импульсов на тиристоры [Герцы] uint16_t Frequency; ///< Адрес 1051: Частота ШИМ для пачки импульсов на тиристоры [Герцы]
uint16_t Duty; ///< Адрес 1042: Скважность ШИМ для пачки импульсов на тиристоры [Проценты] uint16_t Duty; ///< Адрес 1052: Скважность ШИМ для пачки импульсов на тиристоры [Проценты]
uint16_t PulseLength; ///< Адрес 1043: Количесво импульсов в пачке [Количество] uint16_t PulseLength; ///< Адрес 1053: Количесво импульсов в пачке [Количество]
uint16_t reserved[6];
}pwm; }pwm;
/* Параметры Перехода через ноль */ /* Параметры Перехода через ноль */
struct struct
{ {
uint16_t Hysteresis; ///< Адрес 1050: Гистерезис для определения перехода через ноль [Проценты x 100] uint16_t Hysteresis; ///< Адрес 1060: Гистерезис для определения перехода через ноль [Проценты x 100]
uint16_t DebouneCouner; ///< Адрес 1051: Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество] uint16_t DebouneCouner; ///< Адрес 1061: Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество]
uint16_t reserved[8];
}zc; }zc;
/* Параметры Угла */ /* Параметры Угла */
struct struct
{ {
uint16_t PulseLengthReserve;/*!< @brief Адрес 1060: Сколько запаса закладывать на длительность пачки импульсов [Проценты] @ref __AngleSetLimit uint16_t PulseLengthReserve;/*!< @brief Адрес 1070: Сколько запаса закладывать на длительность пачки импульсов [Проценты] @ref __AngleSetLimit
@details Пример: 100% - будет запас в одну пачку импульсов */ @details Пример: 100% - будет запас в одну пачку импульсов */
uint16_t Angle_Max; ///< Адрес 1061: Максимальный угол открытия тиристора [0..1 x 65535] uint16_t Angle_Max; ///< Адрес 1071: Максимальный угол открытия тиристора [0..1 x 65535]
uint16_t Angle_Min; ///< Адрес 1062: Минимальный угол открытия тиристора [0..1 x 65535] uint16_t Angle_Min; ///< Адрес 1072: Минимальный угол открытия тиристора [0..1 x 65535]
uint16_t PID_Kp; ///< Адрес 1063: Пропорциональный коэфициент ПИ регулятора угла [x 10000] uint16_t PID_Kp; ///< Адрес 1073: Пропорциональный коэфициент ПИ регулятора угла [x 10000]
uint16_t PID_Ki; ///< Адрес 1064: Интегральный коэфициент ПИ регулятора угла [x 10000] uint16_t PID_Ki; ///< Адрес 1074: Интегральный коэфициент ПИ регулятора угла [x 10000]
uint16_t PID_Kd; ///< Адрес 1065: Интегральный коэфициент ПИ регулятора угла [x 10000] uint16_t PID_Kd; ///< Адрес 1075: Интегральный коэфициент ПИ регулятора угла [x 10000]
uint16_t reserved[4];
}angle; }angle;
}UPP_PrvtParams_t; }UPP_PrvtParams_t;

View File

@@ -16,6 +16,16 @@ void UPP_Status_Handler(void)
GPIO_LED_Dynamic_Handle(&UPP_LEDS.red); GPIO_LED_Dynamic_Handle(&UPP_LEDS.red);
MB_DATA.InRegs.pui.Uall = upp.pm.measured.final.Uamp * MB_INTERNAL.param.nominal.U;
MB_DATA.InRegs.pui.Uab = upp.pm.measured.final.U[U_AB] * MB_INTERNAL.param.nominal.U;
MB_DATA.InRegs.pui.Ubc = upp.pm.measured.final.U[U_BC] * MB_INTERNAL.param.nominal.U;
MB_DATA.InRegs.pui.Uca = upp.pm.measured.final.U[U_CA] * MB_INTERNAL.param.nominal.U;
MB_DATA.InRegs.pui.Iall = upp.pm.measured.final.Iamp * MB_INTERNAL.param.nominal.I;
MB_DATA.InRegs.pui.Ia = upp.pm.measured.final.U[I_A] * MB_INTERNAL.param.nominal.I;
MB_DATA.InRegs.pui.Ib = upp.pm.measured.final.U[I_B] * MB_INTERNAL.param.nominal.I;
MB_DATA.InRegs.pui.Ic = upp.pm.measured.final.U[I_C] * MB_INTERNAL.param.nominal.I;
if(GPIO_Read_Switch(&UPP_DIN.Pusk)) if(GPIO_Read_Switch(&UPP_DIN.Pusk))
{ {
upp.call->go = 1; upp.call->go = 1;

View File

@@ -154,7 +154,7 @@
<Type>0</Type> <Type>0</Type>
<LineNumber>351</LineNumber> <LineNumber>351</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134232526</Address> <Address>134232758</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
@@ -222,17 +222,37 @@
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>cnt_success,0x0A</ItemText> <ItemText>cnt_success,0x0A</ItemText>
</Ww> </Ww>
<Ww>
<count>11</count>
<WinNumber>1</WinNumber>
<ItemText>PARAM_INTERNAL-&gt;adc.TempOffset,0x0A</ItemText>
</Ww>
<Ww>
<count>12</count>
<WinNumber>1</WinNumber>
<ItemText>upp.pm.measured.final.T[0]</ItemText>
</Ww>
<Ww>
<count>13</count>
<WinNumber>1</WinNumber>
<ItemText>upp.pm.adc,0x0A</ItemText>
</Ww>
<Ww>
<count>14</count>
<WinNumber>1</WinNumber>
<ItemText>hmodbus1</ItemText>
</Ww>
</WatchWindow1> </WatchWindow1>
<WatchWindow2> <WatchWindow2>
<Ww> <Ww>
<count>0</count> <count>0</count>
<WinNumber>2</WinNumber> <WinNumber>2</WinNumber>
<ItemText>uwTick,0x0A</ItemText> <ItemText>temp_offset</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>1</count> <count>1</count>
<WinNumber>2</WinNumber> <WinNumber>2</WinNumber>
<ItemText>hbt</ItemText> <ItemText>adc_temp_quants</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>2</count> <count>2</count>
@@ -244,6 +264,56 @@
<WinNumber>2</WinNumber> <WinNumber>2</WinNumber>
<ItemText>test_err</ItemText> <ItemText>test_err</ItemText>
</Ww> </Ww>
<Ww>
<count>4</count>
<WinNumber>2</WinNumber>
<ItemText>upp.pm.measured.fast</ItemText>
</Ww>
<Ww>
<count>5</count>
<WinNumber>2</WinNumber>
<ItemText>upp.pm.measured.final</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>2</WinNumber>
<ItemText>upp.pm.measured.slow</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>2</WinNumber>
<ItemText>upp.pm.measured.real</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>2</WinNumber>
<ItemText>upp.pm.adc.RawData,0x0A</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>2</WinNumber>
<ItemText>MB_INTERNAL.param,0x0A</ItemText>
</Ww>
<Ww>
<count>10</count>
<WinNumber>2</WinNumber>
<ItemText>temp_reset,0x0A</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>2</WinNumber>
<ItemText>temp_i_max,0x0A</ItemText>
</Ww>
<Ww>
<count>12</count>
<WinNumber>2</WinNumber>
<ItemText>hpm-&gt;adc.RawData[3],0x0A</ItemText>
</Ww>
<Ww>
<count>13</count>
<WinNumber>2</WinNumber>
<ItemText>MB_DATA,0x0A</ItemText>
</Ww>
</WatchWindow2> </WatchWindow2>
<Tracepoint> <Tracepoint>
<THDelay>0</THDelay> <THDelay>0</THDelay>
@@ -289,7 +359,7 @@
<pMultCmdsp></pMultCmdsp> <pMultCmdsp></pMultCmdsp>
<SystemViewers> <SystemViewers>
<Entry> <Entry>
<Name>System Viewer\GPIOB</Name> <Name>System Viewer\ADC3</Name>
<WinId>35905</WinId> <WinId>35905</WinId>
</Entry> </Entry>
</SystemViewers> </SystemViewers>

View File

@@ -555,57 +555,6 @@
<FileName>pwm_thyristors.c</FileName> <FileName>pwm_thyristors.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Core\UPP\pwm_thyristors.c</FilePath> <FilePath>..\Core\UPP\pwm_thyristors.c</FilePath>
<FileOption>
<CommonProperty>
<UseCPPCompiler>2</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>2</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<FileArmAds>
<Cads>
<interw>2</interw>
<Optim>5</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
</FileArmAds>
</FileOption>
</File> </File>
<File> <File>
<FileName>pwm_thyristors.h</FileName> <FileName>pwm_thyristors.h</FileName>