Re: Sensoren für C-Control I an C-Control II nutzen Kategorie: Sensoren (von André H. - 17.08.2004 10:56) | ||
Als Antwort auf Sensoren für C-Control I an C-Control II nutzen von Xzesor - 12.08.2004 18:19 | ||
| ||
Hallo Xzesor, > Ich soll ein kleines Beispiel zum Austellen im der Filliale mit C-Control machen. > Ich habe dazu ein Applicationboard und eine C-Control I Main Unit benutzt und > dort an die A/D-Ports folgende Sensoren angeschlossen: > ... > Alles lief auch gut, also wollte ich das System auf C-Control II umrüsten > um weitere Sensoren anzuschliessen > Da sich der A/D-Wandler geändert hat (10-Bit statt 8-Bit Auflösung, 4.096 V URef statt 2.55V) > Stimmen nur die Umrechnungsformeln für die Sensoren nicht mehr Die C-Control I Unit hat 2,50V und nicht 2,55V als Referenzspannung. lediglich die Station I hat 2,55V. Auch die Conrad-Sensoren sind für 0 bis 2,50V ausgelegt. > Ich habe mir gedacht, das wegen der 10-Bit Auflösung die Werte sich nur um > das 4-Fache steigern also Wert: 128 bei CC1 entspricht Wert: 512 bei CC2 > Dann hätte ich nur die Werte durch 4 Teilen müssen und hätte die alten Formeln > benutzen können. Leider klappt's aber so nicht Das kann nicht funzen. Denn die Referenzspannug ist unterschiedlich. Die Auflösung der CC1 beträgt bei Uref=2,50V 9,765625mV, die der CC2 jedoch 4mV > Als ich im Forum gesucht hab bin ich auf eine Software-Lösung für den Temp. Sensor gesto�en: > Die Formel: > > float temp; > Temp = 51 * ADC / 250 - 25; Diese Formel stammt von mir und ist ein Näherungswert. Allerdings lautet sie: function gettemp(long ADC) returns int {long Temp; Temp= 51*ADC; return (Temp/25)-250; } Ursprünglich ist dies eine Ableitung von: Temp=(AD*5)-250 (original CC1-Formel Diese Formel war für einen AD-Bereich von 0-255 gedacht bei Uref=2,50V. 2,50V sind bei der CC2 ein AD-Wert von 625 (= 2,5V / 4mV) Nun ergibt sich ein AD-Bereich von 0 bis 625 welcher dem MNe�bereich bei der CC1 entspricht. Die Formel lautete Anfangs deshalb so: Temp=(AD*5*255)/625 - 250 Da man dies noch wunderbar mit 25 kürzen kann, ergab sich daraus: Temp=(AD*51)/25 - 250 > //was dieser Formel entspricht: > Temp = ADC * 0.204 - 25 Theoretisch ja. Aber vermeide bei einfachen Berechnungen den Float-Typ !! Besonders dann, wenn danach dieser Wert wieder als Integer oder Long benötigt wird. Au�erdem sind Float-Berechnungen aü�erst Recheninteniv und bremsen daher die CC2 oft unnötig aus. Daher sollte vorzugsweise immer mit Long und Integer geabeitet werden. Man kann so auch wunderbar mit Kommazahlen arbeiten. Man bildet eben einfach eine Festkommazahl. Hier z.B. mit einer Kommastelle. Ausgeben kann man diese auf dem LCD dann z.B. mit lcdext.zahl4n1() . > Daraufhin hab ich mir Gedanken gemacht wie ich die Werte des Windrichtungsmessers umrechne > die Alte Formel: > > float richtung; > if(ADC > 240) > richtung = 324 + ((ADC - 240) * 2.3); > else > richtung = ADC * 1.35; > > war fehlerhaft. Wie gesagt, vermeide float !! Es wird rechnerisch eher unübersichtlich. > Also hab ich den selben Umrechnungsfaktor wie bei der neuen Temp Formel benutzt: 51 51 ist hier nicht der Umrechnungsfaktor, sondern 255/625, was wiederum 51/125 entspricht. Mit diesem Faktor erhälst Du quasi CC1-AD-Werte. Bei der Windrichtung hei�t dies nun, da� der AD-Wert 0 0° und 625 340° entspricht. (lt. Datenblatt 2,5V = 340°, bei 6,50V Versorgung !) Folgende Formel müsste einen Festkommainteger mit einer Nachkommastelle ergeben: Winkel = (AD * 3400) / 625 Auch das kann man wieder kürzen: Winkel = (AD * 136) / 25 also Funktion: function getangel(long ADC) returns int { ADC = ADC * 136; return ADC/25; } > Ich habe immer noch Probleme mit dem Schallpegel- und Luftdrucksensor > > Beim Luftdrucksensor enspricht der Int-Wert 0 zum Beispiel nicht mehr dem Nullabgleich > Die Formel (für: Höhenmesser bis 510m): hoehe = ADC * 2 stimmt natürlich auch nicht mehr > Wie komme ich an die richtigen Werte? Hier sieht es genauso aus: Wenn Du den Sensor als Höhenmesser bis 510m verwenden willst, obwohl das bei mir schon ein Tiefenmesser wäre, da ich auf ca. 600m über NN liege *grins*, mu� die Berechnung folgenderma�en aussehen: (wieder Festkommainteger mit einer Nachkommastelle) Höhe=(ADC * 5100) / 625 Gekürzt dann so: Höhe=(ADC * 204) / 25 Als Funktion: function getalt(long ADC) returns int { ADC = ADC * 204; return ADC/25; } Der im Sensor verwendete OP sollte bis ca. 3,5V gehen. Daher sollte man höhen bis knapp über 700m mit der CC2 messen können.(theoretisch) Wenn der Sensor im Modus bis 2041m verwendet wird würde das so aussehen: Hier allerdings ohne Komma nur als Integer. ;-) function getalt(long ADC) returns int { ADC = ADC * 408; return ADC/125; } Und wenn's doch mit einer Nachkommastelle sein soll: function getalt(long ADC) returns int { ADC = ADC * 816; return ADC/25; } Hier ergibt sich allerdings ein Fehler von einem Meter, was man bei einer Auflösung von etwas mehr als 3m sicher verkraften kann. ;-) > Beim Schallpegelsensor hab ich ein anderes Problem: > Er gibt nur noch konstant den Int-Wert 1023 zurück, reagiert nicht mehr auf Schallpegelveränderungen (anschreien etc.) > Kann es sein das der Sensor defekt ist? Hier haben wie wieder dasselbe: Me�bereich von 35 bis 120dB Wert = (AD * 85) / 625 + 35 Wert = (AD * 17) / 125 + 35 Als Festkommainteger: Wert = (AD * 170) / 125 + 35 Wert = (AD * 34) / 25 + 35 function getvol(long ADC) returns int { ADC = ADC * 34; return (ADC/25)+35; } Allerdingsbezweifle ich, da� der Schallpegelsensor zum Pegel einen linearen Verlauf hat. Schau Dir dazu einmal die dazugehörige Tabele an. Ich hab' dazu jetzt keine Lust. ;-) Der Grund dafür, da� der Sensor keinen vernünftigen Wert ausgibt, liegt sicher an der falschen Betriebsspnnung. Dieser benötigt nälich 6,5V. Das gilt auch für alle anderen Conrad-Sensoren. Lediglich das AD592 und Barometer-Sensormodul können mit einer Variablen Spannung versorgt werden. Diese sollte hier aber auch mindestens 6,5V haben ! > Ich möchte den Windgeschwindigkeitssensor (Bstl. Nr.: 108685) an den zweitem Frequenz-Eingang > anschliessen. Muss ich bei CC2 irgendwas anders machen als bei CC1 > oder stimmen die Formeln in der Anleitung immer noch? Dies sollte übereinstimme. Jedoch kann ich die Faktoren im Datenblatt nicht nachvollziehen. Das Anenometer gibt bei 35m/s ca. 31Hz aus. Also läge der Faktor bei ca. 1,13 , was wiederum dem Diagramm entspricht. Allerdings würde ich hier dann eher einen der Counter-Ports als einen Frequenzeingang verwenden, da die Auflösung einfach nur schauderhaft wäre, wenn nicht gerade Sturm herscht. ;-) Mit den Counter-Ports kannst Du eine die Periodenlänge zwischen zwei Impulsen auswerten. z.B. int Speed; thread getAnenometer {long timer,x; Speed=0; timer=system.timer(); loop { wait ports.getcount(); x=system.timer()-timer; timer=system.timer(); Speed=(113000/x); // in 0,01m/s //113000 = 1,13*1000*100 } } In "Speed" erhälst Du den Wert als Festkommainteger mit zwei Nachkommastellen in 0,01m/s. > Danke schonmal im Voraus für die Mühe. Als Gegenleistung kannst Du OSOPT V3.0, die aktuellen Module und Treiber benutzen. ;-) Kurz, installiere das aktuelle Servicepack. MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: Sensoren für C-Control I an C-Control II nutzen (von Xzesor - 19.08.2004 0:20) Re: Sensoren für C-Control I an C-Control II nutzen (von André H. - 19.08.2004 9:37) Re: Sensoren für C-Control I an C-Control II nutzen (von Wase.eye - 24.04.2005 20:00) |