subtrain
17.01.2008, 17:58 |
12-bit AD-Wandler (Schaltungstechnik) |
Hallo.
Ist es mit wenig Aufwand möglich einen 12-bit AD-Wandler selbst zu bauen?
Ich habe es schon versucht, aber irgendwie funzt das nicht.
Per Timer1 eines ATMega48 ein PWM über nen Tiefpass auf den positiven Pin eines OP's, an den negativen PIN des OPs die Messspannung. Der OP sollte erkennen wann das PWM-Signal größer als die Messspannung ist.
Da ich nen OP mit maximalem Eingangsoffset von 1mV benutze, war meine Überlegung: Wenn der Komparatoraugang auf high geht, ist die Messspannung maximal 1mV niedriger.
Der Ausgang generiert mir im Controller nen Interrupt. Beim Start des PWM setze ich einen Zähler NULL und lese diesen dann im Interrupt aus.
Der Zählwert ist ja dann proportional zur Messspannung. Jedoch springt mein Komparatorausgang nicht bei 1mV größer als die Messspannung auf high, sondern erst wenn er 30mV größer ist.
Woran könnte das liegen? |
hws

59425 Unna, 17.01.2008, 18:30
@ subtrain
|
Und warum nicht gleich nen AD Wandler Eingang .. |
bzw nen Atmel mit integriertem AD Wandler benutzen?
Dir ist klar, dass bei ner "zuFussLösung" die PWM so weit gesiebt werden muss, das der restliche Rippel kleiner 1 LSB ist und dass durch diese Zeitkonstante deine Meßgeschwindigkeit festgelegt ist?
hws |
subtrain
17.01.2008, 18:37
@ hws
|
Und warum nicht gleich nen AD Wandler Eingang .. |
» bzw nen Atmel mit integriertem AD Wandler benutzen?
»
» Dir ist klar, dass bei ner "zuFussLösung" die PWM so weit gesiebt werden
» muss, das der restliche Rippel kleiner 1 LSB ist und dass durch diese
» Zeitkonstante deine Meßgeschwindigkeit festgelegt ist?
»
» hws
ok, das war mir nicht klar. und du meinst das wenn ich die PWM soweit glätte dann funktioniert das so?
Gibts nen Atmel mit nem 12bit ad? ich hab nur welche mit 10 bit auflösung gefunden und das ist zu wenig. |
hws

59425 Unna, 17.01.2008, 19:45
@ subtrain
|
Und warum nicht gleich nen AD Wandler Eingang .. |
» Gibts nen Atmel mit nem 12bit ad? ich hab nur welche mit 10 bit auflösung
» gefunden und das ist zu wenig.
Übersichtstabelle - steht da keiner passend drin?
Oder Messbereich eingrenzen.
Für den 80535 gabs mal ne Anleitung. Der konnte man die obere und untere Referenzspannung des AD Wandlers einstellen und somit den Meßbereich spreizen.
» Da ich nen OP mit maximalem Eingangsoffset von 1mV
» benutze, war meine Überlegung: Wenn der
» Komparatoraugang auf high geht, ist die Messspannung
» maximal 1mV niedriger.
Oder höher.
Ein PWM Ausgang ist ein Rechteck, dass ständig zwischen Null und Betriebsspannung schwingt. SO kommt es aus dem µC. Durch Ändern des Verhältnisses von Ein/Auszeit und GLÄTTEN dieses Signales bekommst du eine veränderbare Gleichspannung.
Du kannst also die PWM langsam erhöhen und jedesmal testen, ob dein Komparator schaltet. Nen Timer brauchts dazu nicht - wüsste nicht wie das funktionieren sollte.
Wie hast du das mit den 30 mV gemessen? Hast du ein Oszilloskop zum Nachschauen?
Vermutlich hast du deine Meßspannung mit der Aufladespannung eines Kondensators / RC Gliedes verglichen.
Schaltung?
Software? (nicht als Assembler Text sondern als Flussdiagramm natürlich)
hws |
subtrain
17.01.2008, 19:59
@ hws
|
Und warum nicht gleich nen AD Wandler Eingang .. |
» Übersichtstabelle - steht da keiner passend drin?
Laut Übersichtstabelle gibts nur welche mit 10 bit.
» Oder Messbereich eingrenzen.
Geht nicht.
» » Da ich nen OP mit maximalem Eingangsoffset von 1mV
» » benutze, war meine Überlegung: Wenn der
» » Komparatoraugang auf high geht, ist die Messspannung
» » maximal 1mV niedriger.
»
» Oder höher.
»
» Ein PWM Ausgang ist ein Rechteck, dass ständig zwischen Null und
» Betriebsspannung schwingt. SO kommt es aus dem µC. Durch Ändern des
» Verhältnisses von Ein/Auszeit und GLÄTTEN dieses Signales bekommst du eine
» veränderbare Gleichspannung.
»
» Du kannst also die PWM langsam erhöhen und jedesmal testen, ob dein
» Komparator schaltet. Nen Timer brauchts dazu nicht - wüsste nicht wie das
» funktionieren sollte.
»
» Wie hast du das mit den 30 mV gemessen? Hast du ein Oszilloskop zum
» Nachschauen?
»
» Vermutlich hast du deine Meßspannung mit der Aufladespannung eines
» Kondensators / RC Gliedes verglichen.
»
So, das mit der PWM ist mir schon klar. Mit dem Timer ermittel ich die Zeit die er zum erkennen braucht. Somit kann ich die angelegte Spannung digital weiterverarbeiten. Sonst wüßte ich ja nur das die Schwelle erreicht wurde, aber nicht wie hoch sie war.
Hab die Messspannung mit der Spannung des PWM am Tiefpasskondensator wenn der Interrupt kommt verglichen. Mittels Oszi natürlich. Und da sind immer diese 30-40mV Versatz drinnen. Bis auf mV genau hab ichs nicht gemessen, aber irgendwo da liegt der Fehler. Wenn ich die Spannung erhöhe verschluckt der mir quasi 30-40mV, bis er wieder schaltet.
Ich werd noch wahnsinnig. |
hws

59425 Unna, 17.01.2008, 20:10
@ subtrain
|
Und warum nicht gleich nen AD Wandler Eingang .. |
» Mit dem Timer ermittel ich die
» Zeit die er zum Erkennen braucht. Somit kann ich die angelegte Spannung
» digital weiterverarbeiten. Sonst wüßte ich ja nur das die Schwelle
» erreicht wurde, aber nicht wie hoch sie war.
Die Schwelle ist genauso hoch, wie du sie mit der PWM eingestellt / vorgegeben hast!
Du erhöhst die PWM Schritt für Schritt (mit entsprechender Wartezeit zum Einpendeln der Gleichspannung) Und wenn der Komparator schaltet, dann liegt deine Schwelle genau zwischen DIESER PWM und der vorigen.
Sinnvollerweise erhöht man die PWM natürlich nicht Schritt für Schritt, sondern macht eine successive approximation (mal nach googeln)
Also zuerst 1/2 maximaler Meßbereich.
Liegt die Meßspannung darüber -> zwischen 0,5..1,0 des Bereiches suchen, also gegen 0,75 testen.
(wenn drunter, eben zwischen 0,0..0,5 versuchen also 0,25)
Und immer wieder den Bereich genau halbieren.
hws |
subtrain
17.01.2008, 20:47
@ hws
|
Und warum nicht gleich nen AD Wandler Eingang .. |
» Die Schwelle ist genauso hoch, wie du sie mit der PWM eingestellt /
» vorgegeben hast!
Ich gebe ja mit der PWM nichts vor.
Wenn ich das PWM-Signal auf den Tiefpass gebe ergibt das ja ne Art Rampe die von 0-5V steigt. Jetzt hab ich am einen Komparatoreingang die Messspannung und am anderen das Signal der Rampe am Tiefpass, also sollte der Komparator ja schalten wenn die Spannung am Tiespass ein wenig größer als die Messspannung ist. Ideal wäre ein Unterschied von 0mV. Da der OP einen maximalen Eingangsoffset von 1mV hat müßte der doch dann schalten wenn die PWM Spannung am Tiefpass 0,... - 1mV größer ist als die Messspannung oder nicht???
Wo ist mein Denkfehler?
Und was ich nicht verstehe ist das ich das PWM vom 16-bit Timer des ATMega48 generieren lasse. Das wird aber nur auf 255 bit aufgelöst und nicht auf 16bit, wie es im Datenblatt steht.
Ich werfs gleich an die Wand.  |
hws

59425 Unna, 17.01.2008, 21:57
@ subtrain
|
doch ... |
» Ich gebe ja mit der PWM nichts vor.
Doch, genau DAS ist dein Denkfehler.
Wenn du eine PWM von 192 High Zyklen (von 256 Zyklen Gesamtlänge) programmierst, ist das 0,75.
Und wenn deine PWM Impulse 5Volt hoch sind (bei 5V Prozessorspannung mal angenommen) dann hast du am Glättungskondensator genau eine GLEICHspannung von 5*0,75= 3,75Volt. Und DIE vergleichst du per Komparator mit deiner Meßspannung.
Was du vermutlich gemacht hast:
Ein Kondensator ist anfangs ungeladen (0Volt).
Nun lädst du ihn mit einem Portpinchen auf 5V.
Die Spannung steigt mit dem Ausgangswiderstand des Ports und der Größe des Kondensators. (tau=R*C)
Die Kondensatorspannung vergleichst du mit deinem Meßsignal per Komparator und zählst die Aufladezeit.
DAS hat aber ÜBERHAUPTNIX mit PWM zu tun.
Wie lang ist denn deine Meßzeit?
Wie schnell steigt die Spannung am Kondensator?
Wie groß ist die Verzögerungszeit des Komparators?
Und wie lange die Reaktionszeit der Interruptroutine?
Könnte es nicht statt 30mV Fehler eine Zeitverzögerung von xx µS sein?
» Und was ich nicht verstehe ist das ich das PWM vom 16-bit Timer des
» ATMega48 generieren lasse. Das wird aber nur auf 255 bit aufgelöst und
» nicht auf 16bit, wie es im Datenblatt steht.
Müsste ich auch erst ins Datenblatt sehen.
Aber wenn du in der Software genauso nen Missverständnis wie bei der PWM hast, kann ich mir das schon vorstellen.
hws |
J.R.

17.01.2008, 22:06
@ subtrain
|
12-bit AD-Wandler |
Hallo,
» Ist es mit wenig Aufwand möglich einen 12-bit AD-Wandler selbst zu bauen?
Im Prinzip ja, aber wenig ist relativ.
» Ich habe es schon versucht, aber irgendwie funzt das nicht.
» Per Timer1 eines ATMega48 ein PWM über nen Tiefpass auf den positiven Pin
» eines OP's, an den negativen PIN des OPs die Messspannung. Der OP sollte
» erkennen wann das PWM-Signal größer als die Messspannung ist.
Wie bereits geschrieben wurde, ist das der falsche Weg, da du immer recht lange warten mußt, bis sich der PWM-Wert am Tiefpass einstellt.
Die einfachste Methode ist ein Rampengenerator, den du mit dem µP bei einem negativen Startwert starten kannst. Die Rampe wird mit einem Komparator mit einem Eingangssignal verglichen. Ein Analogmultiplexer kann den Komparatoreingang zwischen 0V, Uref und mehreren Meßsignalen umschalten. Der µP muß dann die Zeiten messen, die die Rampe braucht, um 0V, Uref und die anderen Meßsignale zu ereichen. Damit läßt sich dann genau der Wert der Meßsignale bezüglich 0V und Uref errechnen. Um die geforderte Genauigkeit zu erreichen, mußt du aber auch schon etwas Aufwand treiben.
Einfacher ist auf jeden Fall immer noch ein externer serieller ADC. Die sind ja inzwischen auch nicht mehr so teuer.
Jörg |
subtrain
17.01.2008, 22:16
@ hws
|
doch ... |
» Doch, genau DAS ist dein Denkfehler.
»
» Wenn du eine PWM von 192 High Zyklen (von 256 Zyklen Gesamtlänge)
» programmierst, ist das 0,75.
» Und wenn deine PWM Impulse 5Volt hoch sind (bei 5V Prozessorspannung mal
» angenommen) dann hast du am Glättungskondensator genau eine GLEICHspannung
» von 5*0,75= 3,75Volt. Und DIE vergleichst du per Komparator mit deiner
» Meßspannung.
Ich programmiere die PWM ja nicht, die erzeugt der Timer1 im Fast-PWM-Modus. Und den starte ich zu jedem Messzyklus neu, also bei Null Volt. Und die Spannung die durch die PWM am Kondensator "hochläuft" vergleiche ich per Komparator mit der Messspannung.
»
» Was du vermutlich gemacht hast:
» Ein Kondensator ist anfangs ungeladen (0Volt).
» Nun lädst du ihn mit einem Portpinchen auf 5V.
» Die Spannung steigt mit dem Ausgangswiderstand des Ports und der Größe des
» Kondensators. (tau=R*C)
» Die Kondensatorspannung vergleichst du mit deinem Meßsignal per Komparator
» und zählst die Aufladezeit.
»
» DAS hat aber ÜBERHAUPTNIX mit PWM zu tun.
genau so hab ich das gemacht. der kondensator wird jedoch noch über einen 100k Widerstand geladen, nicht nur über den widerstand des Portpins.
» Wie lang ist denn deine Meßzeit?
» Wie schnell steigt die Spannung am Kondensator?
» Wie groß ist die Verzögerungszeit des Komparators?
» Und wie lange die Reaktionszeit der Interruptroutine?
» Könnte es nicht statt 30mV Fehler eine Zeitverzögerung von xx µS sein?
»
Die Messzeit hängt ja von der Messspannung ab. Je größer, desto länger die Messzeit.
Hmm, Zeitverzögerung. Da denk ich mal drüber nach. Das könnte der Haken sein. Wenn der Komparator merkt das er high werden soll dauert das ja nen Moment, dann dauert es noch einen Moment bis der Interrupt kommt. Aber das kann doch keine 40mV ausmachen. Hmmmm, ich schaus mir morgen nochmal an.
» » Und was ich nicht verstehe ist das ich das PWM vom 16-bit Timer des
» » ATMega48 generieren lasse. Das wird aber nur auf 255 bit aufgelöst und
» » nicht auf 16bit, wie es im Datenblatt steht.
»
» Müsste ich auch erst ins Datenblatt sehen.
» Aber wenn du in der Software genauso nen Missverständnis wie bei der PWM
» hast, kann ich mir das schon vorstellen.
Das kann gut sein. Aber bei Fast-PWM vergleicht der Timer1 das OCRA register mit dem Zählerstand. Das OCRA wird nach jeder Periode des PWM um eins erhöht, aber er macht nur 255 Abstufungen, obwohl das OCRA ein 16bit register ist. |
subtrain
17.01.2008, 22:18
@ J.R.
|
12-bit AD-Wandler |
» Hallo,
»
» » Ist es mit wenig Aufwand möglich einen 12-bit AD-Wandler selbst zu
» bauen?
»
» Im Prinzip ja, aber wenig ist relativ.
»
» » Ich habe es schon versucht, aber irgendwie funzt das nicht.
» » Per Timer1 eines ATMega48 ein PWM über nen Tiefpass auf den positiven
» Pin
» » eines OP's, an den negativen PIN des OPs die Messspannung. Der OP
» sollte
» » erkennen wann das PWM-Signal größer als die Messspannung ist.
»
» Wie bereits geschrieben wurde, ist das der falsche Weg, da du immer recht
» lange warten mußt, bis sich der PWM-Wert am Tiefpass einstellt.
» Die einfachste Methode ist ein Rampengenerator, den du mit dem µP bei
» einem negativen Startwert starten kannst. Die Rampe wird mit einem
» Komparator mit einem Eingangssignal verglichen. Ein Analogmultiplexer kann
» den Komparatoreingang zwischen 0V, Uref und mehreren Meßsignalen
» umschalten. Der µP muß dann die Zeiten messen, die die Rampe braucht, um
» 0V, Uref und die anderen Meßsignale zu ereichen. Damit läßt sich dann
» genau der Wert der Meßsignale bezüglich 0V und Uref errechnen. Um die
» geforderte Genauigkeit zu erreichen, mußt du aber auch schon etwas Aufwand
» treiben.
» Einfacher ist auf jeden Fall immer noch ein externer serieller ADC. Die
» sind ja inzwischen auch nicht mehr so teuer.
»
» Jörg
Danke für die Info, der Haken ist aber: Ich habe keine negative Spannung zur Verfügung. |
J.R.

17.01.2008, 22:28
@ subtrain
|
12-bit AD-Wandler |
» » Die einfachste Methode ist ein Rampengenerator, den du mit dem µP bei
» » einem negativen Startwert starten kannst. Die Rampe wird mit einem
» » Komparator mit einem Eingangssignal verglichen. Ein Analogmultiplexer
» kann
» » den Komparatoreingang zwischen 0V, Uref und mehreren Meßsignalen
» » umschalten. Der µP muß dann die Zeiten messen, die die Rampe braucht,
» um
» » 0V, Uref und die anderen Meßsignale zu ereichen. Damit läßt sich dann
» » genau der Wert der Meßsignale bezüglich 0V und Uref errechnen. Um die
» » geforderte Genauigkeit zu erreichen, mußt du aber auch schon etwas
» Aufwand
» » treiben.
» » Einfacher ist auf jeden Fall immer noch ein externer serieller ADC. Die
» » sind ja inzwischen auch nicht mehr so teuer.
» »
» » Jörg
»
» Danke für die Info, der Haken ist aber: Ich habe keine negative Spannung
» zur Verfügung.
Moderne Einchip-ADCs haben damit meistens keine Probleme. Was spricht gegen diese Lösung ?
Du könntest dir eine virtuelle Masse z.B. Uref/2 als 0V definieren, aber das macht die Sache noch aufwändiger.
Jörg |
hws

59425 Unna, 17.01.2008, 23:01
@ subtrain
|
doch ... arghhh .. |
» Ich programmiere die PWM ja nicht, die erzeugt der Timer1 im
» Fast-PWM-Modus. Und den starte ich zu jedem Messzyklus neu, also bei Null
Du musst aber doch die Werte für die PWN vorgeben.
Abgesehen davon, dass du die PWM Auflösung auf 8, 9 oder 10 Bit fest einstellen kannst oder über ICR1 bzw OCR1A festlegen kannst.
Die Dreiecke im Datenblatt für TCNTn ist übrigens nicht irgendeine Spannung, sondern das Hochlaufen des Zäherstandes von Timer1. Und das OCnx in der Zeile darunter ist das Signal, was aus dem µC rauskommt. Und DAS musst du per RC integrieren.
Und ständig die FastPWM wieder neu starten, damit am OCnA eine PWM rauskommt, sonst ists nur EIN Impuls und keine PWM.
hws |
PWM-Freak
18.01.2008, 20:17
@ hws
|
doch ... arghhh .. |
Wenn du ne Schaltschwelle von 30-40mV hast, dann hast Du KEINE 16 bit PWM, sondern eine von irgendwas zwischen 2^7 und 2^8 bit bei 30 mV oder eine von irgendwas zwischen 2^6 und 2^7 bit bei 40mV. Die 5V Ausgangsspanung werden auf 30mV aufgelöst was 166 Stufen entspricht oder auf 40mV was 125 Stufen entspricht.
Das ist der Grund warum Dein Komparator erst bei diesen Schwellen schaltet. Wenn Du eine Messspannung von sagen wir mal 70mV anlegst, dann schaltet er (im Falle 30mV Schwelle) beim ersten Puls noch nicht, da dann am Integrator erst 30mV anliegen, beim zweiten auch noch nicht, da dann erst 60mV anliegen, aber beim dritten, da dann dort 90mV anliegen. Das gleiche gilt für 71mV, 72mV, 73mV,.......89mV,90mV. Bei 91mV würde er dann wieder schalten.
Wenn du die Schwelle verringern willst schau dir mal Dein PWM-Signal an, das ist NIEMALS auf 16bit aufgelöst. Anders finde ich keine Erklärung dafür.
Auf dem Oszi sieht man doch schön, wenn man sich die erzeugte Rampe am Integrator ansieht, bei großer Auflösung, wie die Spannung nach oben schießt wenn der Puls kommt und wie sie langsam wieder abfällt wenn die Pause kommt. Dein Komparator erkennt aber nur die Spitzen dieser zackigen Rampe und die haben bei Dir sicher nen Abstand von Deiner sogenannten Schaltschwelle.
Schaus dir mal genau an, dann wirst Du mir Recht geben.
Gruß Nils |
hws

59425 Unna, 21.01.2008, 08:42
@ PWM-Freak
|
er HAT keine PWM sondern nur einen Impuls. |
Wenn man sich mal das Datenblatt des ATMega ansieht, macht die fast-PWM genau EINEN Impuls am Ausgang. Und den startet er zu Anfang jeder Messung. (für ne PWM müsste man den ATMega ständig neu starten bei diesem PWM Modus).
Und im Datenblatt ist ein schönes Bild mit einem ansteigenden Dreick drin - ABER das ist der Zählerstand des PWM Zählers und erst eine Zeile drunter gibts einen Impuls, der mit Ablauf der PWM schaltet.
Dummerweise scheint er wohl ersteres als Spannung am Ausgangspinchen interpretiert zu haben, obwohl letzteres die Spannung am Pinchen ist.
Er misst gegen eine Kondensatoraufladung statt eine PWM.
Jedenfalls hab ichs so verstanden.
hws |