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>
2025-01-15 13:39:33 +03:00
# 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>
2025-01-15 13:39:33 +03:00
# 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"
2025-01-15 13:39:33 +03:00
2024-12-27 10:50:32 +03:00
# pragma DATA_SECTION(simple_scalar1,".slow_vars");
ALG_SIMPLE_SCALAR simple_scalar1 = ALG_SIMPLE_SCALAR_DEFAULT ;
2025-01-15 13:39:33 +03:00
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 ) ;
2025-01-15 13:39:33 +03:00
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 ) ;
2025-01-15 13:39:33 +03:00
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>
2025-01-15 13:39:33 +03:00
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");
2025-01-15 13:39:33 +03:00
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 ,
2025-01-15 13:39:33 +03:00
_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 ;
2025-01-15 13:39:33 +03:00
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);
2025-01-15 13:39:33 +03:00
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);
2025-01-15 13:39:33 +03:00
// myq_temp = _IQmpy( myq_temp, fzad_add_max);
2024-12-27 10:50:32 +03:00
2025-01-15 13:39:33 +03:00
// fzad_add = myq_temp;
2024-12-27 10:50:32 +03:00
2025-01-15 13:39:33 +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 )
{
2025-01-15 13:39:33 +03:00
dF = fzad_int - Frot_pid ;
2024-12-27 10:50:32 +03:00
////////// Power PI //////////////
2025-01-15 13:39:33 +03:00
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);
2025-01-15 13:39:33 +03:00
simple_scalar1 . pidPower . Ref = powerzad_int ;
2024-12-27 10:50:32 +03:00
2025-01-15 13:39:33 +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>
2025-01-15 13:39:33 +03:00
simple_scalar1 . pidF . OutMax = simple_scalar1 . pidPower . Out ;
2024-12-27 10:50:32 +03:00
// pidF.OutMax = mzz_zad;
2025-01-15 13:39:33 +03:00
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
2025-01-15 13:39:33 +03:00
simple_scalar1 . pidF . Ref = fzad_int ;
2024-12-27 10:50:32 +03:00
2025-01-15 13:39:33 +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 ;
/////////////////////////////////////
2025-01-15 13:39:33 +03:00
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 ) ;
*/
2025-01-15 13:39:33 +03:00
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 ;
}
2025-01-15 13:39:33 +03:00
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 ;
2025-01-15 13:39:33 +03:00
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);
2025-01-15 13:39:33 +03:00
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
2025-01-15 13:39:33 +03:00
* 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 */
// }
2025-01-15 13:39:33 +03:00
// 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
}