Archiv verlassen und diese Seite im Standarddesign anzeigen : Skalierung der Analogwerte
Hallo!
Ich habe den JoyPad am AVR angeschlossen.
Ich möchte gerne dass bei Nullstelung des Joysticks die Variable im Programm Wert 0 hat. Wenn der Joystick nach oben bewegt wird, soll der Wert sich auf 100 erhöhen (Endwert = 100). Bewege ich den Joystick nach unten, soll der Endwert -100 erreichen.
Zur Zeit sieht es so aus.
Wert bei Mittelstellung: 516
Endwert nach oben: 4
Endwert nach unten: 1023
Irgendwie muss ich es ja umrechnen. Allerdings ist Mathe nicht so ganz mein Fall.
Könnte mir jemand evtl. helfen?
bis dann,
Nico
Alle Angaben ohne Gewährleistung :D
Einfach mit 2 Geradengleichungen wenns genau sein soll
Also wenn dein Wert > 516 ist
k=-100/507 d=17200/169
und Wert < 516
k=-25/128 d=3225/32
Und sonst nimmst du halt nur eine der beiden und hast halt geringe Abweichungen
entweder -99.0234 satt -100 oder 100.986 statt 100
y=kx+d
(ich hoff das alles stimmt auch)
mfg Axi
Hallo
hier die Berechnung laut Axi in eine Funktion verpackt. Die Faktoren sind so gewählt, dass die gesamte Berechnung im Integer-Typ abgewickelt werden kann.
Declare Function Skalierung (pInput as Word) as Integer
Dim wInput as Word
Dim iSkala as Integer
for wInput = 0 to 1023
iSkala = Skalierung (wInput)
Print wInput; " " ; iSkala
next
end
Function Skalierung (pInput as Word) as Integer
' Nullpunkt herstellen
Skalierung = pInput - 516
' Wertebereich hat unter 0 einen Faktor von 5,12 (512/100)
' über 0 einen Faktor von 5,07 (507/100)
' daher werden diese in zwei verschiedenen Wegen berechnet
' Um eine aufwändige Berechnung mit Fließkommazahlen zu vermeiden
' werden diese Faktoren mit 32/163 (=1/5,09375)
' und 32/162 (=1/5,0625)
' Genauer wäre für den Bereich unter 0 die Faktoren 32/164 (=1/5,125)
' Hier wird aber 4 (sollte -100) in der Ganzzahlenarithmetik auf -99 abgeschnitten
' * 32 ist beiden Bereichen gemeinsam
Skalierung = Skalierung * 32
select case Skalierung
case is < 0
Skalierung = Skalierung / 163
case is > 0
Skalierung = Skalierung / 162
end SELECT
End Function
Ich glaube, ich habe es berechnet. Für die Berechnung der erforderlichen Werte habe ich kleine Excel-Tabelle erstellt. In letzter Spalte wird Ergebniss der Berechnung angezeigt. Über die Formel kann man auch den Berechnungsweg nachvollziehen. Die Tabelle hänge ich an.
Aber jetzt ein weiteres Problemm:
Ich habe Variable joy1x als Word deklariert und das ist der Originalwert.
Die variable Joy1_x soll der skalierter Wert sein und ist als Integer deklariert.
Die Formel sieht so aus: Joy1x_skal = (joy1x / (-5.04)) + 100 + 0.6
Die Korrekturwerte sind aus der Berechnung.
Meine Frage: wie soll diese Formel geschrieben werden, damit die Bascom-Syntaxprüfung es akzeptiert?
Pack die Tabelle ins Flash ... ist min 100 mal schneller wie deine Formel (Berechnungen mit Komma und Divisionen dauern nunmal sehr lange ...)
Was meinst Du genau damit?
Die Berechnungen müssen ja trotzdem gemacht werden, weil jedes einzelnes Wert umgerechnet werden muss (analog halt)
Naja, du hast doch jetzt die Werte in deiner Excel Tabelle stehen oder ?
Diese könnte man ins Flash packen (jedenfalls würde ich es so in Assembler machen ....)
Ja, aber was bringt mir das ?
Die Berechnung Joy1x_skal = (joy1x / (-5.04)) + 100 + 0.6 muss ich immer noch machen.
Und ich suche immer noch nach der richtiger Schreibweise für die Formel, dann kann ich es testen.
Ja, aber was bringt mir das ?
Die Berechnung Joy1x_skal = (joy1x / (-5.04)) + 100 + 0.6 muss ich immer noch machen.
Und ich suche immer noch nach der richtiger Schreibweise für die Formel, dann kann ich es testen.
soviel ich weiss muss man in Bascom Gleichungen immer so zerlegen, das rechts nur 2 Argumente stehen.
Also:
Joy1x_skal = joy1x / -5.04
Joy1x_skal = Joy1x_skal + 100
Joy1x_skal = Joy1x_skal + 0.6
Ich habe es gerade auch festgestellt.
Es ergibt sich folgender Code:
Config Portf = Input
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim Joy1x As Integer
Dim Joy1x_temp As Integer
Dim Joy1x_skal As Integer
Start Adc
Do
Joy1x = Getadc(1)
Joy1x_temp = Joy1x / -5.03
Joy1x_skal = Joy1x_temp + 100.8
Print #2 , "Joystick 1 Position: X=" ; Joy1x_skal
Wait 1
Loop
End
Aber es braucht noch den Feinschliff, da die Werte noch nicht ganz passen.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.