Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO-Kollisionstaster Bitwert zuordnen!
powder999
28.03.2012, 18:37
Hallo Community! ich bin am verzweifeln.
Ich muss gerade einen Abschlussbericht über den ASURO schreiben (FOS Klasse 12)
Nun stehe ich gerade auf dem Schlauch bei einer Beispielrechnung zur Erklärung der Kollisionstaster.
Ich hab gesagt Taster 2 und 4 werden gedrückt und dann hab ich gerechnet:
Rges=R24+ 1/(1/(R26+R32)+1/R28 ) =4,2kΩ
Iges=Uges/Rges= 5V/4,2kΩ=1,19mA
UA/D-Wandler "= " 1/(1/(R26+R32)+1/R28 ) " * Iges = 3,81V
Diese 3,81 V entsprechen einem Integerwert von 762.
So, wie mach ich jetzt weiter? Mit dem Wert muss ich doch irgendwie zeigen können, dass der 2. und 4. Taster gedrückt ist, aber wie geht das mit den Bitwerten!
Kann mir das noch mal jemand für doofe erklären?
Mit den Werten wird im ASURO noch weiter gerechnet, der Trick besteht ja darin, dass durch die geschickte Wahl der Widerstandswerte es eben möglich ist, mit etwas Nachbearbeitung des ADC-Wertes im Endergebnis die einzelnen Widerstandsabstufungen auf einzelne Bits runterzubrechen. Sieh dir Mal den Quelltext der ASURO-Bibliothek an.
mfG
Markus
Tip: Die Widerstandswerte der einzelnen Taster sind nicht zufällig immer ungefähr doppelt so groß wie der des nächstkleineren Widerstands.
powder999
29.03.2012, 15:50
Ja und wie kann ich jetzt in meinem Bericht erklären, woher der ASURO weiß, dass der 2. und 4. Taster gedrückt wurde. Kann da einer mal ne Beispielrechnung machen, wo ich zum Schluss sehe, aha, da ist der und der Bit gesetzt, das kann nur der 2. und 4. Taster, deshalt sind die gedrückt. Ich versteh das irgendwie ned.
P.S.: Bitte mal für ganz Doofe erklären, dass ich ned mehr auf dem Schlauch stehe! ;-)
Markusj hat schon gesagt das den Formel in den Asuro-bibliothek Quell-text steht (asuro.c, bei den Funktion PollSwitch). Also den Berechnung den PollSwitch Ausgabe aus den ADC wert kannst du selbst machen. Aus den Schaltung kannst du auch ein Berechnung machen wie bestimmte Tastern eine bestimmte Spannungsteilung zu folge hat. Den beiden zusammen mit ein bisschen Mathe-Magie und das Antwort (wie den PollSwitch Ausgabe entsteht aus den Taster eingaben) wird klar. Leider ist das im Praxis nicht so genau, weil Widerstanden und den ADC auch gewisse Ungenauigkeiten haben.
powder999
29.03.2012, 18:10
Also mein Integerwert 762 ist richtig und in dem Quelltext steht dann von z.B. 700 bis 780 ist dann Taster 2 und 4 gedrückt oder wie? ich versteh das immer noch ned!
Ich weiß, ich fang jetzt an zu nerven, aber kann mir biiiiiiittttttteeeeee einer mal ne Beispielrechnung für Taster 2 und 4 gedrückt machen!!!!!
Ich wäre euch sehr verbunden!
mfg powder999
Sieh in den Quelltext. Ich werde mich hüten, dir deine Schulaufgaben zu lösen, vor allem wenn von dir selbst überhaupt keine Eigeninitiative ersichtlich ist.
mfG
Markus
Searcher
29.03.2012, 21:31
Hallo powder999,
Ohne in die Sourcen geschaut zu haben und als nicht Asuro Spezialist:
Ich hab gesagt Taster 2 und 4 werden gedrückt und dann hab ich gerechnet:
Rges=R24+ 1/(1/(R26+R32)+1/R28 ) =4,2kΩ
Iges=Uges/Rges= 5V/4,2kΩ=1,19mA
UA/D-Wandler "= " 1/(1/(R26+R32)+1/R28 ) " * Iges = 3,81V
Bis hierher kann ich Dir folgen (Der 1 MOhm Widerstand wurde vernachlässigt und spielt auch keine große Rolle)
Diese 3,81 V entsprechen einem Integerwert von 762.
Aber wie kommst Du auf den Integerwert?
Wenn 5 Volt dem max. Wert des ADC von 10bit = 1023 entspricht (vorausgesetzt die Referenz des ADC ist VCC)
Anmerkung: Es sind 1024 Werte - 0 bis 1023
Wievielen Werten entsprechen dann 3,81 Volt?
Und was gibt der ADC dann aus?
Ich komme da auf einen anderen Wert als Du
Gruß
Searcher
powder999
30.03.2012, 11:25
@ markusj: Deine Vermutung ist falsch, dass ich keinerlei Eigeninitiative ergreife und dass du mir meine Schulaufgaben löst. Ich habe die letzten 3 Monate nach der Schule von 15-20 Uhr an dem ASURO gearbeitet und sämtliche Bücher und Internetseiten durchgewühlt! Wenn ich etwas anfange, möchte ich das auch perfekt zu Ende bringen.
Ich steh halt gerade bei diesem Problem ganz schön auf dem Schlauch, da ich vorher noch nichts in dem Bereich Informationstechnik und Elektrotechnik zu tun hatte.
Ich mag es selber nicht, wenn Leute sich in Foren die Hausaufgaben machen lassen.
Ich hab schon sooooo viel Zeit in das Projekt investiert und habe halt gedacht, dass irgend jemand so hilfsbereit wär und mir das Problem mal erklärt anhand eines simplen Beispiels!
BITTTTEEEEEEE!!!!!! Ich kann doch auch nichts dafür, dass ich es nicht verstehe.
P.S.: Ich hab bereits in den Quellcode geschaut, aber ich versteh das halt ned. Tut mir leid markusj, aber kannst du vielleicht über deinen Schatten springen und mir vielleicht doch noch helfen?
powder999
30.03.2012, 11:30
@Searcher: Ich hab das so gelöst --> 5V/1024 Steps sind rund 5mV pro Step.
Wenn ich jetzt 3,81V habe, entspricht das: --> 3,81V/5mV pro Step= 762
Was mach ich denn falsch, ich bin verzweifelt! :-(
Searcher
30.03.2012, 13:07
@Searcher: Ich hab das so gelöst --> 5V/1024 Steps sind rund 5mV pro Step.
Wenn ich jetzt 3,81V habe, entspricht das: --> 3,81V/5mV pro Step= 762
Was mach ich denn falsch, ich bin verzweifelt! :-(
In diesem Fall würd ich sagen: zu früh gerundet.
3,81V * 1024 / 5V = 780,288
Mein Integerwert wäre also 780
Die Formel steht auch im Datenblatt zum ATmega8: ADC = Vin * 1024 / Vref
Im Datenblatt steht auch, was der ADC macht, wenn Vin = Vref ist und bei der Gleichung dann 1024 rauskommen müßte, die mit 10 Bit ja nicht darstellbar sind: Er gibt 1023 (3FF) aus.
Durch Deinen Rundungsfehler sieht es so aus, als wenn Du mit 1000 statt mit 1024 gerechnet hättest.
Da sich in der Reihenschaltung die Spannungen wie die Widerstände verhalten, bräuchte man den Strom nicht immer auszurechnen.
Rin / Rg = Vin / Vref
oben eingesetzt
ADC = Rin * 1024 / Rg
mit Taster K2 und K4 gedrückt
ADC = 3200 Ohm * 1024 / 4200 Ohm = 780,19047619047619047619047619048 (mehr gab mein WIN Rechner nicht her :-) )
Man müßte jetzt alle Tastenkombinationen durchrechnen und schauen, was die jeweiligen ADC Werte sind.
Im Source könnten sich dann Bereiche finden lassen, anhand derer entschieden wird, welche Taster gedrückt sind.
Bereiche deshalb, weil die realen Widerstände ja nie 100% den angegebenen entsprechen und noch wegen irgendwelcher anderen Toleranzen. Also zB ADC ist zwischen 770 und 790 - Aha, dann ist K2 und K4 gedrückt.
Gruß
Searcher
P.S.: Ich hab bereits in den Quellcode geschaut, aber ich versteh das halt ned. Tut mir leid markusj, aber kannst du vielleicht über deinen Schatten springen und mir vielleicht doch noch helfen?
Ich versuche dir noch einen Stoß in die richtige Richtung zu geben: Die Schaltung im ASURO ist im Endeffekt ein variabler Spannungsteiler. Es gibt auf der einen Seite einen Vorwiderstand und auf der anderen Seite dann die verschiedenen an die Taster angeschlossenen Widerstände. Der Vorwiderstand und die anliegende Spannung ist bekannt, es ist also möglich, den unbekannten Widerstand an den Tastern zu errechnen. Das ist Teil 1 der Lösung.
Um jetzt anhand des ermittelten Gesamtwiderstandes auf die einzelnen Taster zurückschließen zu können, hat man sich eines kleinen Tricks bedient: Die Widerstandswerte sind vielfache voneinander. Es gibt einen Grundwert R und alle Widerstände sind so ausgelegt, dass sie einen Wert von ungefähr 2^i * R haben, wobei i die Nummer des Widerstandes ist.
Mit diesem zweiten Teil Komponente ergibt sich dann eine Gleichung: Parallelschaltung von Widerständen (an den Tastern) -> Spannungsteiler (Vorwiderstand und der aus der Parallelschaltung resultierende Widerstand) -> Spannung -> ADC-Wert. Mit etwas Formel-Umstellen kommt man irgendwann dahin, dass auf einer Seite des Gleichheitszeichens eine Summe der ganzen 2^i steht, jeder Widerstand i also dann auf ein Bit (Zweierpotenz -> darstellbar durch ein Bit) abgebildet wird. Und genau diese Formel steht dann auch im Quelltext der Asurolib.
mfG
Markus
Searcher
30.03.2012, 15:53
Ich schaue fleißig mit und vermute, daß sich ein "Geheimnis" in der switches.c verbirgt.
http://www.asurowiki.de/pmwiki/pub/html/files.html
http://www.asurowiki.de/pmwiki/pub/html/switches_8c-source.html
In Zeile 103 wird i mit dem ADC Wert geladen und in Zeile 120 der Rückgabewert produziert.
Da ich C nicht verstehe, kann ich nur vermuten, daß hier die Bits entsprechend der Taster gesetzt werden :confused:
Ob ich die richtigen Sourceversionen erwischt hab weis ich leider auch nicht.
Gruß
Searcher
powder999
30.03.2012, 21:13
An Searcher und markusj: Danke für die Super Erklärungen, muss mich noch mal kurz damit beschäftigen, ich hoffe, dann klappt das auch mit dem Verständnis!
Schönes Wochenende und bis bald!
powder999
11.04.2012, 17:41
ich hab jetzt noch mal in den Quellcode geschaut und folgendes gefunden:
return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
Was setz ich denn jetzt für float ein? Hab gedacht die Spannung, die ich berechnet hatte, also 3,81V, aber dann kommt was ganz kryptisches raus --> (1024/3,81) -1=267,766 --> ...*63,0=16869,28 --> ...+0,5= 16869,78! Das stimmt doch garantiert ned!
Es ist doch bestimmt ganz leicht, aber ich komm ned drauf, hab schon den Quellcode angeguckt und verschiedene Rechnungen gemacht, aber irgendwie klappt das ned. Liegt das vielleicht daran, dass man einfach hinnehmen muss, dass der ASURO das kann? :-)
"i" ist das Zahl zwischen 0 bis 1023 das den Widerstandsteiler der Tasten entspricht. Das kommt aus den ADCL und ADCH Registern nach dem Analog-digital umwandlung. Das sind zahlen ohne etwas hinter den Komma. "(float)" ist ein Auftrag für den Compiler das "i" als Fließkommazahl-zahl berechnet werden soll, und nicht als Integer-wert. "(unsigned char)" is ein Auftrag für den Compiler das dass Resultat als ein 8-bit wert ausgegeben soll werden. (0-255, ohne Fließkommazahl, darf auch nicht als negatife Wert benutzt werden.)
Also wird das wie folgend ausgerechnet:
return ((unsigned char) ((( 1024.0/762.0 - 1.0)) * 63.0 + 0.5));
! 762 laut deine eigene Berechnungen. Das wurde 780 sein mit Searcher's Berechnungen
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.