AC-Spannung messen mit Arduino

Hallo,
ich möchte mit dem Arduino eine Wechselspannung messen. Dazu gab es im alten Forum einen sehr schönen Eintrag.
Meine Intension ist aber die ich möchte aud er Wechselspannung eines Generators auf die Drehzahl des Generators zurück schließen. Der Generator liefert bis zu 500V.
Mein Ansatz ist:
Aus der Frequenz der Wechselspannung ist das Maß für die Drehzahl.
Ein Printtrafo transformiert in den Kleinspannungsbereich.
Eine Z-Diode beschneidet die positive Halbwelle auf max 4,7 V.
Eine Diode soll die negative Halbwelle ausblenden.
Um auch sehrkeine Drehzahlen erfassen zu können soll das Signal auf einem analogen Eingang eingelesen werden.
Irgend wo in dieser Überlegung scheint ein Problem zu sein. Denn wenn die zwei Dioden zusammen arbeiten sollen bricht mir die Signalspannung zusammen.
Ich habe die Gleichrichterdiode schon ohne Erfolg gegen eine Schottky-Diode ersetzt.
Über Anregungen würde ich mich sehr freuen.

Vielen Dank für eure Hilfe

Schaltplan1.jpg

Gehe ich richtig in der annahme, dass du eine spannung messen kannst, wenn die z-diode durch ein stueck draht ersetzt wird?

zum Arduino diode | ---------|>----[270R]-----[5K/poti]--- | | _ | 5,1V z-diode ^ | _______________|_______ |

So muss das eigentlch funktionieren. man darf nicht vergessen das die Diode vorwärt normal funktioniert. Mit deiner Schaltung "nimmst" du eine Halbwelle weg und versuchst dann mit der Z-Diode die Fehlende Halbwelle auf 4,7V zu begrenzen. Im Normalfall: Schaltet man einen Widerstand in Reihe zur "Last" und eine Z-Diode parallel zum "Last" damit wird dann die Spannung begrenzt. Steigt die Spannung über den Wert der Z-Diode fängt diese dann an zu leiten und der Rest also U (Spannung) - 4,7V (Z-Diode) wird dann mit dem Strom der durch die Z-Diode fliest am Widerstand verbraten.

Hallo Volvodani, hallo madworm,
Vielen Dank für eure Hilfe. Eines solche Schalung wie Volvodani sie vorschlägt habe ich auch bereits ausprobiert, allerdings habe ich die Reihenfolge der Dioden vertauscht. Ich mache gleich einmal einen neuen Versuch mit Volvodanis Schaltplan. Ich hoffe ich habe das so richtig interpretiert?
Vielen Dank

Schaltplan2.jpg

Super, das war mein Fehler, jetzt macht die Schaltung das was sie soll. Vielen Dank

Hallo zusammen, meine Schaltung funktioniert, allerdings bekomme ich bei Frequenzen oberhalb von 18Hz Probleme mit der Auswertung. wie hoch ist die Abtastrate der Analogeingänge eigendlich? Gruß DrFlopp

Die Probleme sind nicht die Abtastfrequenz sondern Dein Programm das zu langsam ist.
Grüße Uwe

Vielen Dank Uwe, das bringt mich jetzt wirklich weiter. Nein Spaß bei Seite, ich habe da wirklich ein Problem. Vielleicht kannst Du mir einen Tipp geben wie ich das Programm beschleunigen kann. Zugegeben ich benutze die "Serial.print"-Funktion um mir meine Ergebnisse an zu schauen, und die sind nicht sehr schnell. Gibt es bessere Möglichkeiten? Gruß DrFlopp

Tipps für die Programmierung, ohne das Programm zu sehen? Geht schlecht... ;) Standardtipp: Delays in der Hauptschleife vermeiden.

Lösungsansatz Schmitt Trigger davor und dann eine Interrupt mit Steigender Flanke setzen die micros() Speichern und dann rechnen :-)

DrFlopp: Vielen Dank Uwe, das bringt mich jetzt wirklich weiter. Nein Spaß bei Seite, ich habe da wirklich ein Problem. Vielleicht kannst Du mir einen Tipp geben wie ich das Programm beschleunigen kann. Zugegeben ich benutze die "Serial.print"-Funktion um mir meine Ergebnisse an zu schauen, und die sind nicht sehr schnell. Gibt es bessere Möglichkeiten? GrußDrFlopp

Lieber DrFlopp Meine Vorschläge sind so allgemein, weil ich keine Infos habe, um genau auf Dein Problem einzugehen. Bitte schicke uns das vollständige Program. Serial.print verlangsamt ein Program ungemein. Erhöhe die Bautrate auf 115200, dann bremst die serielle Übertragung weniger. Grüße Uwe

Hallo zusammen,
Boutrate erhöhen hat leider nicht geholfen. Ich kann mit meiner schaltung die Frequenz leider noch immer nicht zuferlässig erfassen.
Der Schmitt Trigger erscheint mir auch nicht zielführend, da er bei sehr kleinen (1V) Spannungen nicht funktioniert.
Ich habe überlegt eine Kaskade von Z-Dioden könnte eine Ähnliche Funktion wie ein SChmitt-Trigger und ein Trafo ergeben, doch bei einem Spannungsbereich von 0-500V AC ist das wohl nicht machbar.

Hier mein Programm:

float U;
float u_gl;
int Ugen = 0; //Port A0
float Ugl = 1; //Port A1
int Start24V =12;

unsigned long T1;
unsigned long T2;
unsigned long T3;
unsigned long T4;
float f;
unsigned long dt;
void setup()
{
pinMode(Start24V, OUTPUT);

Serial.begin(115200);//9600); //Serielle Schnittstelle initialisieren

}

void loop()
{

U=analogRead(Ugen);//*5/1024;
u_gl=analogRead(Ugl)*5/1024;
//Serial.print(" U_gl = “);
//Serial.println(u_gl);
//Serial.print(” f = “);
//Serial.print(f);
//Serial.print(” dt = ");
//Serial.print(dt);
if ((U <10)) // untere Schwelle
{
T1 = millis(); // setze T1
T3 = T2; // setze T3
}
if (U > 15) //obere Schwelle
{
T2 = T1; // setze T2
T4 = T3; // setze T4
}
dt=T2-T4; // berechne Periodenzeit
f=1000/dt; // berechne Frequenz

if (f>0 && f<6 && u_gl > 0.5 && u_gl<4) //Anlaufbedingung
{
digitalWrite(Start24V, HIGH);// Einschalten für 1 min
Serial.println(" Start");
delay (60000); //1 min Anlaufzeit
digitalWrite(Start24V, LOW);
delay (60000); //1 min Auslaufzeit
}
if (f=0 && u_gl<=1)
{
digitalWrite(Start24V, LOW); // Stoppbedingung
//Serial.println(" warte 1 min “);
//delay (6000); //Delay 10 min
}
if (f>6 && u_gl>4)
{
digitalWrite(Start24V, LOW); // Stopp bedingung
Serial.println(” Produktion");
// delay (6000); //Delay 10 min
}
}

Floats zu verwenden macht das ganze sicherlich nicht schneller.

Ich glaube ich habe den Fehler gefunden, ich habe da eine Division durch Null versteckt, die Antwort des Controllers wird dann sehr merkwürdig. Er schreibt zwar Null, ist aber nicht gleich Null. Sind Floads wirklich langsam, was ist den besser? Gruß DrFlopp

Nachdem der AVR keine FPU hat, ist es per definition langsam. Alles wird per software emuliert.

http://www.rn-wissen.de/index.php/Avr-gcc#Vermeiden_von_float_und_double

Was hindert dich an der verwendung von uint32_t ? Die position des dezimalpunktes kann man am ende der berechnung immer noch einfuegen, wenn es ueberhaupt notwendig sein sollte. Anstelle von z.b. 50.5 einfach mit 505 rechnen.

Vielen Dank für den Tipp,
ich habe da ja die Möglichkeit statt der Frequenz die Periodendauer zu benutzen, dann bin ich ja schon alle Floats los.
Das probiere ich gleich mal aus.
Vielen Dank