в матлаб всё как у улитовского но не работает... почему...

плюс кучи мелочи по программе
This commit is contained in:
Razvalyaev 2025-12-01 18:44:24 +03:00
parent 7d40322f1e
commit eb6979aa27
18 changed files with 88 additions and 62 deletions

View File

@ -737,15 +737,15 @@ void TIM_Call_IRQHandller(TIM_TypeDef* TIMx)
TIM6_DAC_IRQHandler();
else if (TIMx == TIM7)
TIM7_IRQHandler();
else if ((TIMx == TIM8) || (TIMx == TIM13))
else if (((TIMx == TIM8) && (TIM8->SR & TIM_SR_UIF)) || (TIMx == TIM13))
TIM8_UP_TIM13_IRQHandler();
else if ((TIMx == TIM1) || (TIMx == TIM9))
else if (((TIMx == TIM1) && 0) || (TIMx == TIM9))
TIM1_BRK_TIM9_IRQHandler();
else if ((TIMx == TIM1) || (TIMx == TIM11))
else if (((TIMx == TIM1) && (TIM1->SR & (TIM_SR_CC1IF|TIM_SR_CC2IF | TIM_SR_CC3IF | TIM_SR_CC4IF))) || (TIMx == TIM11))
TIM1_TRG_COM_TIM11_IRQHandler();
else if ((TIMx == TIM8) || (TIMx == TIM12))
else if (((TIMx == TIM8) && 0) || (TIMx == TIM12))
TIM8_BRK_TIM12_IRQHandler();
else if ((TIMx == TIM8) || (TIMx == TIM14))
else if (((TIMx == TIM8) && (TIM8->SR & (TIM_SR_CC1IF | TIM_SR_CC2IF | TIM_SR_CC3IF | TIM_SR_CC4IF))) || (TIMx == TIM14))
TIM8_TRG_COM_TIM14_IRQHandler();
SR_PROCESS(TIMx, SR);

View File

@ -11,12 +11,18 @@ float dbg[16];
void Write_UPP_Outputs(real_T* Buffer, int ind_port)
{
int pwm1_pin = PIN_READ(PWM1);
int pwm2_pin = PIN_READ(PWM2);
int pwm3_pin = PIN_READ(PWM3);
int pwm4_pin = PIN_READ(PWM4);
int pwm5_pin = PIN_READ(PWM5);
int pwm6_pin = PIN_READ(PWM6);
//int pwm1_pin = PIN_READ(PWM1);
//int pwm2_pin = PIN_READ(PWM2);
//int pwm3_pin = PIN_READ(PWM3);
//int pwm4_pin = PIN_READ(PWM4);
//int pwm5_pin = PIN_READ(PWM5);
//int pwm6_pin = PIN_READ(PWM6);
int pwm1_pin = (upp.hpwm.AllPhases[PHASE_A_POS].State == PWM_THYR_TIM_ACTIVE);
int pwm2_pin = (upp.hpwm.AllPhases[PHASE_A_NEG].State == PWM_THYR_TIM_ACTIVE);
int pwm3_pin = (upp.hpwm.AllPhases[PHASE_B_POS].State == PWM_THYR_TIM_ACTIVE);
int pwm4_pin = (upp.hpwm.AllPhases[PHASE_B_NEG].State == PWM_THYR_TIM_ACTIVE);
int pwm5_pin = (upp.hpwm.AllPhases[PHASE_C_POS].State == PWM_THYR_TIM_ACTIVE);
int pwm6_pin = (upp.hpwm.AllPhases[PHASE_C_NEG].State == PWM_THYR_TIM_ACTIVE);
int err = PIN_READ(RDO1);
int work = PIN_READ(RDO2);
int ready = PIN_READ(RDO3);
@ -86,7 +92,7 @@ void Write_PowerMonitor(real_T* Buffer, int ind_port)
{ //20-21
WriteOutputArray(upp.pm.isr_cnt, ind_port, nn++);
WriteOutputArray(upp.pm.slow_cnt, ind_port, nn++);
WriteOutputArray(upp.pm.slow_cnt%PM_SLOW_PERIOD_CNT, ind_port, nn++);
}
}

Binary file not shown.

@ -1 +1 @@
Subproject commit 0fd9c78c32ed86a14026e72115f01ca000192464
Subproject commit c5a01c56acd851843edc478bd65c7f276a9ac8e3

View File

@ -19,8 +19,8 @@
/* Дефайны для индексов */
/* Линейные напряжения */
#define U_BA 0
#define U_AC 1
#define U_AB 0
#define U_CA 1
#define U_BC 2
/* Токи фаз */
#define I_C 0
@ -32,7 +32,7 @@
#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_LOSS_PHASE ///< Отключить проверки на потерянные фазы
@ -86,7 +86,7 @@
#define ANGLE_PID_KD_COEF_DEFAULT 0
/* Параметри мониторинга сети */
#define PM_EXP_TAU_COEF_DEFAULT 0.05
#define PM_EXP_TAU_COEF_DEFAULT 0.2
/* Параметры АЦП */
#define ADC_U_MAX_V_DEFAULT 1216.0
@ -101,7 +101,7 @@
/* Параметры ШИМ для тиристоров */
#define PWM_THYR_FREQUENCY_HZ_DEFAULT 16000
#define PWM_THYR_DUTY_PERCENT_DEFAULT 0.5
#define PWM_THYR_PULSE_NUMBER_DEFAULT 20
#define PWM_THYR_PULSE_NUMBER_DEFAULT 10
/** //UPP_PARAMS_DEFAULT
* @}

View File

@ -57,6 +57,7 @@ void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM1_UP_TIM10_IRQHandler(void);
void TIM2_IRQHandler(void);
void TIM8_UP_TIM13_IRQHandler(void);
void TIM8_TRG_COM_TIM14_IRQHandler(void);
void DMA2_Stream0_IRQHandler(void);
/* USER CODE BEGIN EFP */

View File

@ -156,14 +156,14 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
float *data = adc->Data;
// // Фильтрация от импульсных шумов для всех каналов
// for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
// {
// if(Filter_isEnable(&adc->filter[i]))
// {
// // заменяем данные на отфильтрованные данные
// data[i] = Filter_Process(&adc->filter[i], data[i]);
// }
// }
for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
{
if(Filter_isEnable(&adc->filter[i]))
{
// заменяем сырые данные на отфильтрованные данные
raw[i] = Filter_Process(&adc->filter[i], raw[i]);
}
}
// Перерасчеты Напряжений/Токов в единицы измерения
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)

View File

@ -53,7 +53,7 @@ static const float adc_temp_quants[] = ADC_TEMPERATURES_QUANTS;
#define Filter_t FilterMedianInt_t
#define Filter_Init FilterMedianInt_Init
#define Filter_Initializator 5
#define Filter_Initializator 10, 2048
/**
* @brief Коэфициенты канала АЦП для пересчета в единицы измерения

View File

@ -11,8 +11,8 @@
#include "adc.h"
#include "tim.h"
#define U_BC_calc(_u1_, _u2_) (-((_u1_) + (_u2_)))
#define I_B_calc(_i1_, _i2_) (-((_i1_) + (_i2_)))
#define U_BC_calc(_uab_, _uca_) (-((_uab_) + (_uca_)))
#define I_B_calc(_ia_, _ic_) (-((_ia_) + (_ic_)))
static void __SynchAvgFilters(PowerMonitor_t *hpm);
@ -61,9 +61,9 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
return HAL_ERROR;
/* Инициализация каналов алгоритма перехода через ноль */
if(ZC_ConfigChannel(&hpm->zc, U_BA, ZC_BOTH_EDGES) != HAL_OK)
if(ZC_ConfigChannel(&hpm->zc, U_AB, ZC_BOTH_EDGES) != HAL_OK)
return HAL_ERROR;
if(ZC_ConfigChannel(&hpm->zc, U_AC, ZC_BOTH_EDGES) != HAL_OK)
if(ZC_ConfigChannel(&hpm->zc, U_CA, ZC_BOTH_EDGES) != HAL_OK)
return HAL_ERROR;
if(ZC_ConfigChannel(&hpm->zc, U_BC, ZC_BOTH_EDGES) != HAL_OK)
return HAL_ERROR;
@ -96,7 +96,7 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
/* Инициализация среднего фильтра для частот */
for(int i = 0; i < 3; i++)
{
if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS), FILTER_MODE_DEFAULT))
if(FilterAverage_Init(&hpm->avg[AVG_FAB+i], MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS), FILTER_MODE_DEFAULT))
return HAL_ERROR;
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);
@ -143,7 +143,7 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
meas->final.T[TEMP_2] = Filter_Process(&hpm->avg[AVG_TEMP2], t2);
/* Расчет третьей фазы */
meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_BA], meas->slow.U[U_AC]);
meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_AB], meas->slow.U[U_CA]);
meas->slow.I[I_B] = I_B_calc(meas->slow.I[I_A], meas->slow.I[I_C]);
/* Расчет всякого для трех фаз отдельно */
@ -156,13 +156,13 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
for(int i = 0; i < 3; i++)
{
/* Получение частоты фазы */
meas->final.F[i] = Filter_Process(&hpm->avg[AVG_FBA+i], ZC_GetFrequency(&hpm->zc, i));
meas->final.F[i] = Filter_Process(&hpm->avg[AVG_FAB+i], ZC_GetFrequency(&hpm->zc, i));
meas->final.Offset[i] = ZC_GetOffset(&hpm->zc, i);
fmean += meas->final.F[i];
/* Средниее напряжение фазы */
uphase_mean = fabsf(meas->slow.U[i]);
uphase_mean = Filter_Process(&hpm->exp[EXP_UBA+i], uphase_mean);
uphase_mean = Filter_Process(&hpm->exp[EXP_UAB+i], uphase_mean);
meas->final.U[i] = uphase_mean*PI/2/SQRT2; /*PI/2 - получить амплитудное, SQRT2 - получить действующее */
/* Средний ток фазы */
@ -188,7 +188,7 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
/* Расчет амплитуд трехфазной сети */
float uamp = vector_abs_linear_calc(meas->slow.U[U_BA], meas->slow.U[U_AC])/SQRT2; /* SQRT2 - получить действующее */
float uamp = vector_abs_linear_calc(meas->slow.U[U_AB], meas->slow.U[U_CA])/SQRT2; /* SQRT2 - получить действующее */
float iamp = vector_abs_phase_calc(meas->slow.I[I_A], meas->slow.I[I_C])/SQRT2; /* SQRT2 - получить действующее */
meas->final.Uamp = Filter_Process(&hpm->exp[EXP_U], uamp);
meas->final.Iamp = Filter_Process(&hpm->exp[EXP_I], iamp);
@ -215,9 +215,9 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
float u_base = u2f(PARAM_INTERNAL.nominal.U, 10);
float i_base = u2f(PARAM_INTERNAL.nominal.I, 10);
PowerMonitor_Measured_t *meas = &hpm->measured;
meas->fast.U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA]/u_base;
meas->fast.U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC]/u_base;
meas->fast.U[U_BC] = U_BC_calc(meas->fast.U[U_BA], meas->fast.U[U_AC]);
meas->fast.U[U_AB] = hpm->adc.Data[ADC_CHANNEL_UBA]/u_base;
meas->fast.U[U_CA] = hpm->adc.Data[ADC_CHANNEL_UAC]/u_base;
meas->fast.U[U_BC] = U_BC_calc(meas->fast.U[U_AB], meas->fast.U[U_CA]);
meas->fast.I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC]/i_base;
meas->fast.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]/i_base;
@ -230,8 +230,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
//__SynchAvgFilters(hpm);
/* Average для медленной фильтрации */
meas->slow.U[U_BA] = Filter_Process(&hpm->avg[AVG_UBA], meas->fast.U[U_BA]);
meas->slow.U[U_AC] = Filter_Process(&hpm->avg[AVG_UAC], meas->fast.U[U_AC]);
meas->slow.U[U_AB] = Filter_Process(&hpm->avg[AVG_UAB], meas->fast.U[U_AB]);
meas->slow.U[U_CA] = Filter_Process(&hpm->avg[AVG_UCA], meas->fast.U[U_CA]);
meas->slow.I[I_C] = Filter_Process(&hpm->avg[AVG_IC], meas->fast.I[I_C]);
meas->slow.I[I_A] = Filter_Process(&hpm->avg[AVG_IA], meas->fast.I[I_A]);

View File

@ -15,8 +15,8 @@
/* Индексы экспоненциальных фильтров */
#define EXP_ALL 8
#define EXP_U 0
#define EXP_UBA 1
#define EXP_UAC 2
#define EXP_UAB 1
#define EXP_UCA 2
#define EXP_UBC 3
#define EXP_I 4
#define EXP_IC 5
@ -24,14 +24,14 @@
#define EXP_IB 7
#define AVG_ALL 9
#define AVG_UBA 0
#define AVG_UAC 1
#define AVG_UAB 0
#define AVG_UCA 1
#define AVG_IC 2
#define AVG_IA 3
#define AVG_TEMP1 4
#define AVG_TEMP2 5
#define AVG_FBA 6
#define AVG_FAC 7
#define AVG_FAB 6
#define AVG_FCA 7
#define AVG_FBC 8
/**

View File

@ -142,11 +142,11 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U
/*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/
if(measure->final.F[U_AC] > lFmax)
if(measure->final.F[U_CA] > lFmax)
{
ERR_PRIVATE.fac_max = 1;
}
else if (measure->final.F[U_AC] < lFmin)
else if (measure->final.F[U_CA] < lFmin)
{
ERR_PRIVATE.fac_min = 1;
}
@ -156,11 +156,11 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U
ERR_PRIVATE.fac_min = 0;
}
if(measure->final.F[U_BA] > lFmax)
if(measure->final.F[U_AB] > lFmax)
{
ERR_PRIVATE.fba_max = 1;
}
else if (measure->final.F[U_BA] < lFmin)
else if (measure->final.F[U_AB] < lFmin)
{
ERR_PRIVATE.fba_min = 1;
}

View File

@ -232,6 +232,20 @@ void TIM2_IRQHandler(void)
/* USER CODE END TIM2_IRQn 1 */
}
/**
* @brief This function handles TIM8 update interrupt and TIM13 global interrupt.
*/
void TIM8_UP_TIM13_IRQHandler(void)
{
/* USER CODE BEGIN TIM8_UP_TIM13_IRQn 0 */
/* USER CODE END TIM8_UP_TIM13_IRQn 0 */
HAL_TIM_IRQHandler(&htim8);
/* USER CODE BEGIN TIM8_UP_TIM13_IRQn 1 */
UPP_PWM_Handle();
/* USER CODE END TIM8_UP_TIM13_IRQn 1 */
}
/**
* @brief This function handles TIM8 trigger and commutation interrupts and TIM14 global interrupt.
*/

View File

@ -461,6 +461,8 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
__HAL_RCC_TIM8_CLK_ENABLE();
/* TIM8 interrupt Init */
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);
HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);
/* USER CODE BEGIN TIM8_MspInit 1 */
@ -604,6 +606,7 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
__HAL_RCC_TIM8_CLK_DISABLE();
/* TIM8 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM8_UP_TIM13_IRQn);
HAL_NVIC_DisableIRQ(TIM8_TRG_COM_TIM14_IRQn);
/* USER CODE BEGIN TIM8_MspDeInit 1 */

View File

@ -367,6 +367,7 @@ HAL_StatusTypeDef PWM_Handle(PWM_Handle_t *hpwm)
// после того как пачка импульсов прошла отключаем активный канал
if (hPhase->State == PWM_THYR_TIM_ACTIVE)
{
hPhase->State = PWM_THYR_TIM_WAIT;
if(hpwm->f.Running)
hpwm->f.Running--;
__PWM_SetOutputState(hPhase, PWM_DISABLE);

View File

@ -25,11 +25,11 @@
// Индексы для структур каналов @ref PWM_Handle_t
#define PHASE_A_POS 0
#define PHASE_B_POS 1
#define PHASE_C_POS 2
#define PHASE_C_POS 1
#define PHASE_B_POS 2
#define PHASE_A_NEG 3
#define PHASE_B_NEG 4
#define PHASE_C_NEG 5
#define PHASE_C_NEG 4
#define PHASE_B_NEG 5
#define PHASE_UNKNOWN 6

View File

@ -355,7 +355,7 @@
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>hbt,0x0A</ItemText>
<ItemText>upp.pm.measured</ItemText>
</Ww>
<Ww>
<count>6</count>
@ -501,7 +501,7 @@
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>0</aLwin>
<aLwin>1</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
@ -515,7 +515,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>

View File

@ -17,8 +17,8 @@
<TargetCommonOption>
<Device>STM32F427ZGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -1004,8 +1004,8 @@
<TargetCommonOption>
<Device>STM32F417ZGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>

View File

@ -163,6 +163,7 @@ 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_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.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false