forked from DIYPLC/TESTS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFbGSS.cpp
More file actions
111 lines (94 loc) · 2.27 KB
/
FbGSS.cpp
File metadata and controls
111 lines (94 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <math.h>
#include <stdint.h>
#include "FbGSS.hpp"
void FbGSS::Set_Amplitude(float value)
{
Amplitude = value;
}
void FbGSS::Set_Period(float value)
{
Period = value;
}
void FbGSS::Set_Phase(float value)
{
Phase = value;
}
void FbGSS::Set_Offset(float value)
{
Offset = value;
}
void FbGSS::Set_PulseTime(float value)
{
PulseTime = value;
}
void FbGSS::Set_Ts(float value)
{
Ts = value;
}
float FbGSS::Get_Sine(void)
{
return Sine;
}
float FbGSS::Get_Cosine(void)
{
return Cosine;
}
float FbGSS::Get_RectangleR(void)
{
return RectangleR;
}
bool FbGSS::Get_RectangleB(void)
{
return RectangleB;
}
float FbGSS::Get_Triangle(void)
{
return Triangle;
}
float FbGSS::Get_Prnd(void)
{
return Prnd;
}
void FbGSS::Run(void)
{
Sine = Amplitude * sinf(2 * M_PI * (1.0 / Period) * CurrentTime + Phase) + Offset; //Синус.
Cosine = Amplitude * cosf(2 * M_PI * (1.0 / Period) * CurrentTime + Phase) + Offset; //Косинус.
if (CurrentTime < PulseTime) //Прямоугольные импульсы.
{
RectangleR = Amplitude + Offset;
RectangleB = true;
}
else
{
RectangleR = Offset;
RectangleB = false;
}
if (CurrentTime <= (Period * 0.5)) //Треугольные импульсы.
{
IntegratorTriangle = IntegratorTriangle + Ts;
}
else
{
IntegratorTriangle = IntegratorTriangle - Ts;
}
if (Period != 0.0)
{
Triangle = (((IntegratorTriangle * 2.0) / Period) * Amplitude) + Offset;
}
//Псевдослучайные числа линейный конгруэнтный метод.
SummatorRnd = SummatorRnd * 1103515245 + 12345;
//принудительно отбрасывающей младшие 16 и один старший разряд.
uint32_t Tmp;
Tmp = SummatorRnd & 0b01111111111111110000000000000000;
//Арифметический сдвиг вправо на 16бит.
Tmp = Tmp >> 16;
//Масштабирование 0...32767 -> 0...1
Prnd = ( ((float)Tmp) / 32767.0 ) * Amplitude + Offset;
CurrentTime = CurrentTime + Ts; //Формирование периода.
if (CurrentTime >= Period)
{
CurrentTime = 0.0;
IntegratorTriangle = 0.0;
}
return;
}