matlab_23550/Inu/Src/N12_Libs/mathlib.c

438 lines
8.8 KiB
C
Raw Normal View History

/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> (<EFBFBD>) 2002 <EFBFBD>.
Processor: TMS320C32
Filename: vector_troll.h
<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
Edit date: 04-12-02
Function:
Revisions:
*/
#include "IQmathLib.h"
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include <math.h>
#include "mathlib.h"
#include "params_norma.h"
#include "math_pi.h"
#include "params_pwm24.h"
#include <math.h>
#include "params_norma.h"
_iq SQRT_32 = _IQ(0.8660254037844);
_iq CONST_23 = _IQ(2.0/3.0);
_iq CONST_15 = _IQ(1.5);
#define real float
float my_satur_float(float Input, float Positive, float Negative, float DeadZone)
{
if (fabs(DeadZone)>0.000001 && Input>-DeadZone && Input<DeadZone)
Input = 0;
else
if (Input>=Positive) Input=Positive;
else
if (Input<=Negative) Input=Negative;
return Input;
}
int my_satur_int(int Input, int Positive, int Negative, int DeadZone)
{
if (DeadZone!=0 && Input>-DeadZone && Input<DeadZone)
Input = 0;
else
if (Input>=Positive) Input=Positive;
else
if (Input<=Negative) Input=Negative;
return Input;
}
long my_satur_long(long Input, long Positive, long Negative, long DeadZone)
{
if (DeadZone!=0 && Input>-DeadZone && Input<DeadZone)
Input = 0;
else
if (Input>=Positive) Input=Positive;
else
if (Input<=Negative) Input=Negative;
return Input;
}
/*
real pid_regul(real Kp_regul, real Tperiod_regul, real Minimum, real Maximum,
real yk, real *uk1, real *yk1, real *yzad, real *ek, real *ek1, real *ek2,
real d0, real d1, real d2)
{
real uk;
*ek = - yk + *yzad;
uk = *uk1 + Kp_regul * ( d0 * *ek + d1 * *ek1 + d2 * *ek2 );
if (uk>Maximum) uk=Maximum;
if (uk<Minimum) uk=Minimum;
*yk1 = yk;
*ek2 = *ek1;
*ek1 = *ek;
*uk1 = uk;
return uk;
}
real pid_regul2(real Kp_regul, real Tperiod_regul, real Minimum, real Maximum,
real yk, real *uk1, real *yk1, real *yk2, real *yzad,
real d0, real d1, real d2)
{
real uk;
uk = *uk1 + Kp_regul * ( *yk1 - yk + d1 * ( *yzad - yk ) + d2 * ( 2 * *yk1 - *yk2 - yk ) );
if (uk>Maximum) uk=Maximum;
if (uk<Minimum) uk=Minimum;
*yk2 = *yk1;
*yk1 = yk;
*uk1 = uk;
return uk;
}
real pi_regul(real Kp_regul, real Tintegral_regul, real Tperiod_regul, real Minimum, real Maximum, real InpVar, real *VarIntegral)
{
real VarProp, VarOut;
*VarIntegral += InpVar*Tperiod_regul/Tintegral_regul;
VarProp = InpVar*Kp_regul;
if (*VarIntegral>Maximum) *VarIntegral=Maximum;
if (*VarIntegral<Minimum) *VarIntegral=Minimum;
VarOut = *VarIntegral+VarProp;
if (VarOut>Maximum) VarOut=Maximum;
if (VarOut<Minimum) VarOut=Minimum;
return VarOut;
}
real exp_regul(real Tperiod_regul, real Texp_regul, real InpVarCurr, real InpVarInstant)
{
real VarOut;
VarOut = InpVarCurr + Tperiod_regul*(InpVarInstant-InpVarCurr)/Texp_regul;
return VarOut;
}
*/
float zad_intensiv(float StepP, float StepN, float InpVarCurr, float InpVarInstant)
{
float deltaVar, VarOut;
deltaVar = InpVarInstant-InpVarCurr;
if ((deltaVar>StepP) || (deltaVar<-StepN))
{
if (deltaVar>0) InpVarCurr += StepP;
else InpVarCurr -= StepN;
}
else
InpVarCurr=InpVarInstant;
VarOut = InpVarCurr;
return VarOut;
}
#pragma CODE_SECTION(zad_intensiv_q,".fast_run");
_iq zad_intensiv_q(_iq StepP, _iq StepN, _iq InpVarCurr, _iq InpVarInstant)
{
_iq deltaVar, VarOut;
deltaVar = InpVarInstant-InpVarCurr;
if ((deltaVar>StepP) || (deltaVar<-StepN))
{
if (deltaVar>0) InpVarCurr += StepP;
else InpVarCurr -= StepN;
}
else
InpVarCurr=InpVarInstant;
VarOut = InpVarCurr;
return VarOut;
}
real pi_regul3(real Kp_regul, real ki_regul, real Tperiod_regul, real Minimum, real Maximum,
real InpVar, real *InpVarPrev, real *OutVarPrev)
{
real VarOut;
VarOut = Kp_regul*(ki_regul/Kp_regul*Tperiod_regul/2.0+1)*InpVar + Kp_regul*(ki_regul/Kp_regul*Tperiod_regul/2.0-1) * (*InpVarPrev) + *OutVarPrev;
if (VarOut>Maximum) VarOut=Maximum;
if (VarOut<Minimum) VarOut=Minimum;
*InpVarPrev = InpVar;
*OutVarPrev = VarOut;
return VarOut;
}
real pi_regul4(real Kp_regul, real ki_regul, real Tperiod_regul, real Minimum, real Maximum,
real InpVar, real *InpVarPrev, real *OutVarPrev)
{
real VarOut;
VarOut = Kp_regul*InpVar + Kp_regul*(ki_regul/Kp_regul*Tperiod_regul-1) * (*InpVarPrev) + *OutVarPrev;
if (VarOut>Maximum) VarOut=Maximum;
if (VarOut<Minimum) VarOut=Minimum;
*InpVarPrev = InpVar;
*OutVarPrev = VarOut;
return VarOut;
}
/********************************************************************/
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>y <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> */
/********************************************************************/
#pragma CODE_SECTION(im_calc,".fast_run");
_iq im_calc( _iq ia, _iq ib, _iq ic)
{
_iq isa,isb, t;
isa = _IQmpy(CONST_15,ia);
isb = _IQmpy(SQRT_32,ib-ic );
// ( _IQ19mpy(SQRT_32, _IQ15toIQ19(ib)) - _IQ15mpy(SQRT_32, _IQ15toIQ19(ic)) );
t = _IQmag(isa,isb);
t = _IQmpy(CONST_23,t);
return (t);
}
float exp_regul(float Tperiod_regul, float Texp_regul, float InpVarCurr, float InpVarInstant)
{
float VarOut;
VarOut = InpVarCurr + Tperiod_regul*(InpVarInstant-InpVarCurr)/Texp_regul;
return VarOut;
}
_iq calc_rms_array_simple(RMS_CALC_ARRAY *v) {
_iq summ_squares = 0;
int i = 0;
if (v->data_array == 0) return 0;
for (i = 0; i < v->size_array; ++i) {
summ_squares += _IQmpy(v->data_array[i], v->data_array[i]);
}
return _IQsqrt(summ_squares / v->size_array);
}
//_iq calc_rms_array_var_period(RMS_CALC_ARRAY_THINNING *v) {
// _iq summ_squares = 0;
// int i = 0;
// int count_elem = 0;
// if (v->signal_period > v->size_array) {
// v->signal_period = v->size_array;
// }
// count_elem = v->signal_period;
// i = v->last_elem_position;
// while (count_elem > 0) {
// summ_squares += _IQmpy(v->data_array[i], v->data_array[i]);
// i -= 1;
// if (i < 0) { i = v->size_array - 1; }
// count_elem -= 1;
//
// }
// v->Out_rms = _IQsqrt(summ_squares / v->signal_period);
// return v->Out_rms;
//}
_iq calc_rms_array_var_period_IQ15(RMS_CALC_ARRAY_THINNING *v) {
_iq16 summ_squares = 0;
int i = 0;
int count_elem = 0;
if (v->data_array == 0) {
return 0;
}
if (v->signal_period > v->size_array) {
v->signal_period = v->size_array;
}
count_elem = v->signal_period;
i = v->last_elem_position;
while (count_elem > 0) {
summ_squares += 0;//_IQ15mpy(v->data_array[i], v->data_array[i]);
i -= 1;
if (i < 0) { i = v->size_array - 1; }
count_elem -= 1;
}
v->Out_rms =_IQ15toIQ(_IQ15sqrt(summ_squares / v->signal_period));
return v->Out_rms;
}
float fast_round(float x)
{
float d;
long i;
i = (long)x;
if (x<0)
{
d = i - x;
if (d>=0.5)
i = i - 1;
}
else
{
d = x - i;
if (d>=0.5)
i = i + 1;
}
return (float)i;
}
float fast_round_with_delta(float prev, float x, float delta)
{
float d;
long i;
i = (long)x;
if (x<0)
{
d = i - x;
if (d>=0.5)
i = i - 1;
}
else
{
d = x - i;
if (d>=0.5)
i = i + 1;
}
if (fabs(prev-x)>=delta)
return (float)i;
else
return (float)prev;
}
float fast_round_with_limiter(float x, float lim)
{
float d;
long i;
if (fabs(x)<=lim)
return 0;
i = (long)x;
if (x<0)
{
d = i - x;
if (d>=0.5)
i = i - 1;
}
else
{
d = x - i;
if (d>=0.5)
i = i + 1;
}
return (float)i;
}
#pragma CODE_SECTION(calc_rms,".fast_run");
_iq calc_rms(_iq input, _iq input_prev, _iq freq_signal)
{
static _iq pi_pwm = _IQ(PI*NORMA_FROTOR/(FREQ_PWM/5.0));
_iq cosw, sinw, wdt, y2, z1, z2, z3, y;
wdt = _IQmpy(pi_pwm,freq_signal);
sinw = _IQsinPU(wdt);
cosw = _IQcosPU(wdt);
if (cosw==0)
return 0;
z1 = input_prev - _IQmpy(input,cosw);
// z2 = sinw;
z3 = _IQdiv(z1,sinw);
y2 = _IQmpy(input,input)+_IQmpy(z3,z3);
// cosw = _IQsin();
y = _IQsqrt(y2);
return y;
}