matlab_23550/Inu/Src/main/detect_overload.c

75 lines
2.2 KiB
C

/*
* detect_overload.c
*
* Created on: 15 äåê. 2020 ã.
* Author: star
*/
#include <adc_tools.h>
#include <detect_overload.h>
#include <edrk_main.h>
#include <params_motor.h>
#include <params_pwm24.h>
#include "IQmathLib.h"
DETECT_OVERLOAD out_I_over_1_6 = DETECT_OVERLOAD_DEFAULTS;
#define CALLS_IN_PWM_INT 2 //Êîëè÷åñòâî ïðåðûâàíèé çà ïåðèîä ØÈÌ (1 èëè 2)
void init_detect_overloads(void) {
out_I_over_1_6.level_overload = _IQmpy(I_OUT_NOMINAL_IQ, _IQ(1.6));
out_I_over_1_6.time_over_tics = (long) 15 * FREQ_PWM * CALLS_IN_PWM_INT;
out_I_over_1_6.time_latch_tics = (long) 45 * FREQ_PWM * CALLS_IN_PWM_INT;
out_I_over_1_6.tics_counter = 0;
out_I_over_1_6.overload_detected = 0;
}
int calc_detect_overload(DETECT_OVERLOAD *v) {
if (v->val > v->level_overload) {
v->tics_counter += 1;
if (v->tics_counter > v->time_over_tics) { v->tics_counter = v->time_over_tics;}
} else {
if (v->tics_counter > 0) { v->tics_counter -= 1; }
else {v->tics_counter = 0;}
if (v->overload_detected && v->tics_counter == 0) {
v->overload_detected = 0;
}
}
if (v->tics_counter >= v->time_over_tics) {
v->overload_detected = 1;
v->tics_counter = v->time_latch_tics;
}
return v->overload_detected;
}
#define LIMIT_DETECT_LEVEL 15938355 //95%
void check_all_power_limits() {
_iq level_I_nominal = 0;
edrk.power_limit.bits.limit_by_temper = edrk.temper_limit_koeffs.code_status;
level_I_nominal = _IQmpy(LIMIT_DETECT_LEVEL, edrk.zadanie.iq_Izad_rmp);
if ((filter.iqIm_1 > level_I_nominal) || (filter.iqIm_1 > level_I_nominal) ||
out_I_over_1_6.overload_detected) {
edrk.power_limit.bits.limit_Iout = 1;
} else {
edrk.power_limit.bits.limit_Iout = 0;
}
// edrk.power_limit.bits.limit_UOM =
if ((filter.PowerScalar + edrk.iq_power_kw_another_bs) >
_IQmpy(LIMIT_DETECT_LEVEL, edrk.zadanie.iq_limit_power_zad_rmp)
// Äàííûé ñïîñîá äëÿ ñêàëÿðíîãî óïðàâëåíèÿ, äëÿ FOC, âîçìîæíî, íóæíà âåêòîðíàÿ ìîùíîñòü.
) {
edrk.power_limit.bits.limit_from_SVU = 1;
} else {
edrk.power_limit.bits.limit_from_SVU = 0;
}
}