113 lines
2.2 KiB
C++
113 lines
2.2 KiB
C++
#pragma once
|
|
|
|
class Phase
|
|
{
|
|
public:
|
|
Phase(const double v, const double r1, const double r2, const double l, const double c1) : V(v), R1(r1), R2(r2), L(l), C1(c1) {}
|
|
|
|
static double Freq;
|
|
static long Update;
|
|
static double Quant;
|
|
|
|
private:
|
|
double V;
|
|
double R1;
|
|
double R2;
|
|
double L;
|
|
double C1;
|
|
|
|
double Cf = 0;
|
|
double Rf = 0;
|
|
|
|
double Integ_L = 0;
|
|
double Integ_C1 = 0;
|
|
|
|
double Integ_Cf = 0;
|
|
|
|
static double C2;
|
|
static double Buffer_C2;
|
|
static double Integ_C2;
|
|
|
|
static long Count;
|
|
|
|
static unsigned long Step;
|
|
|
|
public:
|
|
double Current;
|
|
double Current_Mid;
|
|
double Voltage;
|
|
static double Buffer;
|
|
|
|
public:
|
|
|
|
void filter(const double r, const double c) { Cf = c; Rf = r; }
|
|
void set(const double c2);
|
|
void convert(const bool on, const long compare);
|
|
|
|
public:
|
|
static unsigned long buffer();
|
|
|
|
public:
|
|
void update(const double v, const double r1, const double r2, const double l, const double c1) { V = v; R1 = r1; R2 = r2; L = l; C1 = c1; }
|
|
static void freq(double f, long u) { Freq = f; Update = u; Quant = (Freq * Update); }
|
|
};
|
|
|
|
double Phase::Freq = 84000.0;
|
|
long Phase::Update = 100; // 100%
|
|
double Phase::Quant = (Freq * Update);
|
|
|
|
double Phase::C2;
|
|
double Phase::Buffer_C2;
|
|
double Phase::Integ_C2;
|
|
long Phase::Count;
|
|
double Phase::Buffer;
|
|
unsigned long Phase::Step;
|
|
|
|
void Phase::set(const double c2)
|
|
{
|
|
Integ_L = 0;
|
|
Integ_C1 = 0;
|
|
C2 = c2;
|
|
Buffer_C2 = 0;
|
|
Integ_C2 = 0;
|
|
Count = 0;
|
|
Step = 0;
|
|
}
|
|
|
|
void Phase::convert(const bool on, const long compare)
|
|
{
|
|
bool pulse = compare > Count;
|
|
//---
|
|
double var1 = V - (Integ_L * R1) - Integ_C1;
|
|
var1 = var1 / (R1 * C1);
|
|
Integ_C1 += var1 / Quant;
|
|
Voltage = Integ_C1;
|
|
//---
|
|
double var2 = on ? (pulse ? Integ_C1 : Integ_C1 - Integ_C2) : 0.0;
|
|
var2 -= Integ_L * R2;
|
|
var2 /= L;
|
|
Integ_L += var2 / Quant;
|
|
Current = Integ_L;
|
|
//---
|
|
Buffer_C2 += ((on && pulse) ? 0.0 : Integ_L);
|
|
//---
|
|
double filt = Current - Integ_Cf;
|
|
filt = filt / (Rf * Cf);
|
|
Integ_Cf += filt / Quant;
|
|
Current_Mid = Integ_Cf;
|
|
}
|
|
|
|
unsigned long Phase::buffer()
|
|
{
|
|
Count++;
|
|
if (Count >= Update) Count = 0;
|
|
//---
|
|
Buffer_C2 /= C2;
|
|
Integ_C2 += Buffer_C2 / Quant;
|
|
Buffer_C2 = 0;
|
|
//---
|
|
Buffer = Integ_C2;
|
|
//---
|
|
return Step++;
|
|
}
|