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
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
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)
|
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.
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.
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.