Funktions-Simulator (Sinus) Wochenend Projekt

Guten Abend zusammen,

mit etwas Langeweile am Wochenende ist ein Funktionssimulator entstanden... :slight_smile:
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

Hi

for (uint8_t x = 0; x < Px; x++)

Px ist uint16_t, t nur uint8_t - denke, Das gibt Probleme, oder?

Sonst blicke ich noch nicht wirklich durch das Programm durch ... bin aber im Moment auch etwas faul dafür :confused:

MfG

Wenn du einen Sinus wirklich simulieren willst (
statt einfach sin aufzurufen), schau dir mal den thread an.

grillgemuese:
Wie findet ihr das Progrämmchen?

Ich finde auf jeden Fall die Präprozessorbefehle blöd eingerückt. Irgendwie ist das nichts Ganzes und nichts Halbes. Wenn Du die Präprozessorbefehle deutlich sichtbar haben möchtest, versiehst Du sie mit einem Kommentar (z. B. //************). Dafür, wie ich das handhabe, habe ich noch keine zufriedenstellende Antwort gefunden. Wenn es um mehr als #ifndef BLA_H geht, wird mein Code immer irgendwie hässlich.

Ansonsten geht es mir wie postmaster-ino. Ich bin noch im Wochenend-Modus und stinkfaul.

Gruß

Gregor