Forum: Mikrocontroller und Digitale Elektronik ADC-Problem: U-I-P-Messgerät für 230V


von Julian R. (tuefftler)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich versuche gerade am Ausgang eines Stelltrafos (kein Poti! wie im 
Schaltplan) die Spannung und den Strom zu erfassen. Das soll ein ATmega8 
erledigen, der viele tausend Mal pro Sekunde den Momentanwert misst, das 
Quadrat bildet und aufsummiert. Wenn ich davon dann die Qurzel ziehe, 
erhalte ich für jede Wellenform die Effektivspannung.

Die Anschlüsse die aktuell am ATmega8 nicht beschaltet sind, sind 
Ausgänge für die LED Matrix bestehend aus 9x 7seg Anzeigen. Zudem hängt 
am SPI ein ISP-USB-Programmiergerät->STK500Emulator.

Die Spannungen (5V & 3,3V) so gewählt habe: Ich will eine künstliche 
Masse erzeugen, auf der ich dann sowohl die positive als auch die 
negative Halbwelle messen kann. Dazu bilde ich einen Spannungshalbierer 
aus den beiden 200 Ohm Widerständen. Die 3,3V hab ich zum einen 
zusätzlich erzeugt, da ich genauere Werte bei einem relativ verlustarmen 
Shunt haben wollte. Die 5V brauche ich für meine 9x7seg-LED-Anzeigen. 
(5V mit 7805 (nicht im Schaltplan))

Aktuell erhalte ich jedoch einen falschen Wert, da der Mittelpunktwert 
(sollte bei 512 liegen, nicht 540) verschoben ist->Offset. Messe ich mit 
einem Multimeter die Spannung an den Widerständen (1,646V + 1,642V) und 
berechne dafür dann die ADC-Werte, so komm ich fast auf die 512.
Dieser Offset lässt sich zudem nur bei der Spannungsmessung feststellen! 
Messe ich mit dem ADC den Strom, so ist dieser ohne Verbraucher genau 0 
-> also 512 im ADC Wert!

Offsetspannung: (540-512)*(3,3V/1024)=0,09V

Stimmt mein Schaltplan? Verbesserungen(aber nicht zuviel auf einmal)?
Koppelt da irgendwo was ein?
Was erzeugt da einen Offset?

Vielen Dank für Hile im voraus!
LG julian

von Julian R. (tuefftler)


Lesenswert?

Nachtrag:

Ich habe jetzt mal als Test alle ADC-Werte über eine Zeit aufsummiert 
und dann durch die Anzahl geteilt. Dabei kommt ein Wert bei der 
Spannungsmessung heraus, der ziemlich genau um 512 schwankt -> die 
Hardware sollte stimmen.

D.h. ich habe einen Denkfehler in der Software! Aber wo?

Wäre immernoch über Hilfe erfreut!

LG julian

von Uwe (de0508)


Lesenswert?

Hallo,

kannst Du mir bitte erklären warum da so definiert ist?

Und auch in der ISR angewendet wird?
1
#define StartNewConversion  ((1<<ADEN) | (1<<ADSC) | (1<<ADIF) | (1<<ADIE) | 0x5)

von Julian R. (tuefftler)


Lesenswert?

Das ist meine Standarteinstellung, in der ich den ADC nutzen möchte.
Die 0x5 sind der prescalerwert, die restlichen Bits sollen zum einen den 
ADC anschalten, einen Interrupt nach einer Messung aufrufen und dafür 
sorgen, das eine neue Messung durchgeführt wird.
Der ADC-Interrupt wird aber sicher ausgeführt.

von Info (Gast)


Lesenswert?

Einen Leistungsmesser mit MSP430 gibt es in der Codesammlung..

von Ulrich (Gast)


Lesenswert?

Die Kondensatoren an den ADC Eingängen sollte eher etwas größer sein, 
etwa 10 nF (oder mehr). Kondensatoren um 1 nF können da zu Fehlern 
führen, weil das einerseits zu keine ist um das Aufladen des S&H 
Kondensators voll zu puffern, aber trotzdem ein schnelles nachladen über 
den Eingangswiederstand verhindern. Auch 10 nF und 1 K geben noch eine 
Grenzfrequenz von etwa 15 kHz - mehr schafft man mit dem ADC ohnehin 
kaum.

Zwischen Shunt und ADC Eingang zur Strommessung sollte noch ein 
Widerstand (z.B. 2 K) als grober Schutz, um den µC nicht gleich bei 
einer Stromspitze zu zerstören. Je nach Anforderungen wäre auch mehr 
Schutz sinnvoll.

Den DC Offset bei den ADC werten kann man rechnerisch berücksichtigen 
bei der RMS Berechnung. Dazu muss man nur auch den Mittelwert mit 
bestimmen und vom Mittelwert der Quadrate abziehen.

Die Zahl der Werte für die RMS Bestimmung sollte so gewählt werden, dass 
es ein Vielfaches der Periodenlänge ist.

von Chuck Norris (Gast)


Lesenswert?

>Die Zahl der Werte für die RMS Bestimmung sollte so gewählt werden, dass
>es ein Vielfaches der Periodenlänge ist.

Dann bräuchtest du noch ein Modul, das zunächst die Periodenlänge 
bestimmt und die Bufferlänge darauf abstimmt. Außer, du willst wirklich 
nur am 50Hz Netz messen. Dann müsste man genau genommen eine 
Fehlerbetrachtung machen, was passiert, wenn der Buffer um 'x' zu 
lang/kurz ist.

Aber vll. hast du ja auch keinen Denk- sondern einen Rechenfehler? Wie 
machst du die Wurzeloperation? Eine math.h?
Sonst würde ich die Wurzeloperation mal mit Fixwerten füttern und 
schauen, was sie drauß macht.
Villeicht gibt es ja eine LUT im Netz, die für Werte einer bestimmten 
Datenbreite das passende Ergebnis raussucht.

von Ulrich (Gast)


Lesenswert?

Die Anwendung ist mit dem Transformator schon ziemlich sicher rein 50 
Hz, eventuell noch 60 Hz, aber auch da gibt es ein gemeinsame passende 
Zeit (z.B. 0,5 s). Je länger das Zeitfenster, desto weniger wichtig wird 
es die genaue Periodenlänge zu treffen - eine passende Zeit ist aber 
halt auch nur ein geringer Aufwand: Die passende Zahl wählen, bei der 
Berechnung ein Multiplikation satt eines ggf. minimal schnelleren 
Bitschiebens und dann ggf. noch einmal bei Skalierung aufpassen, einen 
Skalierungsfaktor braucht man in den meisten Fällen ja sowieso. Es wäre 
dabei allerdings hilfreich wenn die Abtastwerte in definierter Zeit 
folgen. Das geht einfacher wenn der ADC im Autotrigger Mode läuft - auch 
wenn man dann bei der Kanalumschaltung aufpassen muss - mit einem 
anderen Interrupt der dazwischen kommt kann das schon schwierig werden.

Wenn das Fenster von ganzen Perioden abweicht, gibt es halt abhängig von 
der Startphase eine Abweichung im Wert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.