matlab_23550/Inu/Src/main/break_regul.c
2024-12-27 10:50:32 +03:00

205 lines
5.6 KiB
C

#include <adc_tools.h>
#include <break_regul.h>
#include <edrk_main.h>
#include <params_pwm24.h>
#include <PWMTools.h>
#include "IQmathLib.h"
#include "pid_reg3.h"
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#pragma DATA_SECTION(break_result_1,".fast_vars");
_iq break_result_1 = 0;
#pragma DATA_SECTION(break_result_2,".fast_vars");
_iq break_result_2 = 0;
#pragma DATA_SECTION(break_result_3,".fast_vars");
_iq break_result_3 = 0;
#pragma DATA_SECTION(break_result_4,".fast_vars");
_iq break_result_4 = 0;
#pragma DATA_SECTION(koef_Krecup,".fast_vars");
_iq koef_Krecup = 0;
#pragma DATA_SECTION(koef_Min_recup,".fast_vars");
_iq koef_Min_recup = 0;
BREAK_REGUL break_reg = BREAK_REGUL_DEFAULTS;
_iq calc_recup(_iq voltage, _iq recup_level, _iq max_recup_level);
//#pragma DATA_SECTION(pidF,".fast_vars");
//PIDREG3 pidF=PIDREG3_DEFAULTS;
void break_resistor_managment_init(unsigned int freq_pwm)
{
volatile float percent;//, percent2;
_iq iq_percent1 = 0, iq_percent2 = 0;// iq_percent3 = 0, iq_percent4 = 0;
break_reg.pwm_tics = (FREQ_INTERNAL_GENERATOR_XILINX_TMS / freq_pwm );
break_reg.pwm_minimal_tics = (float)DEF_PERIOD_MIN_MKS*1000.0*FREQ_INTERNAL_GENERATOR_XILINX_TMS/1000000000.0;
break_reg.pwm_max_tics = break_reg.pwm_tics - break_reg.pwm_minimal_tics;
//Ìèíèìàëüíûé êîýôôèöèåíò ìîäóë-öèè òîðìîçíûõ êëþ÷åé. Êîëè÷åñòâî òèêîâ â IQ15.
percent = (break_reg.pwm_max_tics * RECUP_PERCENT_MIN/100.0) * 32768.0;//Çäàñü è äàëåå âû÷èñëåíèþ â _IQ15
iq_percent1 = percent;
//Ìàêñèìàëüíûé êîýôôèöèåíò ìîäóë-öèè òîðìîçíûõ êëþ÷åé. Êîëè÷åñòâî òèêîâ â IQ15.
percent = (break_reg.pwm_max_tics * RECUP_PERCENT_MAX/100.0) * 32768.0;
iq_percent2 = percent;
//Êîýôôèöèåíò ÷òîáû ïåðåâåñòè íàïð-æåíèþ â ÇÏÒ âî âðåìþ îòêðûòèþ êëþ÷åé
koef_Krecup = _IQdiv((iq_percent1 - iq_percent2),(IQ_RECUP_LEVEL_MIN - IQ_RECUP_LEVEL_MAX));
koef_Min_recup = iq_percent1; //Ìèíèìàëüíîå âðåìþ îòêðûòèþ òîðìîçíûõ êëþ÷åé â òèêàõ
}
//int break_resistor_managment_calc(int flag_on_off)
#pragma CODE_SECTION(break_resistor_managment_calc,".fast_run");
void break_resistor_managment_calc()
{
static unsigned int break_counter = 0;//MAX_BREAK_IMPULSE + 1;
if(edrk.Discharge && edrk.from_shema_filter.bits.QTV_ON_OFF==0
&& edrk.from_shema_filter.bits.UMP_ON_OFF==0)// && edrk.to_shema.bits.QTV_ON == 0)
{
if (break_counter < MAX_BREAK_IMPULSE)
{
break_counter++;
if ((filter.iqU_1_fast > BREAK_INSENSITIVE_LEVEL_MIN)
|| edrk.ManualDischarge || edrk.NoDetectUZeroDischarge)
{
if (edrk.Obmotka1 == 0)
break_result_1 = 300;
else
break_result_1 = 0;
}
else
{
break_result_1 = 0;
}
if ((filter.iqU_2_fast > BREAK_INSENSITIVE_LEVEL_MIN)
|| edrk.ManualDischarge || edrk.NoDetectUZeroDischarge )
{
if (edrk.Obmotka2 == 0)
break_result_2 = 300;
else
break_result_2 = 0;
}
else
{
break_result_2 = 0;
}
// if (filter.iqU_3_fast < BREAK_INSENSITIVE_LEVEL_MIN)
// {
// break_result_3 = 0;
// }
// else
// {
// break_result_3 = 300;
//// break_result_3 = calc_stop_run_recup(filter.iqU_3_fast);
// }
//
// if (filter.iqU_4_fast < BREAK_INSENSITIVE_LEVEL_MIN)
// {
// break_result_4 = 0;
// }
// else
// {
// break_result_4 = 300;
//// break_result_4 = calc_stop_run_recup(filter.iqU_4_fast);
// }
if((!break_result_1 && !break_result_2 && !break_result_3 && !break_result_4)
|| (break_counter >= (MAX_BREAK_IMPULSE - 1)))
{
edrk.Discharge = 0;
break_counter = 0;
}
}
else
{
break_result_1 = 0;
break_result_2 = 0;
break_result_3 = 0;
break_result_4 = 0;
break_counter = 0;
edrk.Discharge = 0;
}
}
}
#pragma CODE_SECTION(calc_recup,".fast_run");
_iq calc_recup(_iq voltage, _iq recup_level, _iq max_recup_level)
{
if (voltage <= recup_level)
{
return 0;
}
else
{
voltage = _IQsat(voltage,max_recup_level,recup_level);
voltage = _IQmpy(koef_Krecup,voltage - recup_level) + koef_Min_recup;
return voltage >> 15;
}
}
#pragma CODE_SECTION(break_resistor_recup_calc,".fast_run");
void break_resistor_recup_calc(_iq Uzpt_nominal)
{
_iq Uzpt_start_recup = Uzpt_nominal + IQ_DELTA_U_START_RECUP;
_iq Uzpt_max_open_break_keys = Uzpt_nominal + IQ_DELTA_U_MAX_OPEN_BREAK_KEYS;
if (/*edrk.Go &&*/ (edrk.SborFinishOk || edrk.Status_Ready.bits.ImitationReady2) )
{
break_result_1 = calc_recup(filter.iqU_1_fast, Uzpt_start_recup, Uzpt_max_open_break_keys);
break_result_2 = calc_recup(filter.iqU_2_fast, Uzpt_start_recup, Uzpt_max_open_break_keys);
}
}
#pragma CODE_SECTION(break_resistor_managment_update,".fast_run");
void break_resistor_managment_update()
{
if (break_result_1 < break_reg.pwm_minimal_tics)
break_result_1 = 0;
if (break_result_2 < break_reg.pwm_minimal_tics)
break_result_2 = 0;
// if (break_result_3 < break_reg.pwm_minimal_tics)
// break_result_3 = 0;
//
// if (break_result_4 < break_reg.pwm_minimal_tics)
// break_result_4 = 0;
if (break_result_1 > break_reg.pwm_max_tics)
break_result_1 = break_reg.pwm_max_tics;
if (break_result_2 > break_reg.pwm_max_tics)
break_result_2 = break_reg.pwm_max_tics;
// if (break_result_3 > break_reg.pwm_max_tics)
// break_result_3 = break_reg.pwm_max_tics;
//
// if (break_result_4 > break_reg.pwm_max_tics)
// break_result_4 = break_reg.pwm_max_tics;
}
//#pragma CODE_SECTION(break_resistor_set_closed,".fast_run");
void break_resistor_set_closed()
{
break_result_1 = 0;
break_result_2 = 0;
break_result_3 = 0;
break_result_4 = 0;
}