Sinus-Spannung.ino 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //Wechselspannung: Sinusförmige Spannung mittels PWM erzeugen
  2. //Deklaration und Initialisierung globaler Variablen
  3. const int AnalogPin = 9 ; //Deklaration PWM-Analog Pin 9
  4. float t = 0.f ; // Momentanwert der Zeit in Millisekunden
  5. float T = 0.f ; // Periodendauer in Millisekunden
  6. const float U_ref = 5.f ; //Referenzspannung in Volt
  7. int PWM_Value = 0 ; //Parameterwert für analogWrite
  8. unsigned int AD_Value = 0 ; //Parameterwert für analogRead
  9. float ReadVoltage = 0.f ; //Gemessene Spannung in Volt
  10. float Skal_Amplitude = 0 ; //Berechnete Amplitude
  11. /**********************************************************/
  12. //Einstellbare Parameter:
  13. float Amplitude = 0.5f ; //Amplitude in Volt (0 - 2.5 V)
  14. unsigned int Frequenz = 5 ; //Frequenz in Hertz (max 20Hz)
  15. /**********************************************************/
  16. void setup() {
  17. // put your setup code here, to run once:
  18. Serial.begin(9600); //Initialisierung Serielle Kommunikation 115200 Baud
  19. TCCR1B = (TCCR1B & 0b11111000) | 0x01 ; //Änderung der PWM-Frequenz des Analog Pins 9 und 10 auf 31372 Hz
  20. //Quelle: http://playground.arduino.cc/Main/TimerPWMCheatsheet
  21. Skal_Amplitude = Amplitude * (254.f / U_ref) ; //Berechnung/Anpassung der Amplitude für analogWrite
  22. T = (1.f / Frequenz) * 1000.f ; //Berechnung der Periodendauer mittels der Frequenz
  23. }
  24. void loop() {
  25. // put your main code here, to run repeatedly:
  26. t = millis()%(int)T ; //Laufzeit des Arduinos, Berechnung des Rests der Division durch Periodendauer
  27. //Sinusfunktion
  28. PWM_Value = (int) ( Skal_Amplitude * sin ((t/T) * 2.f * PI) ) ; //Berechnung der Sinusfunktion und Skalierung
  29. PWM_Value += 127 ; //Addition des Offsets
  30. //Sägezahnspannung
  31. //Rechteckspannung
  32. //Dreieckspannung
  33. analogWrite(AnalogPin ,PWM_Value); //PWM-Ausgabe an Pin 9
  34. AD_Value = analogRead(A0) ; //Analogen Wert an Pin A0 einlesen
  35. ReadVoltage = (float)AD_Value * (U_ref/1023.f) ; //Berechnung der momentan anliegenden Spannung
  36. Serial.println(ReadVoltage); //Ausgabe der momentanen Spannung über UART
  37. //Ergebnissanzeige mittels Werkzeuge->Serieller Plotter (aktuelle Arduino Version 1.6.9 installieren!)
  38. // delay(1) ;
  39. }