Autorange an selbstgebautem Multimeter

#2530991
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
#2531350
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.
Gast #2531616
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
#2531790
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
#2531923
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?
Persönliche Seite #2531930
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.
#2532000
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.

...
Angehängte Dateien:
Gast #2532858
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.
#2532945
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.

...
#2533097
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?
#2533202
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...

...
#2533402
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.

...
Gast #2533792
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren