PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spannung messen mit Digitalem Port



Kaniee
26.12.2010, 01:46
Hallo Forumler,
zu aller erst: ich bin neu hier und stelle mich KURZ vor:
Ich bin 14, komm aus dem Ländle, programmiere gerne, habe einen NXT und lerne zur Zeit JAVA. Ich habe noch nicht viel Ahnung von Robotern, will diese aber sammeln. Zur Zeit arbeite ich an einer Schulaufgabe, bin aber auf ein Problem gestoßen: Ich habe einen Sensor (bzw 2) der eine Spannung ausgibt, welche ich messen will. Für das ganze Projekt have ich von Parallax ein BASIC Stamp 1 Project Board (http://www.parallax.com/Store/Microcontrollers/AllMicrocontrollers/tabid/758/CategoryID/1/List/0/SortField/0/Level/a/ProductID/119/Default.aspx) Dieser hat aber nur digitale Ports. Mein Lösungsansatz war zu erst der, dass ich wie bei einem Sensor, welcher seinen Wiederstand verändert, mit einem Kondensator arbeite indem ich immer und immer wieder die Zeit messe wie lange ich brauche um diesen zu beladen (dazu hier einen Schaltplan http://img130.imageshack.us/i/output2.jpg/). Dies aber iwie umzubauen, damit etwas rauskommt mit dem ich eine Spannung messen kann ist mir aber nicht gelungen ](*,) (mein Ansatz für die Spannungsmesseung http://img810.imageshack.us/i/tcad12.jpg/). Nun zur Frage: Hat ijemand eine Idee wie ich so etwas messen kann und wie das passende Programmbeispiel aussehen könnte. Das wäre sehr nett. Wem noch Informationen fehlen, soll einfach fragen.

Vielen Dank schonmal. MfG Kaniee
PS: Wenn es geht antwortet bitte so das es auch jemand versteht der fast keine Ahung von soetwas hat. ](*,) [/code]

Typer
26.12.2010, 09:42
Hallo Kaniee,
mal vorne weg, mit Basic stamp kenn ich mich nicht so aus.

wie hoch ist die Spannung die du messen willst? 0-5V ?
ich weiss jetzt nicht ob ein basic stamp einen A/D wandler hat. (Analog / Digital wandler) aber über sonen wandler kannst du recht gute auswertungen / messungen machen.

Kannst du auch etwas Basic oder C?

Richard
26.12.2010, 10:48
von Parallax ein BASIC Stamp 1 Project Board


Laut Pic 16C5x Datenblatt hat der Chip keinen ADC Eingang und kann deshalb nur rein Digitale Signale verarbeiten. Analoge Sensoren können nicht ausgelesen werden.

Gruß Richard

Che Guevara
26.12.2010, 12:00
Hallo,

mir fallen da nur 2 Sachen ein:
1. Du besorgst dir einen externen analog-digital Wandler
2. Du baust dir einen ADC selbst.

Die Lösung mit dem Kondensator usw. halte ich für zu ungenau! Wenn der Pic einen Analog-Komparator hat, könnte man evtl. damit arbeiten, allerdings habe ich von Pics keine Ahnung.

Gruß
Chris

Besserwessi
26.12.2010, 13:17
Eine besonders hohe Genauigkeit bekommt man mit einer solchen Hilfsschaltung normalerweise nicht. MIt dem Analog KOmperator geht es aber schon realtiv gut. Ein Möglichkeit ist die zu messenden Spannung mit der Spannung aus einem PWM Ausgang + RC Filter zu vergleichen. Wenn einem die nichtlineare Kennlinie nicht stört, geht es auch über ein RC Glied und die Zeit die es braucht bis der Komperator umschaltet.

Manf
26.12.2010, 13:31
Grundsätzlich sollte man die zu messende Spannung über an einen Widerstand an einen Einangs-Port führen.
An diesen Eingangs-Port ist über einen Widerstand gleicher Größe auch ein Ausgangs-Port angeschlossen der ein PWM Signal ausgibt.
Damit liegt am Eingang (mit Kondensator) der Mittelwert der beiden Signale an.
Durch Verändern des PWM Wertes kann man dann einen reproduzierbaren Wert (z.B. Übergang low/high) am Eingang feststellen. Etwas temperaturabhängig ist die Messung allerdings.

Für eine kontinuierliche Messung gibt man den gemessenen digitalen Wert des Eingangs invertiert am Kompensationsausgang aus.
"Spannungen und Frequenzen einfach gemessen ELEKTRONIK 19/1980 S. 98-100"

(da war ich wohl etwas spät)

Kaniee
27.12.2010, 01:12
erstmal vielen Dank für eure Tipps aber leider kann ich nicht viel damit anfangen weil ich kenn mich noch fast gar nicht mit so etwas aus bin aber gerne bereit zu lernen.
Noch ein paar Infos:
Wie gesagt ich habe keinen analogen Eingang auch ein ADC den ich bisher noch nicht kannte kann ich auch nicht besorgen weil mir Kapital und Zeit fehlt. Einen zu bauen ist leider zu hoch für mich, denke ich mal. Leider kann ich mit BASIC und C(++) auch nicht umgehen.

Nun sehr genau muss ich nicht messen können. Aber die letzten beiden Ideen haben mir gefallen. Aber ich weiß nicht was ein RC Filter ist und wie ich das genau Programmieren kann. Kann mir mal jemand einen Schaltplan geben oder soetwas...würde mir sehr helfen. Auch würde es helfen die Idee auf "Normaldeutsch" nochmals zu erklähren...entschuldigt das ich nicht so viel davon verstehe.

Vielen Dank Kaniee

ranke
27.12.2010, 20:48
Aber ich weiß nicht was ein RC Filter ist und wie ich das genau Programmieren kann

Ein RC Filter ist hardware, ein Widerstand (R) und ein Kondensator (C).
Die Idee ist, dass man einen Kondensator über einen Widerstand abwechslungsweise Ladung zu- und abführt. Der Widerstand hängt z.B. an einem Port des MC, der eine PWM ausgibt. Je nach Tastverhältnis der PWM wird sich am Kondensator eine analoge Spannung ergeben. Es ist also ein simpler Digital-Analog-Wandler. Die Spannung dieses Wandlers kann z.B. mit einem Komparator mit der zu messenden Spannung verglichen werden. Der Ausgang des Komparators liegt an einem Eingang des MC, der dadurch immer weiss, ob die Meßspannung kleiner oder größer ist als die PWM nach dem RC-Glied. Durch Variation des PWM Tastverhältnis kann man dadurch die zu messende Spannung ermitteln.

Ich hoffe, das war ausreichend "Normaldeutsch" (Fachbegriffe kannst Du Dir ergooglen). Gerne bemühe ich mich weiter konkrete Fragen zu beantworten.

PICture
27.12.2010, 22:02
Hallo!

@ Kaniee

Ich versuche einen noch einfacheren A/D Wandler am digitalen Pin (I/O) zu erklären (siehe Skizze im Code).

Ausgangszustand: I/O als Ausgang und mit GND verbunden ("L")

A/D Start: I/O als Eingang umgeschaltet

Messung: Der Kondensator (C) lädt sich durch den Widerstand (R) von der zu messender Spannung (Ui). Ab "A/D Start" werden durch Counter/Timer die Taktimpulse gezählt.

Ergebnis: Bei erreichen des "H" Pegels am I/O pin (Uh) wird der Timer/Counter gestoppt und der C durch umschalten des I/O's auf Ausgang ("L") entladen (Rückkehr zum Ausgangszustand).

Vorteil: einfacher geht es hoffentlich nicht. Nachteil: das Ergebnis ist nicht linear proportional zum Kehrwert von Anzahl der Impulse (nötig ist eine Umrechnungstabelle s.g. "lookup table").

Das ist nur ein Vorschlag von Hardware und falls interessiert, würde ich es gerne genauer erklären.

MfG
U

A
|
Uh | _ _ _ _ _
| /|
| / |
| / |
| / |
| / |
| / | R
| / | ___
| / | Ui >---|___|-+---> DP (digital I/0 Pin)
|/ | |
+-------------> t C ---
0 ---
|
===
||||||||| GND
+-------------> t
| |
|n Impulse|
|<------->|



(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

Neutro
28.12.2010, 14:23
Spannungen kann man einfach in eine Frequenz umwandeln mit VCO oder U/F Wandlern. Diese Frequenz kann man mit einem digitalen Port messen und entsprechend auswerten. Im Prinzip also einen Frequenzzähler proggen und die Frequenz in eine Spannung umrechnen.

http://www.scribd.com/doc/6603613/UfWandler
Da gibt es fertige IC´s wie den
http://www.schukat.com/schukat/schukat_cms_de.nsf/index/CMSFA8629806B968127C125711E0050409A?OpenDocument

Gruß

Neutro

Kaniee
29.12.2010, 00:53
also ich will mich erstmal bedanken das ihrs mir erklährt habt und ich denke ich habe es größten Teils verstanden. Da ich mir leider keinen U/F Wandler besorgen kann würde ich gerne die Variante PICture mal ausprobieren. Könnte es sein das ich mit dem Befehl PULSIN was erreichen könnte? Ich habe mal ein Programmbeispiel gefunden aber mein Englisch ist nicht gantz ausreichen um zu deuten ob PULSIN der Befehl ist den ich brauche:

' PULSIN.BS1
' This program uses PULSIN to measure a pulse generated by discharging a
' 0.1 uF capacitor through a 1K resistor. Pressing the switch generates
' the pulse, which should ideally be approximately 120 us (12 PULSIN units
' of 10 us) long. Variations in component values may produce results that
' are up to 10 units off from this value. For more information on calculating
' resistor-capacitor timing, see the RCTIME command.

' {$STAMP BS1}
' {$PBASIC 1.0}

SYMBOL Pulse = 7 ' pulse input pin

SYMBOL time = W1 ' pulse width (10 uS units)


Main:
PULSIN Pulse, 1, time ' measure positive pulse
IF time = 0 THEN Main ' if 0, try again
DEBUG CLS, time ' else display result
GOTO Main
END

ich hoffe das ist der passende Befehl. Aber ich stehe wirklich auf dem Schlauch. Als ich die Antwort das erste Mal durchgelesen habe wusste ich noch genau was gemeint ist. Nun ist mir grade aufgefallen ich verstehe es iwie doch nicht :P. Das Prinzip verstehe ich aber wie kann ich z.B. den Kondensator wieder entladen :?
Danke ihr helft mir wirklich
Gruß Kaniee

EDIT: Ich glaube ich brauche keinen PULSIN Befehl denn sowas kann ich mir ja auch selber "Basteln"

PICture
29.12.2010, 01:15
Hallo Kaniee!

Als PIC ASMan kann ich dir leider bei Software nicht weiterhelfen und die Hardware hast du schon verstanden.

Also viel Spass und Erfolg bei der lehrreicher "Spielerei". :)

Übrigens, ich warte gespannt auf deine Ergebnisse, weil ich wahrscheinlich die Methode für Akkuspannung = VCC Überwachung bei meinen Spielzeugbots verwenden würde. Da es nur zwei Spannungen wichtig sind, wäre es für mich sogar mit den Unlinearität und Ungenauigkeit am einfachsten. ;)

MfG

Kaniee
29.12.2010, 13:49
klar präsentiere ich meine Ergebnisse aber das mit der Hardware habe ich eben nicht ganz verstanden. Kannst du mir nochmal genau sagen was welche Ports in welcher Reihenfolge machen. Ich steh iwie auf dem Schlauch...Danke
Gruß Kaniee

Kaniee
29.12.2010, 13:53
zu ranke:
Wie kann ich mit eine Kondensator und eine Frequenz eine Spannung erzeugen? Und wie kann man Spannungen vergleichen? Wenn es dir nicht zuviel Arbeit ist wäre mit ein Schaltplan sehr hilfreich, aber ich will dich zu nichts zwingen

PICture
29.12.2010, 15:59
Hallo Keniee!

Ich bin davon ausgegangen, dass für Messung einer Spannung nur ein I/O Port, also nur ein Pin benutzt wird. Es muss naturlich ein Portpin sein, der sich softwaremässig als Ausgang bzw. Eingang definieren lässt.

Ich versuche es nochmal detailierter zu beschreiben. ;)

Normaleweise ist der I/O Pin als Ausgang definiert und hat Ausgangszustand "L", ist also mit Masse (GND) verbunden. Somit beträgt die Spannung auf dem leerem C genau 0 V. Die zu messende Spannungsquelle Ui wird mit R belastet. Beim Start der Messung wird der Pin auf Eingang mit ziemlich hohen Widerstand gegen GND umgeschaltet und der Timer/Counter gestartet.

Der C lädt sich dann durch R mit der Ui und seine Spannung exponentiell wächst. Der Portpin wird mit "pooling" auf Zustand geprüft. Sobald auf dem Pin "H"-Pegel detektiert wird, wird der Timer/Counter gestoppt und die Anzahl der gezählten Impulse als Resultat der Messung angenommen.

Das Entladen des C's kann später, jedoch genug früher vor dem nächsten Start der Messung geschiehen.

Falls die Versorgungsspannung des µC's nicht stabilisiert ist, andert sich natürlich der "H"-Pegel, der als Referenzspannung für den "Komperator" dient und das muss berücksichtigt werden.

Hoffentlich ist es jetzt verständlicher, sonst bitte um konkrete Fragen, bis alles für dich ganz klar wird. :)

MfG

ranke
29.12.2010, 16:30
Wie kann ich mit eine Kondensator und eine Frequenz eine Spannung erzeugen? Und wie kann man Spannungen vergleichen?

einen Teil vom Schaltplan hat PICture schon oben mal im Codefenster gezeichnet. Es ist das Bild Rechts, mit R und C.
Bei Ui wird die PWM-Wechselspannung aufgegeben, wo PICture DP schreibt kann man dann eine Analogspannung messen mit der man weiter arbeiten kann.
Die PWM Wechselspannung ist eine Rechteckspannung (kennt also nur die beiden digitalen Zuständen Low und High) und läßt sich recht einfach mit einem MC erzeugen. Die Frequenz ist meistens konstant. Wichtig ist, dass die Das Zeitverhältnis zwischen High-Zeit und Low-Zeit variabel ist. Wenn die PWM die meiste Zeit High und nur sehr kurz auf Low ist, dann wird C über R meistens geladen und nur sehr kurzzeitig entladen. In diesem Fall Wird die resultierende Spannung am C recht hoch sein. Umgekehrt kann man den C auch entladen, wenn die PWM meistens Low und nur sehr kurzzeitig High ist. Man spricht in dem Zusammenhang auch von "Tastverhältnis", das ist das Verhältnis von High- und Low-Zeit.

In meinem Vorschlag wäre ich aber mit mit dem Knoten DP auf den Eingang eines Komparators gegangen. Ein Komparator ist ein Bauteil mit 2 analogen Eingängen und einem digitalen Ausgang (zusätzlich noch 2 Anschlüsse für die Stromversorgung). Die Funktion ist sehr einfach: Der Ausgang ist entweder High oder Low, je nachdem an welchen Eingang die Spannung gerade höher ist. Wenn man an den zweiten Eingang die Meßspannung anlegt, kann man am Ausgang des Komparators ablesen, welche der beden Spannungen gerade höher ist. Damit der MC das weiss, geben wir den Ausgang des Komparators auf einen Eingangspin des MC. Aufgabe des MC ist jetzt die PWM so einzustellen, dass die Spannungen immer fast gleich sind. Aus der Einstellung der PWM (dem Tastverhältnis) kennt der MC dann schließlich die Meßspannung.

PICture
29.12.2010, 17:34
In meinem Vorschlag wäre ich aber mit mit dem Knoten DP auf den Eingang eines Komparators gegangen.

Es gibt eben µC's mit +/- Komperatoreingang. Dann wären für die Messung nach ranke drei Portpins benötigt: ein als PWM Ausgang und zwei als symetrischen Komperatoreingang. Diese Methode ist jedoch viel genauer als von mir beschriebene. ;)

MfG

Kaniee
29.12.2010, 23:45
also ich habe nun eine Lösung gefunden. Zuerst der Schaltplan: http://img810.imageshack.us/img810/4889/spannungmessen.jpg
Nun ich habe 2 Operationsverstärker verbaut und benötige 2 Ports. Mit ich messe die Zeit wie lange ich brauche bis mein Kondensator aufgeladen ist mit PIN2 entladen kann ich ihn mit PIN1.
Ich danke für eure hilfe und hoffe es hat auch anderen geholfen.
Gruß Kaniee

PS: Ich habe beschummelt [-X weil ich mein Onkel gefragt habe, der ist Professor an der Uni. :roll:

PICture
29.12.2010, 23:58
Und funktioniert es ? ;)

Ich verstehe deine Schaltung nicht, weil ich gewollt kein Wissenschaftler bin. :(

MfG

Kaniee
30.12.2010, 13:03
Ich erklähre sie wenn ich aus dem Urlaub zurückkomme denn ich habe gerade keine Zeit...also dann bis bald.

Besserwessi
30.12.2010, 13:23
Die Schaltung ist ganz einfach:
Der ein OP ist einfach ein Spannungsfolger für den Eingang. Mit der Spannung wird über einen Widerstand ein Kondensator geladen. Die Diode (übrigens eine der Großen Schwachstellen der Schaltung) kann der Kondensator über den einen IO Port (fast) Entladen werden.

Der 2.OP ist als Komperator geschaltet zwischen der halben Versorgung und der Spannung am Kondensator.

Die Schaltung ist relativ aufwendig, aber nicht gut, denn von der Diode bleibt immer eine nicht gut definierte Restspannung im Kondensator. Außerdem geht der Eingang nur etwa von 2,5 V bis 5 V. Je nach OP ist die maximale Spannung dann auch noch kleiner !

Da schon lieber nur einen OP als Spannungsfolger, wenn man ihn braucht, und dann wie schon oben beschrieben passiv nur mit 2 Widerständen und einem Kondensator an 2 IO Ports. So schlecht ist der Digitale Eingang beim AVR und anderen CMOS µCs meist nicht.

Wenn es linear sein soll, ggf. auch als Alterntive einen OP + Transostor als Spannungs-strom Wandler, und damit an einen Kondensator. Das Entladen kann der selbe IO Pin machen.

PICture
30.12.2010, 16:04
Hallo Besserwessi!

Danke schön für deine Erklärung. Ich habe die Funktionsweise natürlich sofort erkannt, wollte aber lieber meine Meinung nicht äussern.

Das ist ein gutes Bespiel, wie ich das nie machen würde. :)

MfG

Kaniee
02.01.2011, 22:17
bei mir funktionierts was will ich mehr :)