Forum: Mikrocontroller und Digitale Elektronik Autorange an selbstgebautem Multimeter


von Florian S. (didi34)


Lesenswert?

Ich baue mir gerade ein Multimeter. Habe das wesentliche schon 
Programmiert und ausprobiert, doch bei Autorange stehe ich jetzt an. Ich 
habe verschiedene Spannungsteiler an den Schaltbaren Eingängen liegen. 
Für jeden Messbereich einen. Schalte ich den Eingang auf GND, so wird 
der Spannungsteiler Zusätzlich dazugeschaltet und bringt die Spannung um 
einen gewissen Faktor herunter. Ich kann jetzt beim größten Messbereich 
anfangen und herunterschalten biss ich beim optimalen Bereich bin. Doch 
was mache ich wenn danach eine größere Spannung angelegt wird. Kann ich 
irgendwie einen Overflow feststellen oder wirt der µC gleich kaputt bei 
Überspannung am ADC?

Hoffentlich kann mir jemand helfen.

Danke in Voraus didi34

von Andreas B. (andreasb)


Lesenswert?

Du kannst den ADC mit einer Diode Richtung VCC mehr oder weniger 
absichern, und wenn du einen zu hohen Wert erreichst schaltest du den 
Spannungsteiler wieder hoch.

Ansonsten: Datenblatt studieren, AVRs verkraften oft VCC+0.5V am ADC.


mfg Andreas

von Florian S. (didi34)


Lesenswert?

Jedoch habe ich bei der Diode das Problem das sie eine gewisse 
Schwellspannung hat(ca. 1,6V)

von Floh (Gast)


Lesenswert?

Florian Schuller schrieb:
> Hoffentlich kann mir jemand helfen.

Zeig mal Schaltplan, Prosa verwirrt nur. :-)

von Florian S. (didi34)


Angehängte Dateien:

Lesenswert?

So schnell einen Schaltplan gezeichnet. Die Widerstandswerte sind nicht 
eingetragen, wollte sie nicht noch mal berechen. Die zwei 
Spannungsteiler sind für 2 Messbereiche.

von holger (Gast)


Lesenswert?

>So schnell einen Schaltplan gezeichnet.

Ohne AVCC wird das aber nix mit AD Wandlung;)

von Florian S. (didi34)


Lesenswert?

>Ohne AVCC wird das aber nix mit AD Wandlung;)
soll nur ein Bsp. sein um das mit den Spannungsteilern zu verdeutlichen.

von Herr M. (herrmueller)


Lesenswert?

Da Dein Bild einen Atmega zeigt, (die Info wäre am Anfang ganz gut 
gewesen), musst Du die Vorwiderstände an den Eingängen so hoch ansetzen, 
dass max. 1mA Strom fliessen kann. Bei einem Spannungsmesser sollte der 
eigentlich noch geringer sein. Die Überspannung wird dann über die im 
Atmega eingebauten 'Schutzdioden' gegen VCC abgeleitet.
Die Speisespannung  sollte davon aber nicht erhöht werden können.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Vor den ADC Eingang noch einen 10..15k Widerstand und eine 5,1V Z-Diode 
zum begrenzen der Eingangsspannung und des Stroms, so bist du auf der 
Sicheren Seite - aber auch nur bis die Z-Diode abraucht ;)

von Willi (Gast)


Lesenswert?

Nils S. schrieb:
> und eine 5,1V Z-Diode zum begrenzen der Eingangsspannung

und zur Erzeugung eines temperaturabhängigen Leckstromes.
Laß die ZD bloß weg!

von Florian S. (didi34)


Lesenswert?

>Die Überspannung wird dann über die im
>Atmega eingebauten 'Schutzdioden' gegen VCC abgeleitet
Aber um den Messbereich umschalten zu können muss ich erkennen, ob eine 
Überspannung anliegt. Wie kann ich das machen?

von Layouter (Gast)


Lesenswert?

Salu

Du könntest, falls Du noch einen AD Kanal frei hast, dort einen 
Spannungsteiler machen, dass sicher nichts passiert. Sprich, bei max. 
Bereich arbeitet der AD immer noch korrekt. Wenn Du nun rausgefunden 
hast wie hoch die Spannung ist, schaltest Du, z.B. über einen Analog 
Switch das Signal auf die entsprechenden Spannungsteiler. Hoffe habe 
mich verständlich ausgedrückt.

Gruss

von Dietrich L. (dietrichl)


Lesenswert?

Florian Schuller schrieb:
> Aber um den Messbereich umschalten zu können muss ich erkennen, ob eine
> Überspannung anliegt. Wie kann ich das machen?

Ich würde den Max.-Wert (1023) als Überlauf "definieren", oder gleich 
0...999 als gültigen Wertebereich und >999 als "zu hoch".

Gruß Dietrich

von Andreas B. (andreasb)


Lesenswert?

Die Variante mit 2 AD-Eingängen funktioniert natürlich, wenn du es mit 
einem AD-Wandler machen willst kannst du auch einfach dann höher 
schalten wenn du einen gewissen Schwellwert erreicht hast, z.B. 250. 
Genau mit dem gleichen Prinzip kannst du dich auch runter tasten.

Hier musst du einfach aufpassen das du nicht ständig hin und her 
wechselst wenn die Spannung genau auf der Kante liegt.

Wenn du 2 AD-Eingänge Benutzt musst du natürlich ebenfalls aufpassen das 
du nicht hin und her kippst, wenn du die 10 Bit des ADCs ausliest und 
eine Spannung misst, die du mit Taststiften abfängst, wirst du wohl kaum 
ein 100% konstantes Signal haben.

Also am besten irgendwelche Schwellwert, z.B. der ADC Wert muss sich um 
+/-10 verändern damit du schaltest, sonst schaltest du im blödsten Fall 
ständig hin und her...



mfg Andreas

von Florian S. (didi34)


Lesenswert?

>wenn du es mit
>einem AD-Wandler machen willst kannst du auch einfach dann höher
>schalten wenn du einen gewissen Schwellwert erreicht hast, z.B. 250.
Dieser Vorschlag gefällt mir gut, doch was passiert wenn ich im 10V 
Messbereich bin und 100V anlege. Wird der Messbereich nicht schon zuviel 
überschritten und der µC ist kaputt?

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Es gibt von Atmel eine Appnote, die zeigt, wie man auch an 230V messen 
kann. In dieser wird, soweit ich weiss, nur der Vorwiderstand so gross 
gewählt, dass der Strom, der über die Clamp-Dioden abfliesst nur so 
gering ist, dass diese nicht abrauchen.

Das Prinzip der Schutzschaltung im AVR ist einfach, eine Diode geht vom 
Pin nach GND. Ab einer bestimmten Spannung wird ein Teil dieser nach GND 
abgeleitet. Wenn der Strom dabei nicht den maximal zulässigen Strom 
dieser Dioden überschreitet, kann (theorethisch) nichts passieren.

Da du eh nicht genauer als 2 Kommastellen werden wirst bei deinem 
Multimeter wäre meine Lösung die Z-Diode, der Leckstrom ist da zu 
vernachlässigen - oder du sucht diese Application Note.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Florian Schuller schrieb:
> Ich baue mir gerade ein Multimeter.

So hoch (Multimeter) waren meine Ansprüche nicht, mir genügte ein 
Voltmeter...

Allerdings eines, was nicht nur Autorange hat, sondern auch automatisch 
zwischen Gleichspannung und Wechselspannung unterscheidet und zum Messen 
an Netzteilen geeignet ist.

Florian Schuller schrieb:
> ...(autorange)
> Doch
> was mache ich wenn danach eine größere Spannung angelegt wird.

Also ich nutze die interne Referenz von 1,1V des Tiny24 und bereite 
positive und negative Halbwelle separat für zwei ADC-Eingänge auf. Wird 
eine der Spannungen hinter dem OPV zu hoch, dann wird ein externer 
Interrupt ausgelöst, der veranlasst, dass der Messbereich sofort (ohne 
auf eine ADC-Wandlung warten zu müssen!) hochgeschaltet wird. Im 
Ruhezustand ist der niedrigste Messbereich (4 V für Vollhaus) aktiv, das 
Hochschalten erfolgt dank des Interrupts so schnell, dass da nix 
passiert. Ich hänge mal das Schaltbild an.

...

von Hannes L. (hannes)


Lesenswert?

Hannes Lux schrieb:
> Ich hänge mal das Schaltbild an.

Weitere Infos findet man hier:
Beitrag "Re: 13 Bit Genauigkeit mit Atmega messen ?"

...

von Florian S. (didi34)


Lesenswert?

>ein externer
>Interrupt ausgelöst, der veranlasst, dass der Messbereich sofort (ohne
>auf eine ADC-Wandlung warten zu müssen!) hochgeschaltet wird.

Das klingt gut, doch wie mache ich das mit dem Interrupt?

von Hannes L. (hannes)


Lesenswert?

Florian Schuller schrieb:
> Das klingt gut, doch wie mache ich das mit dem Interrupt?

Wie Du das machst, weiß ich nicht. Wie ich es gemacht habe, kannst Du 
hier nachlesen:

Hannes Lux schrieb:
> Weitere Infos findet man hier:
> Beitrag "Re: 13 Bit Genauigkeit mit Atmega messen ?"

...

von Ulrich (Gast)


Lesenswert?

Die Schaltung mit den Relais ist doch schon recht viel Aufwand. Da gibt 
es einfachere Lösungen:
1. So wie die meisten Autorange DMMs das machen, mit einem 1 M oder 10 M 
Widerstand am Eingang und dann einen Invertierenden Verstärker mit 
umschalten der Rückkopplung. Die Umschaltung liegt dann bei kleiner 
Spannung, und kann mit CMOS Schaltern wie 74HC4052 gemacht werden.

2. man nimmt einfach einen höher auslösenden AD (z.B. MCP3421) und 
verzichtet auf die Umschaltung - geht zumindest für DC.

3. Nur die grobe Umschaltung der Verstärkung per Relais (1:100) und dann 
eine 1:10 Umschaltung am oder hinter dem Verstärker. ggf. auch einfach 
das verstärkte Signal noch auf einen 2. AD Eingang legen.

von Hannes L. (hannes)


Lesenswert?

Ulrich schrieb:
> Die Schaltung mit den Relais ist doch schon recht viel Aufwand.

Meinst Du? Ich sehe das anders, das Voltmeter sollte von vornherein 
netzbetrieben sein, so dass die Stromaufnahme keine Rolle spielt, und 
die Relais waren vorhanden.

> Da gibt
> es einfachere Lösungen:

Du musst es ja nicht nachbauen...

> 1. So wie die meisten Autorange DMMs das machen,

Und genau diese gefallen mir nicht, da sie mit wanderndem Dezimalpunkt 
arbeiten und genaues Hinsehen beim Ablesen erfordern. Da ist mir meine 
Lösung mit fester Position des Dezimalpunktes bedeutend lieber.

> mit einem 1 M oder 10 M
> Widerstand am Eingang und dann einen Invertierenden Verstärker mit
> umschalten der Rückkopplung.

Ging nicht, denn ich brauchte zwei separate gegenpolig arbeitende aktive 
Gleichrichter, um beide Halbwellen unabhängig voneinander messen zu 
können. Und für diese wollte ich kein IC-Grab einsetzen, dazu sollte ein 
Doppel-OPV reichen.

> Die Umschaltung liegt dann bei kleiner
> Spannung, und kann mit CMOS Schaltern wie 74HC4052 gemacht werden.

Erfordert zusätzlichen IC. Da halte ich die Relais-Lösung für einfacher.

>
> 2. man nimmt einfach einen höher auslösenden AD (z.B. MCP3421) und
> verzichtet auf die Umschaltung - geht zumindest für DC.

Mit DC war ich aber nicht zufrieden, ich wollte ohne einen Umschalter 
bedienen zu müssen AC, DC und Halbwellen messen können und dies auch am 
Display angezeigt bekommen.

>
> 3. Nur die grobe Umschaltung der Verstärkung per Relais (1:100) und dann
> eine 1:10

Warum 1:100 und 1:10???
Ich nutze eine Abstufung von 1:8 zwischen den Messbereichen. Und das hat 
einen guten Grund. Ich habe nämlich keine Lust, mit meinen nicht mehr so 
jungen Augen ständig den (springenden) Dezimalpunkt suchen zu müssen, um 
das Ergebnis stellenrichtig abzulesen. Deshalb habe ich den Dezimalpunkt 
fix an eine Position platziert. Große Werte werden weiter links 
dargestellt, kleinere Werte weiter rechts. Das liest sich bedeutend 
entspannter ab. Und dafür brauche ich die Werte im Festkommaformat. Mit 
1:10-Umschaltungen hätte ich dafür (auf dem Tiny24) "rechnen" müssen, 
bei 1:8-Umschaltungen brauche ich nur ein paar Schiebeoperationen.

> Umschaltung am oder hinter dem Verstärker. ggf. auch einfach
> das verstärkte Signal noch auf einen 2. AD Eingang legen.

Auf dem zweiten ADC liegt ja die zweite Polarität, also die zweite 
Halbwelle bei AC.

...

von Florian S. (didi34)


Lesenswert?

>Wie Du das machst, weiß ich nicht. Wie ich es gemacht habe, kannst Du
>hier nachlesen:

>> Weitere Infos findet man hier:
>> Beitrag "Re: 13 Bit Genauigkeit mit Atmega messen ?"

Habe über dieses externe Interrupt nichts gefunden. Kannst du mir 
erklären, wie du das gemacht hast?

von Hannes L. (hannes)


Lesenswert?

Florian Schuller schrieb:
> Habe über dieses externe Interrupt nichts gefunden. Kannst du mir
> erklären, wie du das gemacht hast?

Ich versuche es mal...

Zuerst zur Schaltung: 
Beitrag "Re: Autorange an selbstgebautem Multimeter"

Über eine der Dioden D8 oder D9 und den Widerstand R26 wird der 
Transistor Q1 angesteuert, wenn eine der ADC-Spannungen zwei 
Diodenstrecken (also etwas mehr als die 1,1 V der Referenz) übersteigt. 
Der Transistor wird leitend und zieht gegen den internen 
PullUp-Widerstand Pin PB2 (Int0) des Tiny24 nach GND, löst damit also 
den Interrupt aus.

Im Programm wird dadurch folgende ISR aufgerufen:
1
isr_exi0:           ;ISR, Überspannung an einem Messeingang
2
 in srsk,sreg               ;PSW sichern
3
 inc mb                     ;Messbereich hochschalten
4
 cpi mb,4                   ;und
5
 brlo exi0_1                ;auf 3
6
 ldi mb,3                   ;begrenzen
7
exi0_1:
8
 rcall sub_neumb            ;Relais gemäß Messbereich umschalten...
9
 out sreg,srsk              ;PSW wiederherstellen
10
 reti                       ;fertig, zurück...

Da eine Messbereichsumschaltung aber auch im Hauptprogramm beim Über- 
oder Unterschreiten von Schwellwerten erfolgt, wurde das Umschalten der 
Relais in ein UP ausgelagert, damit es von mehreren Stellen aus 
angesprungen werden kann:
1
sub_neumb:          ;Messbereichsumschaltung
2
 push xh
3
 push xl
4
 ldi yl,reltab              ;Pointer auf
5
 add yl,mb                  ;Relais-Bitmuster,
6
 ld xl,y                    ;Bitmuster holen
7
 out portb,xl               ;und schalten
8
 sbr vflags,1<<mbu          ;Messbereichsänderung anmelden
9
 clr kaz                    ;neuen Messzyklus beginnen
10
 ldi anz,anz0u              ;Ausgabetakt synchronisieren
11
 ldi xl,low(relwait)        ;Wartezeit 
12
 ldi xh,high(relwait)       ;einstellen
13
neumb1:             ;auf Schalten der Relais und Einschwingen des OPV warten
14
 rcall tunix                ;7 Takte vertrödeln
15
 sbiw xh:xl,1               ;Wartezeit runter
16
 brne neumb1                ;abgelaufen? - nein, nochmal...
17
 pop xl
18
 pop xh
19
tunix:              ;7 Takte (Sprungdauer) warten
20
 ret                        ;fertig, zurück...

Ich hoffe, diese Erklärung hilft Dir weiter...

Und für die Kritiker: Ja, hier wird in der ISR eine Warteschleife 
aufgerufen, was ich (fast) immer und überall bemängele. Hier hat es aber 
seinen Sinn, denn direkt nach dem Umschalten des 
Eingangsspannungsteilers gibt es sowiso nix Vernünftiges zu tun, bis die 
Relaiskontakte mit der Prellerei fertig sind. Jede Regel hat eben ihre 
Ausnahme...

...

von Florian S. (didi34)


Lesenswert?

Ok. Ich kann zwar mit den Assembler Codeteilen nicht viel anfangen, aber 
ich habe verstanden, wie das mit dem externen Interrupt gemeint ist. 
Vielen Dank für die Erklärung.

von Hannes L. (hannes)


Lesenswert?

Florian Schuller schrieb:
> Ok. Ich kann zwar mit den Assembler Codeteilen nicht viel anfangen,

Schade eigentlich, da hätte ich mir das Zusammensuchen der Codeteile ja 
sparen können...

In welcher Sprache programmierst Du denn?

> aber
> ich habe verstanden, wie das mit dem externen Interrupt gemeint ist.

Interrupts sollten auch in anderen Programmiersprachen möglich sein, das 
sind schließlich Hardware-Einheiten des Controllers.

> Vielen Dank für die Erklärung.

...

von Florian S. (didi34)


Lesenswert?

>In welcher Sprache programmierst Du denn?
Ich Programmiere in C. Ich weiß auch, wie das mit den Interrupts 
funktioniert, doch ich hatte das nicht verstanden das das mit dem 
Transistor mehr oder weniger wie eint Taster an einem Port funktioniert.

von Ulrich (Gast)


Lesenswert?

Weil das Relais ohnehin eine gewisse Zeit braucht, ist auch nicht so 
schlimm, wenn man die Erkennung des Bereichsendes und die Umschaltung 
erst anhand der Werte von AD Wandler macht. Der Schritt in einen 
kleineren Bereich geht auch jetzt schon nur so.

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.