PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Widerstand



lastyle
10.08.2009, 21:43
Hallo Leute,

irgendwie habe ich immer noch Probleme in Bascom Widerstände zu messen.

Hat hier evtl jemand einen Beispielsource wie ich am besten einen Widerstand messen kann, und vor allen Dingen kann ich einfach so die 5 Volt abgreifen dann am Widerstandsende wieder in das RN Einspeisen ohne das ich mir Sorgen machen muss das ich das Board grille ?

Gruß Mario

Besserwessi
10.08.2009, 23:05
Die AVR Chips sind ziehmlich robust. Solange die 5 V nicht höher als die Versorgung des Chips sind, kann man nur etwas kaputt machen wenn der Pin als Ausgang definiert ist, und der Widerstand so klein ist, das mehr als etwa 40 mA fleißen können. Auch dann dauert es noch etwas.

Für die Widerstandsmessung gibt es mehrere Möglichkeiten. Ein Einfache wäre ein Spannungsteiler mit einem bekannten und dem Unbekannten Widerstand, und dann eine Spannungsmessung mit dem AD Wandler.

lastyle
11.08.2009, 16:53
Hmmm aber weiter hilft mir das im moment nicht :-) Ich hab irgendwie nicht einen Blassen Schimmer wie ich das am besten anstellen soll. Und aus den Anleitungen werde ich auch nicht wirklich Schlauer. Es wäre echt hilfreich (auch wenns nicht wirklich sehr konstruktiv meinerseits ist) wenn jemand einen Source dazu hätte mit Angabe an welchem Port gemessen wird. Den Rest für die anderen Ports fummel ich mir dann schon selber.

Ist halt das ersdte mal das ich mich mit sowas Hardwaretechnischem beschäftige. Normalerweise Progge ich immer nur VB zwecks Datenweiterverarbeitung.

Bin für jede Hilfe Dankbar

Gruß Mario

Besserwessi
11.08.2009, 17:47
An software ghört da wirklich nicht viel zu den ADC auszulesen. Ein Beispiel gibts z.B. hier :
http://www.rn-wissen.de/index.php/ADC_(Avr)#Bascom

Die Hardware wäre ein bekannter Widerstand von AVcc zum AD Eingang, der unbekannte Widerstand vom AD Eingang nach Masse (AGND). Wenn die Widerstände größer als etwa 50 KOhm sind, sollte noch ein Kondensator von etwa 22 nF bis 100 nF an den AD Eingang. Wenn man ganz sicher gehen will ein Widerstand von etwa 1 kOhm vor den AD Eingang. Eventuell noch ein Spannungsteiler 1:1 zwischen AVcc und AGND für die Referenzspannung.

lastyle
12.08.2009, 19:35
Ja Danke das hat ungemein geholfen, nur was mir echt komisch vorkommt ist das ich bei Keinem angeschlossenen Widerstand an PA0 bis PA7 Spannungen anliegen habe (zeigt der o.g. kompilierte Source mir jedenfalls)


Wenn ich mir nur die Werte anzeigen lasse bekomme ich auf
von PA0 bis PA7 schwankende (ausgerechnete) Spannungen von 1,2 bis 2,0 Volt angezeigt, Bei Anschluss eines Widerstandes auf z.B PA6 bekomme ich auch die gewünschte maximalspannung angezeigt und kann auch per zweitem Widerstand eine Veränderung feststellen.

Nur sollte denn nicht eigentlich ohne angeschlossenen Pins von PA0 bis 7 komplett auf 0 Sein ?

1023 ist Max das ist schon klar,aber bei nicht angelegter Spannung sollte doch alles auf 0 sein, ich bekomme aber schwankende werte zwischen 260 und 420 angezeigt.

Oder ist das normal so ?

Gibt es eigentlich eine Richtlinie wie groß der Referenzwiederstand mindestens sein mss ? Mein gewünschter Messbereich liegt zwischen 200 bis 3,5 KOhm. Daher dacht ich, das ich einen möglichst kleinen Referenzwiderstand (um die 200 Ohm) benutze um die Messgenauigkeit zu verbessern. Oder ist dies falsch gedacht bzw egal ?


Gruß Mario

021aet04
12.08.2009, 21:15
Am Analogeingang musst du immer einen bestimmten Wert haben, damit sichergestellt ist, das du keine Störungen misst. Deswegen verwendet man auch beim Digitaleingang Pullup oder -down Widerstände, damit sie einen bestimmten Pegel haben.

recycle
12.08.2009, 21:50
Nur sollte denn nicht eigentlich ohne angeschlossenen Pins von PA0 bis 7 komplett auf 0 Sein ?

Nein, wenn du an einem Eingangspin gar nichts angeschlossen hast ist das normal.



1023 ist Max das ist schon klar,aber bei nicht angelegter Spannung sollte doch alles auf 0 sein, ich bekomme aber schwankende werte zwischen 260 und 420 angezeigt.

Das liegt daran, dass deine Pins nicht an Masse (GND) angeschlossen sind, sondern "in der Luft hängen".
Du hast an deinem Controller und auf der Platine stelllen and denen 5V anliegen und Masse-Stellen mit 0V. Dazwischen ist Luft und Luft hat einen elektrischen Widerstand.
D.h. wenn dein Pin in der Luft hängt, hängt er im Printip irgendwo an einem Spannungsteiler - eigentlich dasselbe Prinzip wie du zur Messung deiner Widerstande verwenden willst ;-)
Problem ist allerdings, dass die Luft als Spanningsteiler nicht besonders konstant ist und die Spannung an deinem Pin daher schwankt. Das tut sie gerne auch mal um den Wert herum den ein digitaler Eingang als Schwellwert zwischen high und Low hat und dann flattert der Eingang was nicht besionders gut für die Schaltung und Bauteile ist.

Daher legt man digitale eingänge die nicht benutzt werden auf einen definierten Spanningspegel indem man sie entweder auf Masse legt oder über einen hochohmigen "Pullup"-Widerstand auf 5V legt.

Dein Controller hat aber interne Pullups, die du per Software aktivieren kannst.
Für Pina.7 z.B. lautet der Befehl dazu in Bascom "Pina.7 = 1".
Das solltest du für alle nicht beschalteten Eingänge machen.

Besserwessi
12.08.2009, 22:35
Bei einem Offenen AD Eingang sind die Schwankungen normal. Der Eingang ist sehr hochohmig und fängt sich jede kleine Störung (z.B. 50Hz) ein.


Der Referenzwiderstand sollte in der gleichen größenordnung wie die zu Messenden Widerstände sein. Am besten geht die Messung wenn die Widerstände gleich groß sind. In diesem Fall wären etwa 1 K wohl die richtige Wahl. Hängt aber etwas davon ab wo man mehr Auflösung braucht.

Wenn man den zusätzlichen Spannungteiler für Vref nutzt, sollte der Ref Widerstand eher groß sein, also z.B 3.3 K.

lastyle
13.08.2009, 14:31
Okay soweit alles verstanden,nur wie berechne ich jetzt den Widerstand ?

Laut Ohmschen Gesetz muss R=U/I nur kenne ich ja die Stromstärke nicht.

Den Spannungsabfall ja logischerweise schon. Wie komme ich den über den Spannungsabfall zur Stromstärke ? Oder ist es so das ich mit dem Pullupwiderstand den maximalen Strom "einstelle" ?

Herrje 20 Jahre her, ich glaub ich muss nochmal zur Schule :-)

Cairol
13.08.2009, 17:08
Na du kennst doch deinen Referenzwiderstand und nach der Messung die Spannung die dran abfällt.
Dann machst du I=Uref/Rref und hast deine Stromstärke. Die is ja bei dieser Serienschaltung für beide Widerstände gleich.
Dann noch Rmess = (Uq-Uref)/I -> fertig!

Die Quellspannung dürfte 5 Volt sein, aber die kannst du zur Sicherheit und erhöhung der Genauigkeit auf nem weiteren ADC-Pin messen.
Die Regler haben ja auch etwas Toleranz.

Ach ja: Je nach dem wie genau du es brauchst:
Verwende am besten keinen 0815-Kohlewiderstand als Referenz (mit 5% Toleranz oder so), sondern wenn schon, dann einen 1% oder 0,1%-Präzisions-Widerstand.

Besserwessi
13.08.2009, 18:11
Die Spannung wird man nicht extra nachmessen müssen. Man sollte die Spannung mit der der Teiler aus Ref. Widerstand und zu messendem Widerstand betreiben wird nur auch benutzen um die Ref. Spannung für den AD zu erzeugen, bzw. gleich als Ref. Spannung nutzen. Dann ist es egal ob das 5 V oder 3 V sind.

lastyle
13.08.2009, 22:41
Jetzt wo das alles soweit funktioniert bin ich an die nächste Hürde gekommen :-(

Der Temperatursensor den ich auslesen muss ist ein Linearer Temperatursensor von dem ich weiss das er bei 20Grad laut Spezifikation zwischen 2 bis 3 KOhm und bei 90 Grad 200 bis 300 Ohm hat. Ich habe mal ein wenig Recherchiert und von Polynomen gelesen. Alternativ Tabellen. Wie berechnet man ein solches Polynom bzw aufgrund welcher Kriterien erstellt man eine Gleichung man für so etwas.

Besserwessi
13.08.2009, 23:22
Die Werte passen mehr zu einem mehr zu einem NTC mit der typischen nichtlinearen Kennlinie. Bein bestimmen der Gleichung um die Kennlinie mit wenigen Parametern zu beschreiben greift man z.B. Auf die dahinterliegende Physik zurück. Alternativ geht es auch mal duch Porbieren der üblichen Skalierungen (lin, log, 1/T,...) bis man eine einfache Kurve hat. Die Parameter kann man dann duch einen Least square Fit (Deutusch Ausgleichsrechnung) bestimmen lassen. Beim Polynom geht das im ronzip genau so, nur das man sich da nicht die Mühe macht eine passenden Form mit wenig Parametern zu finden.

lastyle
14.08.2009, 19:20
Ich war jetzt einmal davon ausgegangen das es eine Lineare Kurve ist, daher habe ich mir den Max und den Minwert genommen den ich darstellen möchte und daraus eine Lineare Formel zu erstellen.Laut Datenblatt habe ich folgende Werte

RMin bei 120 Grad (Tempmax) = 113 Ohm
RMax bei 0 Grad (Tempmin) = 5896 Ohm

Daraus Bildet sich ein Teiler pro Grad = 48,19 OHM

Daraus habe ich gebildet :
Temperatur = Tempax-(Rmess-Rmin)/48,19

Dur diese Gleichung erhalte ich bei Widerstandwert 834 Ohm 106 Grad
es sollten aber 50 sein.

Hab ich da ergendwo einen Denkfehler ?

Ich habe eine Grafik der Sensordaten auf meine Homepage einmal abgelegt

www.keulertz-entsorgung.de/NTC-blau-2_5-kohm.png

Gruß Mario

Besserwessi
14.08.2009, 22:00
Wie man sieht ist die Kurve nicht linear, so wie bei fast allen NTCs. Die übliche Form für eine Umrechung findet man z.B. bei Wikipedia. Das einzige Problem könnte sein, dass der Code durch den Logarithmus recht lang wird.

lastyle
16.08.2009, 14:59
Das mit der Berechnung war in Bascom in der Tat etwas haarig, aber da ich nun die Werte für Pullups,Sensor-Bwert,Sannung und Widerstand bei Bezugstemperatur sepeat Auswähle ist es nicht ganz so schlimm.

Für den Fall das es mal irgendwen Interessieren sollte wie Ich es gelöst habe, Code anbei.
Für Verbesserungen besonders was Speedvorteile bringen könnte bin ich Offen :-)




Dim W As Word , Channel As Byte , Z As String * 10
Channel = 2
Dim Pullup As Single , Involt As Single , Volt As Single , Ln As Single , B As Single , R As Single , Ts As Single , Rs As Single , Temp As Single
Do

If Channel = 2 Then
B = 3491.2 'Bwert vom NTC
Ts = 298.15 'Bezugstemperatur in Kelvin
Rs = 2000 'Widerstand bei Bezugstemperatur TS
Pullup = 10000 'Widerstandswert Pullup Widerstand
Involt = 4.90 'Spannung vor Abfall
End If
If Channel = 3 Then
B = 3791.2 'Bwert vom NTC
Ts = 298.15 'Bezugstemperatur in Kelvin
Rs = 2500 'Widerstand bei Bezugstemperatur TS
Pullup = 10000 'Widerstandswert Pullup Widerstand
Involt = 4.90 'Spannung vor Abfall
End If
W = Getadc(channel)
Volt = W * 4.90
Volt = Volt / 1023
R = Involt / Pullup
R = Volt / R
Temp = B * Ts
Ln = R / Rs
Ln = Log(ln)
Ts = Ts * Ln
B = B + Ts
Temp = Temp / B
Temp = Temp - 273.15
Z = Fusing(temp , "#.#")
Print "ADC-Pin " ; Channel ; ": Volt " ; Volt ; " Widerstand " ; R
Print "Temperatur von Sensor am Kanal " ; Channel ; " " ; Z ; "°C"
Incr Channel
Loop Until Channel > 3

Besserwessi
16.08.2009, 18:26
Bei der Berechnung des Widerstandes ist glaube ich noch ein Fehler drin. Das sollte ein nichtlineare Funktion sein. Man braicht da auch nicht wirklich auf die Spannung umzurechnen, denn die darf an Ende nicht in Ergebnis eingehen.

Einige der zahlenwerte sind wirklich Konstant, da könnte man Konstanten nutzen, wenn BASCOM wenigstens das erlaubt. Bei involt ist da einmal der Wert 4,9 und einmal mit der Variable gerechenet. Das ist die schlechteste mögliche Lösung.

lastyle
16.08.2009, 20:56
Stimme das mit dem Wert habe ich übersehen, aber nun geändert.
Die formel ist so übernommen bzw umgestellt nach den gleichungen von
http://www.umnicom.de/Elektronik/Schaltungssammlung/Temperatur/Ntc/Ntc.html. Durch Ln = R / Rs , Ln = Log(ln) ist sie ja auch nicht Linear.

Ausserdem stimmt mit allen bisher angestellten Vergleichsmessungen mit einem Digitalen Aquariumthermometer von 22 bis 50 Grad in 0.1er Schritten überein. (Wasser erwärmt auf über 50 Grad und dann abfallend die Werte kontrolliert)

Aber die anliegende Spannung muss ich doch zur Berechnung des gemessenen Widerstandes auslesen bzw bestimmen oder nicht ?

Besserwessi
16.08.2009, 21:25
Die Spannung braucht man nicht, denn die Spannung geht 2 mal ein, und hebt sich dabei genau auf. Einmal als Ref Spannung des ADs und einmal als Spannung zum treiben der Brücke. Das nennt sich ratiomerische Messung.

Wenn die Schaltung so ist, wei gedacht, sollte der AD Wandler eine Wert ausgeben von:
AD = 1023 * Rv / (Rx+Rv)
Wobei Rv im Programm wohl Pullup heißt.
Oder als Verhältnis der Spannungen über dem Ref. und zu mesenden Widerstand geschrieben:
AD*Rx = (1023-AD) * Rv

Wenn man das nach Rx auföst komme ich auf
Rx = Rv * AD / (1023-AD)

Da taucht die Spannung schon gar nicht mehr auf. Für die Berechnung kann man dann auch Rv mit dem Widerstand bei 25 Grad gleich mit verechnen.
Also Ln = Rx/Rs = log(Rv/Rs) + Log (AD/(1023-AD))

W-Lan Kabel
06.09.2009, 16:25
Also:
wenn ich eine Lichtabhängigen wiederstand in reihe mit einem zweiten (am besten prazisionswiederstand) an einen A/D WAndler hänge kann ich über den ausgangswert (0-255) dann die lichtstärke bestimmen?

(ist nur zur Kontrolle, ob ich richtig liege)


Und wie lese ich den AD aus ?
(RP6 und C)

Besserwessi
06.09.2009, 17:57
Man kann die Helligkeit bestimmen mit einem Spannungsteiler aus dem LDR und einem Festen Widerstand.

Bei einem LDR ist auch gar nicht nötig einen Präzisionswiderstand zu nehmen, denn die LDRs sind auch Temperaturabhänig, sogar oft mehr als die billigen Kohlewiderstände.

Die Kurve AD Wert -> Helligkeit ist aber in aller Regel nichtlinear.

W-Lan Kabel
06.09.2009, 20:38
ich will nur unterscheiden hell, sprich solar,
oder dunkel, dan betrieb über akku

dafür reicht es aber oder?

021aet04
06.09.2009, 21:03
Ja, es geht, damit du hell und dunkel unterscheiden kannst. Der Widerstand ändert sich mit der Temparatur. Das bedeutet z.B. wenn du 20°C hast und die Helligkeit misst, hast du z.B. den Wert 100 am ADC. Wenn du 25°C hast, hast du bei gleicher Helligkeit einen Wert von 110. Das ist aber nur als Beispiel, ich weiß nicht, ob die Differenz höher ist oder weniger. Das sollte nur verdeutlichen, mit der Temparaturschwankung.

W-Lan Kabel
07.09.2009, 16:10
kann ich, weil der rp6 ja auch temperatursensoren eingebaut hat,
ein Relation aufstellen sodass der Microkontroller aus dem Lichtsensor einen wert einlies und dann die temperatur misst und zuletzt die beiden Faktoren aufhebt?

021aet04
07.09.2009, 16:54
Kannst du, du musst dann im Datenblatt des Lichsensors nachlesen, wie stark der Widerstand von der Temparatur abhängt. Zuerst würde ich aber nur die Helligkeit messen. Du könntest auch mit der gleichen Helligkeit den ADC auslesen und die Temparatur mit einem Fön ändern. Du könntest aber auch eine Glühlampe nehmen und den Sensor über die Lampe geben. Da die Lampe warm wird erwärmt sich auch der Sensor und die Helligkeit ist auch immer gleich, wenn du ein Netzteil verwendest. Den Wert des ADC kannst du am Display (wenn vorhanden) uder an einem Port ausgeben. Dann siehst du auch, wie stark der Sensor von der Temp. beeinflusst wird.

W-Lan Kabel
07.09.2009, 17:31
wie sieht dann die software aus?

wenn 22°C dann A/D Wert vom Lichtsensor -10
wenn 23°C dann A/D Wert vom Lichtsensor -15
wenn 24°C dann A/D Wert vom Lichtsensor -20

als beispiel?

oder geht es einfacher?