238 lines
6.7 KiB
C
238 lines
6.7 KiB
C
/*
|
|
* limit_power.c
|
|
*
|
|
* Created on: 15 àâã. 2024 ã.
|
|
* Author: yura
|
|
*/
|
|
|
|
#include "IQmathLib.h"
|
|
|
|
#include <adc_tools.h>
|
|
#include <detect_overload.h>
|
|
#include <edrk_main.h>
|
|
#include <params_motor.h>
|
|
#include <params_pwm24.h>
|
|
#include "mathlib.h"
|
|
#include "math_pi.h"
|
|
|
|
|
|
#include "limit_power.h"
|
|
#include "limit_lib.h"
|
|
|
|
#include "pll_tools.h"
|
|
|
|
#include "uom_tools.h"
|
|
|
|
|
|
|
|
|
|
#define KOEF_50HZ (FREQ_PWM*2.0*50.0/PI)
|
|
#define LEVEL_01HZ_IQ _IQ(10.0/KOEF_50HZ) // 0.1 HZ
|
|
|
|
_iq level_50hz = _IQmpyI32(LEVEL_01HZ_IQ, 500);
|
|
_iq level_minimal_level_work_hz = _IQmpyI32(LEVEL_01HZ_IQ, 350);
|
|
|
|
_iq delta_freq_test = 0;
|
|
|
|
|
|
//_iq level_01hz = _IQ(LEVEL_01HZ);
|
|
|
|
|
|
//#define LEVEL_50HZ (5000.0/KOEF_50HZ) // 50 HZ
|
|
//#define LEVEL_05HZ (50.0/KOEF_50HZ) // 50 HZ
|
|
//
|
|
//#define LEVEL_3HZ (300.0/KOEF_50HZ) // 50 HZ
|
|
//#define LEVEL_2HZ (200.0/KOEF_50HZ) // 50 HZ
|
|
//#define LEVEL_1HZ (100.0/KOEF_50HZ) // 50 HZ
|
|
|
|
|
|
|
|
#define LEVEL1_FREQ_DECR 10 // 1.5 Hz îò 49.0
|
|
#define LEVEL2_FREQ_DECR 100 // 10 Hz äî 40
|
|
//#define LEVEL1_FREQ_DECR 15 // 1.5 Hz îò 48.5
|
|
//#define LEVEL2_FREQ_DECR 100 // 10 Hz äî 40
|
|
|
|
#define PLUS_LIMIT_KOEFFS 0.0001
|
|
#define MINUS_LIMIT_KOEFFS 0.05
|
|
|
|
#define MAX_COUNT_GO_UOM (FREQ_PWM*5) // 5 sec
|
|
#define SET_LIMIT_UOM 0.5
|
|
|
|
void calc_all_limit_koeffs(void)
|
|
{
|
|
_iq sum_limit, delta_freq;
|
|
|
|
static unsigned int prev_uom = 0;
|
|
static int flag_enable_go_uom = 0;
|
|
|
|
|
|
static _iq level1_freq_decr = _IQmpyI32(LEVEL_01HZ_IQ, LEVEL1_FREQ_DECR);
|
|
static _iq level2_freq_decr = _IQmpyI32(LEVEL_01HZ_IQ, LEVEL2_FREQ_DECR);
|
|
|
|
static _iq iq_set_limit_uom = _IQ(SET_LIMIT_UOM);
|
|
static unsigned int count_go_uom = 0;
|
|
|
|
static _iq iq_plus_limit_koeffs = _IQ(PLUS_LIMIT_KOEFFS);
|
|
static _iq iq_minus_limit_koeffs = _IQ(MINUS_LIMIT_KOEFFS);
|
|
|
|
static long freq_test = 30;
|
|
//*LEVEL_01HZ_IQ;
|
|
static _iq minus_delta_freq_test = _IQdiv32(LEVEL_01HZ_IQ); // 0.1/32
|
|
|
|
|
|
static int uom_test = 50;
|
|
static int prev_imit_limit_freq = 0, prev_imit_limit_uom = 0;
|
|
|
|
static _iq iq_new_uom_level_kwt = 0;
|
|
|
|
|
|
update_uom();
|
|
|
|
// temper
|
|
edrk.all_limit_koeffs.local_temper_limit = edrk.temper_limit_koeffs.sum_limit;
|
|
|
|
|
|
// uin_freq
|
|
if (edrk.Status_Ready.bits.ready_final) //|| edrk.imit_limit_freq
|
|
{
|
|
|
|
get_freq_50hz_iq();
|
|
|
|
// freq = LEVEL_50HZ - edrk.iq_freq_50hz;
|
|
|
|
if (edrk.imit_limit_freq && prev_imit_limit_freq == 0)
|
|
delta_freq_test = _IQmpyI32(LEVEL_01HZ_IQ, freq_test);
|
|
|
|
if (delta_freq_test>0)
|
|
{
|
|
if (delta_freq_test>0)
|
|
delta_freq_test -= minus_delta_freq_test;
|
|
if (delta_freq_test<0)
|
|
delta_freq_test = 0;
|
|
}
|
|
|
|
if (edrk.iq_freq_50hz>level_minimal_level_work_hz)
|
|
{
|
|
edrk.all_limit_koeffs.local_uin_freq_limit = linear_decrease_iq( (level_50hz - edrk.iq_freq_50hz),
|
|
level2_freq_decr, level1_freq_decr);
|
|
}
|
|
else
|
|
edrk.all_limit_koeffs.local_uin_freq_limit = CONST_IQ_1;
|
|
}
|
|
else
|
|
{
|
|
edrk.all_limit_koeffs.local_uin_freq_limit = CONST_IQ_1;
|
|
}
|
|
prev_imit_limit_freq = edrk.imit_limit_freq;
|
|
|
|
//
|
|
/// UOM
|
|
//
|
|
if (edrk.from_uom.ready || edrk.set_limit_uom_50)
|
|
{
|
|
if (edrk.set_limit_uom_50)
|
|
{
|
|
edrk.from_uom.level_value = uom_test;
|
|
}
|
|
|
|
if (edrk.imit_limit_uom && prev_imit_limit_uom == 0)
|
|
edrk.from_uom.level_value++;
|
|
|
|
|
|
if (prev_uom!=edrk.from_uom.level_value && edrk.from_uom.level_value > prev_uom)
|
|
{
|
|
if (edrk.iq_power_kw_full_filter_abs > edrk.from_uom.iq_level_value_kwt)
|
|
flag_enable_go_uom = 1;
|
|
}
|
|
else
|
|
flag_enable_go_uom = 0;
|
|
|
|
if (flag_enable_go_uom)
|
|
{
|
|
count_go_uom = MAX_COUNT_GO_UOM;
|
|
edrk.all_limit_koeffs.local_uom_limit = iq_set_limit_uom; // äàåì ñáðîñ
|
|
}
|
|
|
|
if (count_go_uom)
|
|
{
|
|
// äåðæèì ñáðîñ
|
|
count_go_uom--;
|
|
}
|
|
else
|
|
edrk.all_limit_koeffs.local_uom_limit = CONST_IQ_1; // âîçâðàùàåìñÿ
|
|
|
|
prev_uom = edrk.from_uom.level_value;
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
edrk.power_limit.bits.limit_from_uom_fast = 0;
|
|
edrk.all_limit_koeffs.uom_limit = CONST_IQ_1;
|
|
prev_uom = 0;
|
|
}
|
|
prev_imit_limit_uom = edrk.imit_limit_uom;
|
|
// if ()
|
|
|
|
|
|
//// temper
|
|
edrk.all_limit_koeffs.temper_limit = zad_intensiv_q(iq_plus_limit_koeffs, iq_minus_limit_koeffs,
|
|
edrk.all_limit_koeffs.temper_limit,
|
|
edrk.all_limit_koeffs.local_temper_limit);
|
|
|
|
edrk.power_limit.bits.limit_by_temper = (edrk.all_limit_koeffs.temper_limit<CONST_IQ_1) ? 1 : 0;
|
|
|
|
////// freq
|
|
edrk.all_limit_koeffs.uin_freq_limit = zad_intensiv_q(iq_plus_limit_koeffs, iq_minus_limit_koeffs,
|
|
edrk.all_limit_koeffs.uin_freq_limit,
|
|
edrk.all_limit_koeffs.local_uin_freq_limit);
|
|
|
|
edrk.power_limit.bits.limit_from_freq = (edrk.all_limit_koeffs.uin_freq_limit<CONST_IQ_1) ? 1 : 0;
|
|
|
|
|
|
///// uom
|
|
edrk.all_limit_koeffs.uom_limit = zad_intensiv_q(iq_plus_limit_koeffs, iq_minus_limit_koeffs,
|
|
edrk.all_limit_koeffs.uom_limit,
|
|
edrk.all_limit_koeffs.local_uom_limit);
|
|
|
|
edrk.power_limit.bits.limit_from_uom_fast = (edrk.all_limit_koeffs.uom_limit<CONST_IQ_1) ? 1 : 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// sum_limit
|
|
sum_limit = edrk.all_limit_koeffs.temper_limit;
|
|
sum_limit = _IQmpy(sum_limit, edrk.all_limit_koeffs.moment_limit );
|
|
sum_limit = _IQmpy(sum_limit, edrk.all_limit_koeffs.power_limit );
|
|
sum_limit = _IQmpy(sum_limit, edrk.all_limit_koeffs.uin_freq_limit );
|
|
sum_limit = _IQmpy(sum_limit, edrk.all_limit_koeffs.uom_limit );
|
|
|
|
edrk.all_limit_koeffs.sum_limit = sum_limit;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void init_all_limit_koeffs(void)
|
|
{
|
|
edrk.all_limit_koeffs.moment_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.power_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.temper_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.uin_freq_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.uom_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.sum_limit = CONST_IQ_1;
|
|
|
|
edrk.all_limit_koeffs.local_moment_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.local_power_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.local_temper_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.local_uin_freq_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.local_uom_limit = CONST_IQ_1;
|
|
edrk.all_limit_koeffs.local_sum_limit = CONST_IQ_1;
|
|
|
|
}
|
|
|
|
|