чет еще попытался но безуспешно
This commit is contained in:
parent
2775e0a9b6
commit
c0eea077d9
@ -35,19 +35,19 @@ void Write_UPP_Outputs(real_T* Buffer, int ind_port)
|
||||
//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 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);
|
||||
|
||||
//pwm_wtf(upp.hpwm.AllPhases[PHASE_A_POS].State, upp.hpwm.AllPhases[PHASE_A_NEG].State, &pwm1_pin);
|
||||
//pwm_wtf(upp.hpwm.AllPhases[PHASE_A_NEG].State, upp.hpwm.AllPhases[PHASE_A_POS].State, &pwm2_pin);
|
||||
//pwm_wtf(upp.hpwm.AllPhases[PHASE_B_POS].State, upp.hpwm.AllPhases[PHASE_B_NEG].State, &pwm3_pin);
|
||||
//pwm_wtf(upp.hpwm.AllPhases[PHASE_B_NEG].State, upp.hpwm.AllPhases[PHASE_B_POS].State, &pwm4_pin);
|
||||
//pwm_wtf(upp.hpwm.AllPhases[PHASE_C_POS].State, upp.hpwm.AllPhases[PHASE_C_NEG].State, &pwm5_pin);
|
||||
//pwm_wtf(upp.hpwm.AllPhases[PHASE_C_NEG].State, upp.hpwm.AllPhases[PHASE_C_POS].State, &pwm6_pin);
|
||||
pwm_wtf(upp.hpwm.AllPhases[PHASE_A_POS].State, upp.hpwm.AllPhases[PHASE_A_NEG].State, &pwm1_pin);
|
||||
pwm_wtf(upp.hpwm.AllPhases[PHASE_A_NEG].State, upp.hpwm.AllPhases[PHASE_A_POS].State, &pwm2_pin);
|
||||
pwm_wtf(upp.hpwm.AllPhases[PHASE_B_POS].State, upp.hpwm.AllPhases[PHASE_B_NEG].State, &pwm3_pin);
|
||||
pwm_wtf(upp.hpwm.AllPhases[PHASE_B_NEG].State, upp.hpwm.AllPhases[PHASE_B_POS].State, &pwm4_pin);
|
||||
pwm_wtf(upp.hpwm.AllPhases[PHASE_C_POS].State, upp.hpwm.AllPhases[PHASE_C_NEG].State, &pwm5_pin);
|
||||
pwm_wtf(upp.hpwm.AllPhases[PHASE_C_NEG].State, upp.hpwm.AllPhases[PHASE_C_POS].State, &pwm6_pin);
|
||||
int err = PIN_READ(RDO1);
|
||||
int work = PIN_READ(RDO2);
|
||||
int ready = PIN_READ(RDO3);
|
||||
|
||||
Binary file not shown.
@ -14,34 +14,58 @@
|
||||
#define _UPP_CONFIG_H_
|
||||
#include "stm32f4xx_hal.h"
|
||||
|
||||
// Проверка корректности структуры
|
||||
#define assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized)
|
||||
|
||||
/* Дефайны для индексов */
|
||||
/* Линейные напряжения */
|
||||
#define U_AB 0
|
||||
#define U_CA 1
|
||||
#define U_BC 2
|
||||
/* Токи фаз */
|
||||
#define I_C 0
|
||||
#define I_A 1
|
||||
#define I_B 2
|
||||
/* Температуры */
|
||||
#define TEMP_1 0
|
||||
#define TEMP_2 1
|
||||
|
||||
/**
|
||||
* @addtogroup UPP_PARAMS_TEST Params for tests
|
||||
* @ingroup UPP_CONFIG
|
||||
* @brief Параметры для тестирования УПП. Отключение всякого и включение всяких специфичных режимов
|
||||
* @{
|
||||
*/
|
||||
|
||||
#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 ///< Отключить проверки на потерянные фазы
|
||||
//#define UPP_ANGLE_COSINE ///< Расчет угла через acos, а не линейно
|
||||
|
||||
/** //UPP_PARAMS_TEST
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup UPP_COMPILED_PARAMS Fixed params
|
||||
* @ingroup UPP_CONFIG
|
||||
* @brief Параметры устанавливаемые на этапе компиляции. Без перепрошивки их не поменять
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Периоды обновления всякого */
|
||||
#define PM_ADC_PERIOD_US 25 ///< Период опроса АЦП в мкс
|
||||
#define PM_SLOW_PERIOD_US 500 ///< Период обновления медленных расчетов в мкс (чтобы делилось на @ref PM_ADC_PERIOD_US)
|
||||
#define PM_TEMP_SLOW_PERIOD_MS 1000 ///< Период обновлениия (фильтрации) датчиков температуры в мс
|
||||
#define PM_F_SLOW_PERIOD_MS 40 ///< Период обновления (фильтрации) частоты в мс
|
||||
#define UPP_INIT_BEFORE_READY_MS 2000 ///< Сколько сканировать сеть, перед выставлением состояния готовности
|
||||
|
||||
/* Частоты таймеров в МГц*/
|
||||
#define PWM_TIM1_FREQ_MHZ 180 ///< Частота тактирования таймера ШИМ (1-4 каналы)
|
||||
#define PWM_TIM8_FREQ_MHZ 180 ///< Частота тактирования таймера ШИМ (5-6 каналы)
|
||||
#define ADC_TIM3_FREQ_MZH 90 ///< Частота тактирования таймера АЦП
|
||||
#define ANGLE_TIM2_FREQ_MHZ 90 ///< Частота тактирования таймера для отсчета угла открытия тиристоров
|
||||
#define US_TIM5_FREQ_MHZ 90 ///< Частота тактирования микросекундного таймера
|
||||
|
||||
/** //UPP_COMPILED_PARAMS
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup UPP_PARAMS_DEFAULT Default params for external flash
|
||||
* @ingroup UPP_CONFIG
|
||||
* @brief Дефолтные параметры для внешней памяти. Они применятся по команде или по ошибке
|
||||
* @details Префиксы
|
||||
* @{
|
||||
*/
|
||||
|
||||
@ -110,32 +134,6 @@
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup UPP_COMPILED_PARAMS Fixed params
|
||||
* @ingroup UPP_CONFIG
|
||||
* @brief Параметры устанавливаемые на этапе компиляции. Без перепрошивки их не поменять
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Периоды обновления всякого */
|
||||
#define PM_ADC_PERIOD_US 25 ///< Период опроса АЦП в мкс
|
||||
#define PM_SLOW_PERIOD_US 500 ///< Период обновления медленных расчетов в мкс (чтобы делилось на @ref PM_ADC_PERIOD_US)
|
||||
#define PM_TEMP_SLOW_PERIOD_MS 1000 ///< Период обновлениия (фильтрации) датчиков температуры в мс
|
||||
#define PM_F_SLOW_PERIOD_MS 40 ///< Период обновления (фильтрации) частоты в мс
|
||||
#define UPP_INIT_BEFORE_READY_MS 2000 ///< Сколько сканировать сеть, перед выставлением состояния готовности
|
||||
|
||||
/* Частоты таймеров в МГц*/
|
||||
#define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы)
|
||||
#define PWM_TIM8_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (5-6 каналы)
|
||||
#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков микросекундного таймера
|
||||
#define ADC_TIM3_FREQ_MZH 90 ///< Частота тиков таймера АЦП
|
||||
#define ANGLE_TIM2_FREQ_MHZ 90 ///< Частота тиков таймера отсчета угла открытия тиристоров
|
||||
|
||||
/** //UPP_COMPILED_PARAMS
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
// ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 417 ======
|
||||
|
||||
@ -149,14 +149,31 @@ typedef struct {
|
||||
* @brief Дефайны УПП которые используютяс исключительно внутри программы
|
||||
* @{
|
||||
*/
|
||||
/* Перерасчеты в тики */
|
||||
#define PM_SLOW_PERIOD_CNT (PM_SLOW_PERIOD_US/PM_ADC_PERIOD_US) ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
|
||||
#define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US)
|
||||
#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 assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized)
|
||||
|
||||
|
||||
/* Дефайны для индексов */
|
||||
/* Линейные напряжения */
|
||||
#define U_AB 0
|
||||
#define U_CA 1
|
||||
#define U_BC 2
|
||||
/* Токи фаз */
|
||||
#define I_C 0
|
||||
#define I_A 1
|
||||
#define I_B 2
|
||||
/* Температуры */
|
||||
#define TEMP_1 0
|
||||
#define TEMP_2 1
|
||||
|
||||
/* Перерасчеты в тики */
|
||||
#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000) ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
|
||||
#define PM_SLOW_PERIOD_CNT (PM_SLOW_PERIOD_US/PM_ADC_PERIOD_US) ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
|
||||
#define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US) ///< Пересчитать мкс в тики медленных расчетов
|
||||
#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 SQRT2 1.4142135
|
||||
|
||||
|
||||
@ -202,8 +202,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
|
||||
/* Расчет амплитуд трехфазной сети */
|
||||
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->rms_exp[RMS_EXP_U], uamp);;//Filter_Process(&hpm->rms[RMS_U], uamp);
|
||||
meas->final.Iamp = Filter_Process(&hpm->rms_exp[RMS_EXP_I], iamp);;//Filter_Process(&hpm->rms[RMS_I], iamp);
|
||||
meas->final.Uamp = Filter_Process(&hpm->rms_exp[RMS_EXP_U], uamp);
|
||||
meas->final.Iamp = Filter_Process(&hpm->rms_exp[RMS_EXP_I], iamp);
|
||||
|
||||
|
||||
hpm->slow_cnt++;
|
||||
|
||||
@ -44,7 +44,7 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle)
|
||||
float kd = u2f(PARAM_INTERNAL.angle.PID_Kd, 10000);
|
||||
float ref_alpha = PUI_Tnt_CalcAlpha(u2f(PARAM_PUI.Tnt, 1000), PM_SLOW_PERIOD_US);
|
||||
|
||||
return Angle_PID_Init(hangle, kp, ki, kd, ref_alpha);;
|
||||
return Angle_PID_Init(hangle, kp, ki, kd, ref_alpha);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -385,13 +385,14 @@ void UPP_Params_SetDefault(int pui_default, int internal_default)
|
||||
}
|
||||
|
||||
|
||||
#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000)
|
||||
|
||||
// Перерасчет максимально допустимого угла
|
||||
static void __AngleSetLimit(void)
|
||||
{ // Сколько пачка ипульсов занимает процентов от всего периода
|
||||
float pulses_percent_of_period = (((float)PARAM_INTERNAL.pwm.PulseNumber / PARAM_INTERNAL.pwm.Frequency) * 1000) / ANGLE_PERIOD_MS(upp.pm.measured.final.Fmean);
|
||||
// Вычитаем этот процент из 1 - получаем максимально безопасный угол
|
||||
float angle_limit = 1 - pulses_percent_of_period;
|
||||
float angle_limit = 1;
|
||||
angle_limit -= pulses_percent_of_period*u2f(PARAM_INTERNAL.angle.PulseLengthReserve, 100); // добавляем запас в PulseLengthReserve процентов от пачки импульсов
|
||||
Angle_SetLimit(&upp.hangle, angle_limit);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user