Guten Abend zusammen,
mit etwas Langeweile am Wochenende ist ein Funktionssimulator entstanden... ![]()
Bisher kann der Simulator "nur" eine Sinus-Spannung darstellen.
Mehr wird bei etwas Zeitüberschuss folgen.
Wie findet ihr das Progrämmchen?
Bitte bei Fehlerentdeckung melden. DANKE
Besten Dank
Grillgemuese
/*Funktionssimulator Grillgemuese 04.03.2018
Version 0.1: sinus(1~)
kann folgen: rechteck, saegezahn, dreieck
*/
/*Hinweise:
min. f = 8 Hz (Px Ueberlauf)
Ram_limit hebt ein paar Funktionen auf
Plotter_mode ist Plotter kompatibel ;)
Nachkommastellen koennen mit Ks & Kl angepasst werden
Abtastrate liegt bei 0.5 ms
Plotter-Einstellungen (sfact, zoom)
Arduino arbeitet mit RAD nicht DEG!
Wurde aufgrund von Zeitmangel nur auf grobe Funkion geprueft!
Wer Fehler findet bitte melden -> Grillgemuese
*/
/*Bsp Rechnung:
f = 10.0 Hz, w = 62.83185 Hz, Us = 100 V,
P = 1/10.0 == 0.01 s | Px = 0,01*1000+1 == 11 (+1=Arrayindex)
****in setup****
--x=0--
t[x] = x_ms*x/1000 == 0 s
wt[x] = w*t[x] == 0 Hz
U[x] = Us*sin(wt[x]) == 0 V
Grad[x] = 180/PI*wt[x] == 0 °
--x=5--
t[x] = x_ms*x/1000 == 0.0025 s
wt[x] = w*t[x] == 0.1570796 Hz
U[x] = Us*sin(wt[x]) == 15.643443 V
Grad[x] = 180/PI*wt[x] == 8.9999 °
*/
#define Plotter_mode //Plotter kompatibel
//#define Ram_limit //bei hoher Ramlast
#define Baudrate 115200
#define sfact_m x_ms*sfact*100
/****globale Konstanten****/
const float f = 50.00; //Hz (Ramlimit beachten)
const float w = 2 * PI * f; //Kreisfrequenz(omega)
const float Ueff = 230.00; //Volt(Effektiv)(Us/sqrt(2))
const float Us = sqrt(2) * Ueff; //Volt(Spitze)
const float P = 1 / f; //Periodendauer
const float x_ms = 0.50; //Abtastrate
const uint8_t Px = P * 2000 + 1; //Schrittzahl (Arrayindex)
const uint8_t Ks = 4, Kl = 2; //Nachkom... setup, loop
/****Plotter-Einstellungen****/
const uint16_t sfact = 500; //Anzeigegeschwindigkeit
const uint8_t zoom = 1; //Plotter zoom (bei hoher f)
/****globale Variablen****/
float t[Px]; //Zeitpunkt
float wt[Px]; //omega*t
float U[Px]; //Ausgangssignal (Grundwelle)
/****zusatz Angaben (Ramlimit beachten)****/
#ifndef Ram_limit
uint16_t Grad[Px]; //Gradzahl
#endif //Ram_limit ENDE
void setup()
{
//Kalkulationen ausfuehren
for (uint8_t x = 0; x < Px; x++)
{
t[x] = x_ms * (float)x / 1000;
wt[x] = w * t[x];
U[x] = Us * sin(wt[x]);
#ifndef Ram_limit
Grad[x] = 180 / PI * wt[x]; //(uint16_t)wt[x]?
#endif //Ram_limit ENDE
}
Serial.begin(Baudrate);
while (!Serial) {}
#ifndef Plotter_mode
Serial.println(F("\nSinus-Simulation (Grillgemuese)"));
Serial.print(F("f = ")); Serial.print(f, Ks);
Serial.print(F(" P = ")); Serial.println(P * 1000, Ks);
Serial.print(F("w = ")); Serial.println(w, Ks);
Serial.print(F("Us = ")); Serial.print(Us, Ks);
Serial.print(F(" Ueff = ")); Serial.println(Ueff, Ks);
Serial.print(F("\n(x = t = w*t = U"));
#ifdef Ram_limit
Serial.println(F(")"));
#else
Serial.println(F(" = Grad)"));
#endif //Ram_limit ENDE
for (uint8_t xb = 0; xb < Px; xb++)
{
if (xb < 10) Serial.print(0);
Serial.print(xb);
Serial.print(F(" = "));
Serial.print(t[xb], Ks);
Serial.print(F(" = "));
Serial.print(wt[xb], Ks);
Serial.print(F(" = "));
Serial.print(U[xb], Ks);
#ifdef Ram_limit
Serial.println();
#else
Serial.print(F(" = "));
if (Grad[xb] < 10) Serial.print(0);
Serial.println(Grad[xb]);
#endif //Ram_limit ENDE
}
Serial.println(F("\n(x Ueff U)"));
#endif //Plotter_mode ENDE
}//void setup() ENDE
void loop()
{
static uint8_t x = 0;
static uint32_t vor_us = 0;
uint32_t akt_us = micros();
if (akt_us - vor_us >= sfact_m)
{
vor_us = akt_us;
if (x >= Px - 1) x = 1;
else x += 1;
#ifndef Plotter_mode
if (x < 10) Serial.print(0);
Serial.print(x);
Serial.print(F(" "));
#endif //Plotter_mode ENDE
for (uint8_t z = 0; z < zoom ; z++)
{
#ifndef Ram_limit
Serial.print(Ueff, Kl);
Serial.print(F(" "));
#endif //Ram_limit ENDE
Serial.println(U[x], Kl);
}
}
}//void loop() ENDE