matlab_23550/Inu/Src2/main/detect_overload.c

93 lines
2.5 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 "alg_simple_scalar.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 16273899 // 0.97 //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;
if (edrk.Go)
{
level_I_nominal = _IQmpy(LIMIT_DETECT_LEVEL, edrk.zadanie.iq_Izad_rmp);
if ((filter.iqIm > 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;
}
}
else
edrk.power_limit.bits.limit_Iout = 0;
// if (edrk.from_uom.code>1)
// edrk.power_limit.bits.limit_UOM = 1;
// else
// edrk.power_limit.bits.limit_UOM = 0;
//filter.PowerScalar + edrk.iq_power_kw_another_bs
if ( (edrk.iq_power_kw_full_filter_abs > _IQmpy(LIMIT_DETECT_LEVEL, edrk.zadanie.iq_limit_power_zad_rmp))
|| simple_scalar1.flag_decr_mzz_power
// Äàííûé ñïîñîá äëÿ ñêàëÿðíîãî óïðàâëåíèÿ, äëÿ FOC, âîçìîæíî, íóæíà âåêòîðíàÿ ìîùíîñòü.
)
{
edrk.power_limit.bits.limit_from_SVU = 1;
}
else
{
edrk.power_limit.bits.limit_from_SVU = 0;
}
}