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
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
Jedoch habe ich bei der Diode das Problem das sie eine gewisse Schwellspannung hat(ca. 1,6V)
Florian Schuller schrieb: > Hoffentlich kann mir jemand helfen. Zeig mal Schaltplan, Prosa verwirrt nur. :-)
So schnell einen Schaltplan gezeichnet. Die Widerstandswerte sind nicht eingetragen, wollte sie nicht noch mal berechen. Die zwei Spannungsteiler sind für 2 Messbereiche.
>So schnell einen Schaltplan gezeichnet.
Ohne AVCC wird das aber nix mit AD Wandlung;)
>Ohne AVCC wird das aber nix mit AD Wandlung;)
soll nur ein Bsp. sein um das mit den Spannungsteilern zu verdeutlichen.
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.
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 ;)
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!
>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?
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
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
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
>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?
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.
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. ...
Hannes Lux schrieb: > Ich hänge mal das Schaltbild an. Weitere Infos findet man hier: Beitrag "Re: 13 Bit Genauigkeit mit Atmega messen ?" ...
>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?
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 ?" ...
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.
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. ...
>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?
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... ...
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.
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. ...
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.