Первый запуск в реале. Всякие фиксы
Тесты происходили на двух двигателях и трансе через ЛАТР
This commit is contained in:
@@ -244,39 +244,84 @@ function update_plots(alpha_deg, alpha_rad, t, f, U_phase, U_line, angle_text)
|
|||||||
end
|
end
|
||||||
|
|
||||||
%% 2. Определяем, когда тиристоры ФИЗИЧЕСКИ открыты
|
%% 2. Определяем, когда тиристоры ФИЗИЧЕСКИ открыты
|
||||||
|
% В схеме без нейтрали тиристоры открываются парами (фаза-фаза)
|
||||||
|
|
||||||
% VS1+ (A+): открыт, если есть импульс и положительная полуволна фазы A
|
% Пары тиристоров для линейных напряжений:
|
||||||
if thyristor_state(1, i) == 1 && (theta_a_mod >= 0 && theta_a_mod <= pi) && (Ua(i) > Ub(i) && Ua(i) > Uc(i))
|
% Uab: VS1+ (A+) и VS4- (B-)
|
||||||
|
% Uba: VS3+ (B+) и VS2- (A-)
|
||||||
|
% Ubc: VS3+ (B+) и VS6- (C-)
|
||||||
|
% Ucb: VS5+ (C+) и VS4- (B-)
|
||||||
|
% Uca: VS5+ (C+) и VS2- (A-)
|
||||||
|
% Uac: VS1+ (A+) и VS6- (C-)
|
||||||
|
|
||||||
|
% Проверяем каждую пару
|
||||||
|
% Пара A+ и B- (Uab)
|
||||||
|
if thyristor_state(1, i) == 1 && thyristor_state(4, i) == 1 && Ua(i) > Ub(i)
|
||||||
|
thyristor_conducting(1, i) = 1;
|
||||||
|
thyristor_conducting(4, i) = 1;
|
||||||
|
elseif i > 1 && thyristor_conducting(1, i-1) == 1 && thyristor_conducting(4, i-1) == 1
|
||||||
|
if Ua(i) > Ub(i)
|
||||||
thyristor_conducting(1, i) = 1;
|
thyristor_conducting(1, i) = 1;
|
||||||
end
|
|
||||||
|
|
||||||
% VS1- (A-): открыт, если есть импульс и отрицательная полуволна фазы A
|
|
||||||
if thyristor_state(2, i) == 1 && (theta_a_mod >= pi && theta_a_mod <= 2*pi) && (Ua(i) < Ub(i) && Ua(i) < Uc(i))
|
|
||||||
thyristor_conducting(2, i) = 1;
|
|
||||||
end
|
|
||||||
|
|
||||||
% VS2+ (B+): открыт, если есть импульс и положительная полуволна фазы B
|
|
||||||
if thyristor_state(3, i) == 1 && (theta_b_mod >= 0 && theta_b_mod <= pi) && (Ub(i) > Ua(i) && Ub(i) > Uc(i))
|
|
||||||
thyristor_conducting(3, i) = 1;
|
|
||||||
end
|
|
||||||
|
|
||||||
% VS2- (B-): открыт, если есть импульс и отрицательная полуволна фазы B
|
|
||||||
if thyristor_state(4, i) == 1 && (theta_b_mod >= pi && theta_b_mod <= 2*pi) && (Ub(i) < Ua(i) && Ub(i) < Uc(i))
|
|
||||||
thyristor_conducting(4, i) = 1;
|
thyristor_conducting(4, i) = 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
% VS3+ (C+): открыт, если есть импульс и положительная полуволна фазы C
|
|
||||||
if thyristor_state(5, i) == 1 && (theta_c_mod >= 0 && theta_c_mod <= pi) && (Uc(i) > Ub(i) && Uc(i) > Ua(i))
|
|
||||||
thyristor_conducting(5, i) = 1;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
% VS3- (C-): открыт, если есть импульс и отрицательная полуволна фазы C
|
% Пара B+ и A- (Uba)
|
||||||
if thyristor_state(6, i) == 1 && (theta_c_mod >= pi && theta_c_mod <= 2*pi) && (Uc(i) < Ub(i) && Uc(i) < Ua(i))
|
if thyristor_state(3, i) == 1 && thyristor_state(2, i) == 1 && Ub(i) > Ua(i)
|
||||||
|
thyristor_conducting(3, i) = 1;
|
||||||
|
thyristor_conducting(2, i) = 1;
|
||||||
|
elseif i > 1 && thyristor_conducting(3, i-1) == 1 && thyristor_conducting(2, i-1) == 1
|
||||||
|
if Ub(i) > Ua(i)
|
||||||
|
thyristor_conducting(3, i) = 1;
|
||||||
|
thyristor_conducting(2, i) = 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% Пара B+ и C- (Ubc)
|
||||||
|
if thyristor_state(3, i) == 1 && thyristor_state(6, i) == 1 && Ub(i) > Uc(i)
|
||||||
|
thyristor_conducting(3, i) = 1;
|
||||||
thyristor_conducting(6, i) = 1;
|
thyristor_conducting(6, i) = 1;
|
||||||
|
elseif i > 1 && thyristor_conducting(3, i-1) == 1 && thyristor_conducting(6, i-1) == 1
|
||||||
|
if Ub(i) > Uc(i)
|
||||||
|
thyristor_conducting(3, i) = 1;
|
||||||
|
thyristor_conducting(6, i) = 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% Пара C+ и B- (Ucb)
|
||||||
|
if thyristor_state(5, i) == 1 && thyristor_state(4, i) == 1 && Uc(i) > Ub(i)
|
||||||
|
thyristor_conducting(5, i) = 1;
|
||||||
|
thyristor_conducting(4, i) = 1;
|
||||||
|
elseif i > 1 && thyristor_conducting(5, i-1) == 1 && thyristor_conducting(4, i-1) == 1
|
||||||
|
if Uc(i) > Ub(i)
|
||||||
|
thyristor_conducting(5, i) = 1;
|
||||||
|
thyristor_conducting(4, i) = 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% Пара C+ и A- (Uca)
|
||||||
|
if thyristor_state(5, i) == 1 && thyristor_state(2, i) == 1 && Uc(i) > Ua(i)
|
||||||
|
thyristor_conducting(5, i) = 1;
|
||||||
|
thyristor_conducting(2, i) = 1;
|
||||||
|
elseif i > 1 && thyristor_conducting(5, i-1) == 1 && thyristor_conducting(2, i-1) == 1
|
||||||
|
if Uc(i) > Ua(i)
|
||||||
|
thyristor_conducting(5, i) = 1;
|
||||||
|
thyristor_conducting(2, i) = 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% Пара A+ и C- (Uac)
|
||||||
|
if thyristor_state(1, i) == 1 && thyristor_state(6, i) == 1 && Ua(i) > Uc(i)
|
||||||
|
thyristor_conducting(1, i) = 1;
|
||||||
|
thyristor_conducting(6, i) = 1;
|
||||||
|
elseif i > 1 && thyristor_conducting(1, i-1) == 1 && thyristor_conducting(6, i-1) == 1
|
||||||
|
if Ua(i) > Uc(i)
|
||||||
|
thyristor_conducting(1, i) = 1;
|
||||||
|
thyristor_conducting(6, i) = 1;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
%% 3. Расчет выходных напряжений
|
%% 3. Расчет выходных напряжений
|
||||||
|
|
||||||
% Фазные выходные напряжения
|
% Фазные выходные напряжения
|
||||||
Ua_out = 0;
|
Ua_out = 0;
|
||||||
if thyristor_conducting(1, i) || thyristor_conducting(2, i)
|
if thyristor_conducting(1, i) || thyristor_conducting(2, i)
|
||||||
@@ -313,7 +358,7 @@ function update_plots(alpha_deg, alpha_rad, t, f, U_phase, U_line, angle_text)
|
|||||||
title('Входные напряжения (сплошные - фазные, пунктир - линейные)');
|
title('Входные напряжения (сплошные - фазные, пунктир - линейные)');
|
||||||
xlabel('Время, с');
|
xlabel('Время, с');
|
||||||
ylabel('Напряжение, В');
|
ylabel('Напряжение, В');
|
||||||
legend('Location', 'best');
|
legend('Location', 'west');
|
||||||
xlim([0, max(t)]);
|
xlim([0, max(t)]);
|
||||||
ylim([-700, 700]);
|
ylim([-700, 700]);
|
||||||
|
|
||||||
@@ -327,7 +372,7 @@ function update_plots(alpha_deg, alpha_rad, t, f, U_phase, U_line, angle_text)
|
|||||||
title(sprintf('Выходные линейные напряжения (α = %d°)', alpha_deg));
|
title(sprintf('Выходные линейные напряжения (α = %d°)', alpha_deg));
|
||||||
xlabel('Время, с');
|
xlabel('Время, с');
|
||||||
ylabel('Напряжение, В');
|
ylabel('Напряжение, В');
|
||||||
legend('Location', 'best');
|
legend('Location', 'west');
|
||||||
xlim([0, max(t)]);
|
xlim([0, max(t)]);
|
||||||
ylim([-700, 700]);
|
ylim([-700, 700]);
|
||||||
|
|
||||||
@@ -338,8 +383,13 @@ function update_plots(alpha_deg, alpha_rad, t, f, U_phase, U_line, angle_text)
|
|||||||
% Цвета для тиристоров
|
% Цвета для тиристоров
|
||||||
colors = {'r', 'r', 'g', 'g', 'b', 'b'};
|
colors = {'r', 'r', 'g', 'g', 'b', 'b'};
|
||||||
line_styles = {'-', '--', '-', '--', '-', '--'};
|
line_styles = {'-', '--', '-', '--', '-', '--'};
|
||||||
|
names = {'VS1+', 'VS1-', 'VS2+', 'VS2-', 'VS3+', 'VS3-'};
|
||||||
|
% Измененный порядок отрисовки: VS1+, VS1-, VS2+, VS2-, VS3+, VS3-
|
||||||
|
order = [6, 5, 4, 3, 2, 1];
|
||||||
|
|
||||||
|
for idx = 1:6
|
||||||
|
k = order(idx); % Берем тиристор в нужном порядке
|
||||||
|
|
||||||
for k = 1:6
|
|
||||||
% Находим интервалы, где подан управляющий импульс
|
% Находим интервалы, где подан управляющий импульс
|
||||||
state = thyristor_state(k, :);
|
state = thyristor_state(k, :);
|
||||||
diff_state = diff([0, state, 0]);
|
diff_state = diff([0, state, 0]);
|
||||||
@@ -348,7 +398,19 @@ function update_plots(alpha_deg, alpha_rad, t, f, U_phase, U_line, angle_text)
|
|||||||
|
|
||||||
% Рисуем горизонтальные линии для каждого интервала
|
% Рисуем горизонтальные линии для каждого интервала
|
||||||
for m = 1:length(start_idx)
|
for m = 1:length(start_idx)
|
||||||
plot(t(start_idx(m):end_idx(m)), k*ones(1, length(start_idx(m):end_idx(m))), ...
|
plot(t(start_idx(m):end_idx(m)), idx*ones(1, length(start_idx(m):end_idx(m))), ...
|
||||||
|
'Color', colors{k}, 'LineStyle', line_styles{k}, 'LineWidth', 1);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Находим интервалы, где тиристор открыт
|
||||||
|
state = thyristor_conducting(k, :);
|
||||||
|
diff_state = diff([0, state, 0]);
|
||||||
|
start_idx = find(diff_state == 1);
|
||||||
|
end_idx = find(diff_state == -1) - 1;
|
||||||
|
|
||||||
|
% Рисуем горизонтальные линии для каждого интервала
|
||||||
|
for m = 1:length(start_idx)
|
||||||
|
plot(t(start_idx(m):end_idx(m)), idx*ones(1, length(start_idx(m):end_idx(m))), ...
|
||||||
'Color', colors{k}, 'LineStyle', line_styles{k}, 'LineWidth', 2);
|
'Color', colors{k}, 'LineStyle', line_styles{k}, 'LineWidth', 2);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -358,15 +420,12 @@ function update_plots(alpha_deg, alpha_rad, t, f, U_phase, U_line, angle_text)
|
|||||||
ylabel('Тиристор');
|
ylabel('Тиристор');
|
||||||
ylim([0.5, 6.5]);
|
ylim([0.5, 6.5]);
|
||||||
yticks(1:6);
|
yticks(1:6);
|
||||||
yticklabels({'VS1+', 'VS1-', 'VS2+', 'VS2-', 'VS3+', 'VS3-'});
|
yticklabels(names(order));
|
||||||
xlim([0, max(t)]);
|
xlim([0, max(t)]);
|
||||||
|
|
||||||
% Обновление текста с текущим углом
|
% Обновление текста с текущим углом
|
||||||
set(angle_text, 'String', sprintf('Угол α = %d°', alpha_deg));
|
set(angle_text, 'String', sprintf('Угол α = %d°', alpha_deg));
|
||||||
|
|
||||||
% Добавление пояснений к тиристорам
|
|
||||||
legend({'Фаза A (+)', 'Фаза A (-)', 'Фаза B (+)', 'Фаза B (-)', ...
|
|
||||||
'Фаза C (+)', 'Фаза C (-)'}, 'Location', 'best');
|
|
||||||
end
|
end
|
||||||
|
|
||||||
%% Функция обратного вызова для ползунка
|
%% Функция обратного вызова для ползунка
|
||||||
|
|||||||
@@ -23,10 +23,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define UPP_SET_DEFAULT ///< Установить настройки по умолчанию
|
#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 UPP_DISABLE_PROTECT_VOLTAGE ///< Отключить проверки на потерянные фазы
|
||||||
|
#define UPP_DISABLE_PROTECT_LONGSTART ///< Отключить проверки на потерянные фазы
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -86,15 +88,15 @@
|
|||||||
#define NOM_F_HZ_DEFAULT 50
|
#define NOM_F_HZ_DEFAULT 50
|
||||||
#define NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT 10
|
#define NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT 10
|
||||||
#define NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT 10
|
#define NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT 10
|
||||||
#define NOM_I_A_DEFAULT 5
|
#define NOM_I_A_DEFAULT 3
|
||||||
|
|
||||||
/* Параметры ПУИ */
|
/* Параметры ПУИ */
|
||||||
#define PUI_Iref_PERCENT_DEFAULT 1.5
|
#define PUI_Iref_PERCENT_DEFAULT 3.0
|
||||||
#define PUI_Tnt_MS_DEFAULT 300
|
#define PUI_Tnt_MS_DEFAULT 5000
|
||||||
#define PUI_Tnt_CalcAlpha(...) FilterExp_CalcAlpha95(__VA_ARGS__) ///< Уровень в процентах, до куда нарастет ток за время Tnt
|
#define PUI_Tnt_CalcAlpha(...) FilterExp_CalcAlpha95(__VA_ARGS__) ///< Уровень в процентах, до куда нарастет ток за время Tnt
|
||||||
#define PUI_Umin_PERCENT_DEFAULT 0.8
|
#define PUI_Umin_PERCENT_DEFAULT 0.8
|
||||||
#define PUI_Umax_PERCENT_DEFAULT 1.2
|
#define PUI_Umax_PERCENT_DEFAULT 1.2
|
||||||
#define PUI_Imax_PERCENT_DEFAULT 0.99
|
#define PUI_Imax_PERCENT_DEFAULT 0.24
|
||||||
#define PUI_Imin_PERCENT_DEFAULT 0.07
|
#define PUI_Imin_PERCENT_DEFAULT 0.07
|
||||||
#define PUI_TiMax_US_DEFAULT 5000
|
#define PUI_TiMax_US_DEFAULT 5000
|
||||||
#define PUI_Tdelay_SECONDS_DEFAULT 30
|
#define PUI_Tdelay_SECONDS_DEFAULT 30
|
||||||
@@ -109,9 +111,9 @@
|
|||||||
|
|
||||||
/* Параметры регулятора угла */
|
/* Параметры регулятора угла */
|
||||||
#define ANGLE_MAX_PERCENT_DEFAULT (140.0f/180.0f) // note: не больше 150!
|
#define ANGLE_MAX_PERCENT_DEFAULT (140.0f/180.0f) // note: не больше 150!
|
||||||
#define ANGLE_MIN_PERCENT_DEFAULT (10.0f/180.0f)
|
#define ANGLE_MIN_PERCENT_DEFAULT (40.0f/180.0f)
|
||||||
#define ANGLE_PID_KP_COEF_DEFAULT 0.0001
|
#define ANGLE_PID_KP_COEF_DEFAULT (0.0025)//(0.0025)
|
||||||
#define ANGLE_PID_KI_COEF_DEFAULT 0.0001
|
#define ANGLE_PID_KI_COEF_DEFAULT (0.125)//(0.0450)
|
||||||
#define ANGLE_PID_KD_COEF_DEFAULT 0
|
#define ANGLE_PID_KD_COEF_DEFAULT 0
|
||||||
|
|
||||||
/* Параметри мониторинга сети */
|
/* Параметри мониторинга сети */
|
||||||
@@ -134,8 +136,8 @@
|
|||||||
|
|
||||||
/* Параметры ШИМ для тиристоров */
|
/* Параметры ШИМ для тиристоров */
|
||||||
#define PWM_THYR_FREQUENCY_HZ_DEFAULT 16000
|
#define PWM_THYR_FREQUENCY_HZ_DEFAULT 16000
|
||||||
#define PWM_THYR_DUTY_PERCENT_DEFAULT 0.5
|
#define PWM_THYR_DUTY_PERCENT_DEFAULT 0.16
|
||||||
#define PWM_THYR_PULSE_LENGTH_DEFAULT (60.0/180.0)
|
#define PWM_THYR_PULSE_LENGTH_DEFAULT (140.0/180.0)
|
||||||
|
|
||||||
/** //UPP_PARAMS_DEFAULT
|
/** //UPP_PARAMS_DEFAULT
|
||||||
* @}
|
* @}
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
|
|||||||
// meas->fast.U[U_CA] = Filter_Process(&hpm->ufltr[U_CA], uac_fast);
|
// meas->fast.U[U_CA] = Filter_Process(&hpm->ufltr[U_CA], uac_fast);
|
||||||
meas->fast.U[U_BC] = U_BC_calc(meas->fast.U[U_AB], meas->fast.U[U_CA]);
|
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_C] = -hpm->adc.Data[ADC_CHANNEL_IC]/i_base;
|
||||||
meas->fast.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]/i_base;
|
meas->fast.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]/i_base;
|
||||||
meas->fast.I[I_B] = I_B_calc(meas->fast.I[I_A], meas->fast.I[I_C]);
|
meas->fast.I[I_B] = I_B_calc(meas->fast.I[I_A], meas->fast.I[I_C]);
|
||||||
|
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ HAL_StatusTypeDef PWM_Stop(PWM_Handle_t *hpwm, UPP_Phase_t Phase, uint8_t force_
|
|||||||
hpwm->AllPhases[ch].State = PWM_THYR_DISABLED;
|
hpwm->AllPhases[ch].State = PWM_THYR_DISABLED;
|
||||||
__PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE);
|
__PWM_SetOutputState(&hpwm->AllPhases[ch], PWM_DISABLE);
|
||||||
}
|
}
|
||||||
|
hpwm->f.Running = 0;
|
||||||
return HAL_OK;
|
return HAL_OK;
|
||||||
}
|
}
|
||||||
// Если НЕ force_stop_all - сбрасываем ТОЛЬКО заданный канал
|
// Если НЕ force_stop_all - сбрасываем ТОЛЬКО заданный канал
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ void UPP_Errors_Ranges(void)
|
|||||||
static int FMinCnt = 0;
|
static int FMinCnt = 0;
|
||||||
static int TMaxCnt = 0;
|
static int TMaxCnt = 0;
|
||||||
|
|
||||||
|
#ifndef UPP_DISABLE_PROTECT_VOLTAGE
|
||||||
/* Напряжения */
|
/* Напряжения */
|
||||||
ERR_PUI->OverVoltage = setError(ERR_PRIVATE->uamp_max,
|
ERR_PUI->OverVoltage = setError(ERR_PRIVATE->uamp_max,
|
||||||
ERR_PUI->OverVoltage,
|
ERR_PUI->OverVoltage,
|
||||||
@@ -96,18 +97,6 @@ void UPP_Errors_Ranges(void)
|
|||||||
&UMinCnt,
|
&UMinCnt,
|
||||||
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR));
|
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR));
|
||||||
|
|
||||||
|
|
||||||
/* Токи */
|
|
||||||
int i_max = ( ERR_PRIVATE->iamp_max ||
|
|
||||||
ERR_PRIVATE->ia_max ||
|
|
||||||
ERR_PRIVATE->ib_max ||
|
|
||||||
ERR_PRIVATE->ic_max);
|
|
||||||
ERR_PUI->OverCurrent = setError(i_max,
|
|
||||||
ERR_PUI->OverCurrent,
|
|
||||||
&IMaxCnt,
|
|
||||||
ticksTiMax);
|
|
||||||
|
|
||||||
|
|
||||||
/* Частота */
|
/* Частота */
|
||||||
int f_max = ( ERR_PRIVATE->fac_max ||
|
int f_max = ( ERR_PRIVATE->fac_max ||
|
||||||
ERR_PRIVATE->fba_max ||
|
ERR_PRIVATE->fba_max ||
|
||||||
@@ -124,6 +113,17 @@ void UPP_Errors_Ranges(void)
|
|||||||
ERR_PUI->UnderFrequency,
|
ERR_PUI->UnderFrequency,
|
||||||
&FMinCnt,
|
&FMinCnt,
|
||||||
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR));
|
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Токи */
|
||||||
|
int i_max = ( ERR_PRIVATE->iamp_max ||
|
||||||
|
ERR_PRIVATE->ia_max ||
|
||||||
|
ERR_PRIVATE->ib_max ||
|
||||||
|
ERR_PRIVATE->ic_max);
|
||||||
|
ERR_PUI->OverCurrent = setError(i_max,
|
||||||
|
ERR_PUI->OverCurrent,
|
||||||
|
&IMaxCnt,
|
||||||
|
ticksTiMax);
|
||||||
|
|
||||||
|
|
||||||
/* Температуры */
|
/* Температуры */
|
||||||
@@ -181,11 +181,12 @@ void UPP_Errors_Other(void)
|
|||||||
{
|
{
|
||||||
static int InterlaceCnt = 0;
|
static int InterlaceCnt = 0;
|
||||||
|
|
||||||
|
#ifndef UPP_DISABLE_PROTECT_LONGSTART
|
||||||
if(ERR_PRIVATE->longstart)
|
if(ERR_PRIVATE->longstart)
|
||||||
ERR_PUI->LongStart = 1;
|
ERR_PUI->LongStart = 1;
|
||||||
else
|
else
|
||||||
ERR_PUI->LongStart = 0;
|
ERR_PUI->LongStart = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
ERR_PUI->Interlace = setError(ERR_PRIVATE->interlance,
|
ERR_PUI->Interlace = setError(ERR_PRIVATE->interlance,
|
||||||
ERR_PUI->Interlace,
|
ERR_PUI->Interlace,
|
||||||
|
|||||||
@@ -111,8 +111,9 @@ int test_green2 = 0;
|
|||||||
*/
|
*/
|
||||||
int UPP_While(void)
|
int UPP_While(void)
|
||||||
{
|
{
|
||||||
PWM_SetPolarity(&upp.hpwm, dbg_polarity);
|
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
PWM_SetPolarity(&upp.hpwm, dbg_polarity);
|
||||||
|
|
||||||
if(upp.pm.adc.RawData[0] < 2000)
|
if(upp.pm.adc.RawData[0] < 2000)
|
||||||
{
|
{
|
||||||
__NOP();
|
__NOP();
|
||||||
@@ -132,7 +133,7 @@ int UPP_While(void)
|
|||||||
PowerMonitor_SlowCalc(&upp.pm);
|
PowerMonitor_SlowCalc(&upp.pm);
|
||||||
|
|
||||||
// Защиты // Защиты по току включаем только после разгона и в режиме работы
|
// Защиты // Защиты по току включаем только после разгона и в режиме работы
|
||||||
PowerMonitor_Protect(&upp.pm, upp.hangle.f.RazgonDone /*&& (upp.workmode == UPP_Work)*/);
|
PowerMonitor_Protect(&upp.pm, upp.hangle.f.RazgonDone && (upp.workmode == UPP_Work));
|
||||||
|
|
||||||
#ifdef UPP_SIMULATE_I // симулируем токи
|
#ifdef UPP_SIMULATE_I // симулируем токи
|
||||||
upp.pm.measured.final.Iamp = upp.hangle.Iref/2;
|
upp.pm.measured.final.Iamp = upp.hangle.Iref/2;
|
||||||
@@ -172,7 +173,6 @@ int UPP_While(void)
|
|||||||
upp.call->set_default_internal = 0;
|
upp.call->set_default_internal = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef UPP_DISABLE_ERROR_BLOCK
|
#ifndef UPP_DISABLE_ERROR_BLOCK
|
||||||
// если ошибка вызываем СТОП
|
// если ошибка вызываем СТОП
|
||||||
upp.call->stop = (errors.common != Err_None);
|
upp.call->stop = (errors.common != Err_None);
|
||||||
@@ -180,7 +180,10 @@ int UPP_While(void)
|
|||||||
|
|
||||||
// Если СТОП - переходим в ошибку
|
// Если СТОП - переходим в ошибку
|
||||||
if (upp.call->stop)
|
if (upp.call->stop)
|
||||||
|
{
|
||||||
|
Angle_PID_Reset(&upp.hangle);
|
||||||
upp.workmode = UPP_Error;
|
upp.workmode = UPP_Error;
|
||||||
|
}
|
||||||
|
|
||||||
// Автомат состояний УПП
|
// Автомат состояний УПП
|
||||||
switch(upp.workmode)
|
switch(upp.workmode)
|
||||||
@@ -237,7 +240,11 @@ int UPP_While(void)
|
|||||||
UPP_DO.Error(DISABLE);
|
UPP_DO.Error(DISABLE);
|
||||||
// если пришла команда на остановку
|
// если пришла команда на остановку
|
||||||
if (!upp.call->go)
|
if (!upp.call->go)
|
||||||
|
{
|
||||||
|
Angle_PID_Reset(&upp.hangle);
|
||||||
upp.workmode = UPP_Init;
|
upp.workmode = UPP_Init;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Коррекция для отсчета угла открытия
|
// Коррекция для отсчета угла открытия
|
||||||
// 30 градусов - сдвиг между линейными и фазными напряжениями
|
// 30 градусов - сдвиг между линейными и фазными напряжениями
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
#include "upp_main.h" // всё остальное по работе с УПП
|
#include "upp_main.h" // всё остальное по работе с УПП
|
||||||
#include "upp_status.h"
|
#include "upp_status.h"
|
||||||
|
int cnt_oscil_size = 100;
|
||||||
void UPP_Status_Handler(void)
|
void UPP_Status_Handler(void)
|
||||||
{
|
{
|
||||||
/* Хендлы для отладочных светодиодов (если выбран режим моргания) */
|
/* Хендлы для отладочных светодиодов (если выбран режим моргания) */
|
||||||
@@ -49,10 +49,25 @@ void UPP_Status_Handler(void)
|
|||||||
{
|
{
|
||||||
mb_u_cnt = 0;
|
mb_u_cnt = 0;
|
||||||
}
|
}
|
||||||
MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.U[U_AB]+1)*127;
|
// MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.U[U_AB]+1)*127;
|
||||||
MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.U[U_BC]+1)*127;
|
// MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.U[U_BC]+1)*127;
|
||||||
MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.U[U_CA]+1)*127;
|
// MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.U[U_CA]+1)*127;
|
||||||
MB_INTERNAL.oscil.data[mb_u_cnt++] = local_time();
|
// MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.I[I_A]+1)*127;
|
||||||
|
// MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.I[I_B]+1)*127;
|
||||||
|
// MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.pm.measured.slow.I[I_C]+1)*127;
|
||||||
|
static int cnt_oscil = 0;
|
||||||
|
|
||||||
|
if(cnt_oscil == 0)
|
||||||
|
{
|
||||||
|
MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.hangle.Iref)*32;
|
||||||
|
MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.hangle.Imeas)*32;
|
||||||
|
MB_INTERNAL.oscil.data[mb_u_cnt++] = (upp.hangle.alpha)*127;
|
||||||
|
MB_INTERNAL.oscil.data[mb_u_cnt++] = 0;
|
||||||
|
}
|
||||||
|
if (++cnt_oscil>cnt_oscil_size)
|
||||||
|
{
|
||||||
|
cnt_oscil = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(GPIO_Read_Switch(&UPP_DIN.Pusk))
|
if(GPIO_Read_Switch(&UPP_DIN.Pusk))
|
||||||
|
|||||||
@@ -312,12 +312,12 @@
|
|||||||
<Ww>
|
<Ww>
|
||||||
<count>12</count>
|
<count>12</count>
|
||||||
<WinNumber>2</WinNumber>
|
<WinNumber>2</WinNumber>
|
||||||
<ItemText>hpm->adc.RawData[3],0x0A</ItemText>
|
<ItemText>MB_DATA.HoldRegs.pui_params,0x0A</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>13</count>
|
<count>13</count>
|
||||||
<WinNumber>2</WinNumber>
|
<WinNumber>2</WinNumber>
|
||||||
<ItemText>MB_DATA,0x0A</ItemText>
|
<ItemText>MB_DATA.InRegs.pui</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>14</count>
|
<count>14</count>
|
||||||
@@ -332,12 +332,12 @@
|
|||||||
<Ww>
|
<Ww>
|
||||||
<count>16</count>
|
<count>16</count>
|
||||||
<WinNumber>2</WinNumber>
|
<WinNumber>2</WinNumber>
|
||||||
<ItemText>MB_INTERNAL</ItemText>
|
<ItemText>MB_INTERNAL.param,0x0A</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>17</count>
|
<count>17</count>
|
||||||
<WinNumber>2</WinNumber>
|
<WinNumber>2</WinNumber>
|
||||||
<ItemText>upp.hangle</ItemText>
|
<ItemText>upp.hangle,0x0A</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>18</count>
|
<count>18</count>
|
||||||
@@ -349,6 +349,11 @@
|
|||||||
<WinNumber>2</WinNumber>
|
<WinNumber>2</WinNumber>
|
||||||
<ItemText>hmodbus1</ItemText>
|
<ItemText>hmodbus1</ItemText>
|
||||||
</Ww>
|
</Ww>
|
||||||
|
<Ww>
|
||||||
|
<count>20</count>
|
||||||
|
<WinNumber>2</WinNumber>
|
||||||
|
<ItemText>cnt_oscil_size,0x0A</ItemText>
|
||||||
|
</Ww>
|
||||||
</WatchWindow2>
|
</WatchWindow2>
|
||||||
<Tracepoint>
|
<Tracepoint>
|
||||||
<THDelay>0</THDelay>
|
<THDelay>0</THDelay>
|
||||||
|
|||||||
Reference in New Issue
Block a user