matlab_23550/Inu/Src/main/alg_simple_scalar.c

593 lines
15 KiB
C
Raw Normal View History

2024-12-27 10:50:32 +03:00
/*
* alg_simple_scalar.c
*
* Created on: 26 <EFBFBD><EFBFBD><EFBFBD>. 2020 <EFBFBD>.
* Author: Yura
*/
#include <alg_simple_scalar.h>
#include <edrk_main.h>
#include <log_to_mem.h>
2024-12-27 10:50:32 +03:00
#include <master_slave.h>
#include <math.h>
#include <params_alg.h>
#include <params_norma.h>
#include <project.h>
#include "log_to_mem.h"
2024-12-27 10:50:32 +03:00
#include "IQmathLib.h"
#include "math_pi.h"
#include "mathlib.h"
#include "params_pwm24.h"
2024-12-27 10:50:32 +03:00
#pragma DATA_SECTION(simple_scalar1,".slow_vars");
ALG_SIMPLE_SCALAR simple_scalar1 = ALG_SIMPLE_SCALAR_DEFAULT;
2024-12-27 10:50:32 +03:00
void init_simple_scalar(void)
{
simple_scalar1.mzz_add_1 = _IQ(MZZ_ADD_1/NORMA_MZZ);
simple_scalar1.mzz_add_2 = _IQ(MZZ_ADD_2/NORMA_MZZ);
simple_scalar1.poluses = _IQ(POLUS);
simple_scalar1.iq_mzz_max_for_fzad = _IQ(1000.0/NORMA_MZZ);
simple_scalar1.powerzad_add = _IQ(POWERZAD_ADD_MAX);
simple_scalar1.powerzad_dec = _IQ(POWERZAD_DEC);
simple_scalar1.k_freq_for_pid = _IQ(1.0);
2024-12-27 10:50:32 +03:00
simple_scalar1.k_freq_for_pid = _IQ(450.0/FREQ_PWM);
simple_scalar1.iq_add_kp_df = _IQ(ADD_KP_DF);
simple_scalar1.iq_add_ki_df = _IQ(ADD_KI_DF);
simple_scalar1.min_mzz_for_df = _IQ(MIN_MZZ_FOR_DF/NORMA_MZZ);
simple_scalar1.pidF_Kp = _IQ(PID_KP_F);
simple_scalar1.pidF_Ki = _IQ(PID_KI_F);
simple_scalar1.pidIm1.Kp=_IQ(PID_KP_IM);
simple_scalar1.pidIm1.Ki=_IQ(PID_KI_IM);
simple_scalar1.pidIm_Ki = simple_scalar1.pidIm1.Ki;
simple_scalar1.pidIm1.Kc=_IQ(PID_KC_IM);
simple_scalar1.pidIm1.Kd=_IQ(PID_KD_IM);
simple_scalar1.pidIm1.OutMax=_IQ(K_STATOR_MAX);
simple_scalar1.pidIm1.OutMin=_IQ(0);
2024-12-27 10:50:32 +03:00
//////////////
simple_scalar1.pidF.Kp=_IQ(PID_KP_F);
simple_scalar1.pidF.Ki=_IQ(PID_KI_F);
simple_scalar1.pidF.Kc=_IQ(PID_KC_F);
simple_scalar1.pidF.Kd=_IQ(PID_KD_F);
simple_scalar1.pidF.OutMax=_IQ(500/NORMA_MZZ);
simple_scalar1.pidF.OutMin=_IQ(0);
// iq_MAX_DELTA_pidF = _IQ(MAX_DELTA_pidF/NORMA_WROTOR);
/////////////////////////
// simple_scalar1.pidPower_Kp = _IQ(PID_KP_POWER);
// simple_scalar1.pidPower_Ki = _IQ(PID_KI_POWER);
// iq_add_kp_dpower = _IQ(ADD_KP_DPOWER);
// iq_add_ki_dpower = _IQ(ADD_KI_DPOWER);
simple_scalar1.pidPower.Kp=_IQ(PID_KP_POWER);
simple_scalar1.pidPower.Ki=_IQ(PID_KI_POWER);
simple_scalar1.pidPower.Ki = _IQmpy(simple_scalar1.pidPower.Ki, simple_scalar1.k_freq_for_pid); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ki <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
simple_scalar1.pidPower.Kc=_IQ(PID_KC_POWER);
simple_scalar1.pidPower.Kd=_IQ(PID_KD_POWER);
simple_scalar1.pidPower.OutMax=_IQ(500/NORMA_MZZ);
simple_scalar1.pidPower.OutMin=_IQ(0);
simple_scalar1.iq_spad_k = _IQ(0.993); //0.993 ~ 0.4 sek <20><> 5%
// <20><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
simple_scalar1.min_bpsi = _IQ(0.05/NORMA_FROTOR);
2024-12-27 10:50:32 +03:00
}
/***************************************************************/
/* <20>/<2F> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 -
vector_moment(real Frot, - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
real fzad, - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
real mzz_zad, - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
real *Fz, - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>y <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
real *Uz1, - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD><EFBFBD> <EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
real *Uz2) - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD><EFBFBD> <EFBFBD> 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> fzad <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> = 0.5
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD><EFBFBD><EFBFBD>y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 3-<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y <EFBFBD><EFBFBD>y<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/****************************************************************/
//#pragma CODE_SECTION(simple_scalar,".fast_run");
void simple_scalar(int n_alg, int n_wind_pump,
_iq Frot_pid,_iq Frot, _iq fzad,
2024-12-27 10:50:32 +03:00
_iq iqKoefOgran,
_iq mzz_zad, _iq bpsi_const,
_iq iqIm, _iq iqUin, _iq Iin, _iq powerzad, _iq power_pid,
_iq Izad_from_master, int master,
_iq *Fz, _iq *Uz1, _iq *Uz2, _iq *Izad_out)
2024-12-27 10:50:32 +03:00
{
_iq mzz, dF, dI1, Izad, Uz_t1, Kpred_Ip, pred_Ip;//, znak_moment;
_iq dI2, Uz_t2;
_iq pkk=0,ikk=0;
_iq Im_regul=0;
static _iq bpsi=0;
// static _iq IQ_POLUS=0;
static _iq mzz_zad_int=0;
static _iq mzzi=0;
static _iq I1_i=0;
static _iq I2_i=0;
static _iq Im1=0;
static _iq Im2=0;
static _iq Uze_t1=0;
static _iq Uze_t2=0;
// static _iq fzad_ogr=0;
// static _iq koef_Uz_t_filter=0;
static _iq dI1_prev=0;
static _iq Uz_t1_prev=0;
static _iq dF_prev = 0;
static _iq mzz_prev = 0;
// static _iq mzz_add_1, mzz_add_2;
static _iq fzad_int=0;//, fzad_add_max;//,iq_mzz_max_for_fzad ;
static _iq fzad_add=0; //fzad_dec
_iq halfIm1, halfIm2;
static _iq powerzad_int=0, powerzad_add_max=0 ;
2024-12-27 10:50:32 +03:00
//powerzad_dec powerzad_add
// static _iq koef_bpsi=0;
// static _iq min_bpsi=0;
static int flag_uz_t1=0;
// static _iq correct_err=0;
// static _iq iq_dF_min1=0;
// static _iq iq_dF_min2=0;
_iq pred_dF,Kpred_dF;
static _iq dF_PREDEL_LEVEL2 = 0,dF_PREDEL_LEVEL1=0;
_iq Uze_ogr=0;
// static _iq iq_spad_k=1;
static _iq myq_temp=0;
// static _iq mzz_int_level1_on_F=0;
// mzz = _IQsat(mzz,mzz_zad_int,0);
simple_scalar1.mzz_zad = mzz_zad;
2024-12-27 10:50:32 +03:00
simple_scalar1.Izad_from_master = Izad_from_master;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD><EFBFBD> */
if ( (Frot==0) && (fzad==0) )
{
mzzi = 0;
fzad_int = 0;
powerzad_int = 0;
}
if (mzz_zad==0)
{
mzz=0;
I1_i=0;
mzzi=0;
mzz_zad_int = 0;
fzad_int = 0;
powerzad_int = 0;
simple_scalar1.pidIm1.Up1 = 0;
simple_scalar1.pidIm1.Ui = 0;
simple_scalar1.pidF.Up1 = 0;
simple_scalar1.pidF.Ui = 0;
simple_scalar1.pidPower.Up1 = 0;
simple_scalar1.pidPower.Ui = 0;
Uze_t1=0;
Uze_t2=0;
dI1_prev = 0;
Uz_t1_prev = 0;
dF_prev = 0;
mzz_prev = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> fzad
fzad_add = _IQ(FZAD_ADD_MAX/NORMA_FROTOR);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> fzad <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// fzad_dec = _IQ(FZAD_DEC/NORMA_FROTOR);
//
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mzz_max
// iq_mzz_max_for_fzad = _IQ(1000.0/NORMA_MZZ);
// <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Uz_t_filter
// koef_Uz_t_filter = _IQ(0.001/0.5); //0.0333
// <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> mzz
// koef_bpsi = _IQ((0.6/NORMA_WROTOR)/(200.0/NORMA_MZZ));
flag_uz_t1=0;
// <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// correct_err = _IQ(2.5/NORMA_WROTOR);
// <20><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// iq_dF_min1 = _IQ(1.0/NORMA_WROTOR);
// iq_dF_min2 = _IQ(1.5/NORMA_WROTOR);
// <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Km
// iq_spad_k = _IQ(0.993); //0.993 ~ 0.4 sek <20><> 5%
// iq_spad_k = _IQ(0.9965); //0.993 ~ 0.4 sek <20><> 5%
// dF_PREDEL_LEVEL1 = _IQ(0.5/NORMA_WROTOR);
// dF_PREDEL_LEVEL2 = _IQ(1.5/NORMA_WROTOR);
// mzz_int_level1_on_F = _IQ(1.0/NORMA_WROTOR);
// mzz_int_level2_on_F = _IQ(1.5/NORMA_WROTOR);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (n_alg==1)
{
mzz_zad_int = zad_intensiv_q(simple_scalar1.mzz_add_2, simple_scalar1.mzz_add_2, mzz_zad_int, mzz_zad);
// if (Frot_pid>mzz_int_level1_on_F)
// mzz_zad_int = zad_intensiv_q(mzz_add_1, mzz_add_1, mzz_zad_int, mzz_zad);
// else
// mzz_zad_int = zad_intensiv_q(mzz_add_2, mzz_add_2, mzz_zad_int, mzz_zad);
}
if (n_alg==2)
mzz_zad_int = zad_intensiv_q(simple_scalar1.mzz_add_2, simple_scalar1.mzz_add_2, mzz_zad_int, mzz_zad);
// myq_temp = _IQdiv(mzz_zad, simple_scalar1.iq_mzz_max_for_fzad);
// myq_temp = _IQmpy( myq_temp, fzad_add_max);
2024-12-27 10:50:32 +03:00
// fzad_add = myq_temp;
2024-12-27 10:50:32 +03:00
fzad_int = zad_intensiv_q(fzad_add, fzad_add, fzad_int, fzad);
2024-12-27 10:50:32 +03:00
powerzad_int = zad_intensiv_q(simple_scalar1.powerzad_add, simple_scalar1.powerzad_add, powerzad_int, powerzad);
if (n_alg==1)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><79><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if (mzz_zad_int>=0)
{
dF = fzad_int - Frot_pid;
2024-12-27 10:50:32 +03:00
////////// Power PI //////////////
simple_scalar1.pidPower.OutMax=mzz_zad;
2024-12-27 10:50:32 +03:00
// pidPower.Kp = _IQmpy( _IQdiv(iq_add_kp_dpower, _IQsat(mzz_zad,mzz_zad,MIN_MZZ_FOR_DPOWER)), pidPower_Kp);
// pidPower.Ki = _IQmpy( _IQdiv(iq_add_ki_dpower, _IQsat(mzz_zad,mzz_zad,MIN_MZZ_FOR_DPOWER)), pidPower_Ki);
// simple_scalar1.pidPower.Ki = _IQmpy(simple_scalar1.pidPower.Ki, simple_scalar1.k_freq_for_pid);
simple_scalar1.pidPower.Ref = powerzad_int;
2024-12-27 10:50:32 +03:00
simple_scalar1.pidPower.Fdb = power_pid;
2024-12-27 10:50:32 +03:00
simple_scalar1.pidPower.calc(&simple_scalar1.pidPower);
// Saturate the integral output
if (simple_scalar1.pidPower.Ui > simple_scalar1.pidPower.OutMax)
simple_scalar1.pidPower.Ui = simple_scalar1.pidPower.OutMax;
else if (simple_scalar1.pidPower.Ui < simple_scalar1.pidPower.OutMin)
simple_scalar1.pidPower.Ui = simple_scalar1.pidPower.OutMin;
//////////////////////////////
//////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// pidF.OutMax=mzz_zad_int;
// <20><><EFBFBD> <20><><EFBFBD>
simple_scalar1.pidF.OutMax = simple_scalar1.pidPower.Out;
2024-12-27 10:50:32 +03:00
// pidF.OutMax = mzz_zad;
simple_scalar1.pidF.Kp = _IQmpy( _IQdiv(simple_scalar1.iq_add_kp_df, _IQsat(mzz_zad,mzz_zad,simple_scalar1.min_mzz_for_df)), simple_scalar1.pidF_Kp);
simple_scalar1.pidF.Ki = _IQmpy( _IQdiv(simple_scalar1.iq_add_ki_df, _IQsat(mzz_zad,mzz_zad,simple_scalar1.min_mzz_for_df)), simple_scalar1.pidF_Ki);
2024-12-27 10:50:32 +03:00
simple_scalar1.pidF.Ki = _IQmpy(simple_scalar1.pidF.Ki,simple_scalar1.k_freq_for_pid);
/////////////////////////
// if (_IQabs(dF)<iq_dF_min1)
// {
// dF=iq_dF_min1;
// m.m1.bit.w_rotor_ust = 1;
// }
//
// if (_IQabs(dF)>iq_dF_min2)
// {
// m.m1.bit.w_rotor_ust = 0;
// }
//////////////////////////////////
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dF
simple_scalar1.pidF.Ref = fzad_int;
2024-12-27 10:50:32 +03:00
simple_scalar1.pidF.Fdb = Frot_pid;
2024-12-27 10:50:32 +03:00
simple_scalar1.pidF.calc(&simple_scalar1.pidF);
// Saturate the integral output
if (simple_scalar1.pidF.Ui > simple_scalar1.pidF.OutMax)
simple_scalar1.pidF.Ui = simple_scalar1.pidF.OutMax;
else if (simple_scalar1.pidF.Ui < simple_scalar1.pidF.OutMin)
simple_scalar1.pidF.Ui = simple_scalar1.pidF.OutMin;
/////////////////////////////////////
mzz = simple_scalar1.pidF.Out;
2024-12-27 10:50:32 +03:00
///////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>
// mzz = zad_intensiv_q(mzz_add_2, mzz_add_2, mzz, pidF.Out);
// mzzi = zad_intensiv_q(mzz_add_2, mzz_add_2, mzzi, mzz);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mzz
mzz = _IQsat(mzz,mzz_zad_int,0);
}
else
{
mzz = 0;
}
}
if (n_alg==2)
{
mzz = mzz_zad_int;
}
if (master == MODE_SLAVE)
{
mzz = Izad_from_master;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mzz
mzz = _IQsat(mzz,mzz_zad_int,0);
}
*Izad_out = mzz;
/* <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y I_PREDEL_LEVEL1
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*
pred_Ip = (filter.I_3+filter.I_6)-I_PREDEL_LEVEL1;
if (pred_Ip<0)
Kpred_Ip=0.0; // <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
else
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pred_Ip>=(I_PREDEL_LEVEL2-I_PREDEL_LEVEL1))
Kpred_Ip=1;
else
Kpred_Ip = pred_Ip/(I_PREDEL_LEVEL2-I_PREDEL_LEVEL1);
}
// <20> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Izad = mzz * (1-Kpred_Ip);
*/
iqKoefOgran = _IQsat(iqKoefOgran,CONST_IQ_1,0);
Izad = _IQmpy(mzz, iqKoefOgran);
2024-12-27 10:50:32 +03:00
// if ((n_alg==1) || (n_alg==2))
// {
//
// Im1 = iqIm_1;
// Im2 = iqIm_2;
//
// if (n_wind_pump==0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// {
//
// halfIm1 = Im1 >> 1;
// halfIm2 = Im2 >> 1;
//
// if (Im1>halfIm2) //if (Im1>IQdiv(Im2,_IQ(2.0)))
// {
// Im_regul=Im1;
// simple_scalar1.UpravIm1=1;
// simple_scalar1.UpravIm2=0;
// }
// else
// {
// if (Im2>halfIm1)
// {
// Im_regul=Im2;
// simple_scalar1.UpravIm2=1;
// simple_scalar1.UpravIm1=0;
// }
// else
// {
// Im_regul=Im1; //Im1
// simple_scalar1.UpravIm1=1;//1
// simple_scalar1.UpravIm2=0;//0
// }
// }
// }
//
// if (n_wind_pump==1) // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> 2-<2D><>
// {
// Im_regul=Im2;
// simple_scalar1.UpravIm1=0;
// simple_scalar1.UpravIm2=1;
// }
//
// if (n_wind_pump==2) // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> 1-<2D><>
// {
// Im_regul=Im1;
// simple_scalar1.UpravIm1=1;
// simple_scalar1.UpravIm2=0;
// }
Im_regul = iqIm;
simple_scalar1.Im_regul = Im_regul;
simple_scalar1.Izad = Izad;
dI1 = (Izad - Im_regul );
simple_scalar1.pidIm1.Ki = simple_scalar1.pidIm_Ki;
simple_scalar1.pidIm1.Ki = _IQmpy(simple_scalar1.pidIm1.Ki,simple_scalar1.k_freq_for_pid);
simple_scalar1.pidIm1.Ref = _IQdiv(Izad,iqUin);
simple_scalar1.pidIm1.Fdb = _IQdiv(Im_regul,iqUin);
simple_scalar1.pidIm1.calc(&simple_scalar1.pidIm1);
Uz_t1 = simple_scalar1.pidIm1.Out;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Km
if (Uz_t1<Uze_t1)
{
Uze_ogr =_IQmpy(Uze_t1, simple_scalar1.iq_spad_k);
if (Uze_ogr>Uz_t1) Uze_t1 = Uze_ogr;
else
Uze_t1 = Uz_t1;
}
else
{
Uze_t1 = Uz_t1;
}
Uze_t1 = _IQsat(Uze_t1,simple_scalar1.pidIm1.OutMax,0);
2024-12-27 10:50:32 +03:00
// }
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
*Uz1 = Uze_t1;
*Uz2 = Uze_t1;
bpsi = bpsi_const;
2024-12-27 10:50:32 +03:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. ~ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// bpsi = _IQmpy(koef_bpsi,mzz);
bpsi = _IQsat(bpsi,bpsi_const, simple_scalar1.min_bpsi);
2024-12-27 10:50:32 +03:00
#ifdef BAN_ROTOR_REVERS_DIRECT
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (analog.filter_direct_rotor==-1)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*Fz = bpsi;
else
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*Fz = _IQmpy(Frot,IQ_POLUS) + bpsi;
#else
*Fz = _IQmpy(Frot,simple_scalar1.poluses) + bpsi; /* bpsi - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>y <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y */
2024-12-27 10:50:32 +03:00
#endif
// if (n_alg==2)
// {
//
// *Fz = fzad_provorot;
// /* bpsi - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>y <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>y */
// }
// logpar.log1 = (int16)(_IQtoIQ15(Izad));
// logpar.log2 = (int16)(_IQtoIQ15(mzz_zad));//(int16)(_IQtoIQ15(Uze_t1));
// logpar.log3 = (int16)(_IQtoIQ15(fzad_int));
// logpar.log4 = (int16)(_IQtoIQ15(simple_scalar1.pidF.Ui));
// logpar.log5 = (int16)(_IQtoIQ14(simple_scalar1.pidF.Up));
// logpar.log6 = (int16)(_IQtoIQ14(simple_scalar1.pidF.SatErr));
// logpar.log7 = (int16)(_IQtoIQ15(mzz_zad_int));
// logpar.log8 = (int16)(_IQtoIQ15(simple_scalar1.pidIm1.Ref));
// logpar.log9 = (int16)(_IQtoIQ15(simple_scalar1.pidIm1.Fdb));
// logpar.log10 = (int16)(_IQtoIQ15(simple_scalar1.pidIm1.Ui));
// logpar.log11 = (int16)(_IQtoIQ15(simple_scalar1.pidIm1.Up));
2024-12-27 10:50:32 +03:00
}