PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Skalierung der Analogwerte



Nico99
10.08.2006, 19:00
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

Axi
10.08.2006, 21:44
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

oe9vfj
11.08.2006, 10:01
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

Nico99
11.08.2006, 13:09
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?

Hanni
11.08.2006, 13:40
Pack die Tabelle ins Flash ... ist min 100 mal schneller wie deine Formel (Berechnungen mit Komma und Divisionen dauern nunmal sehr lange ...)

Nico99
11.08.2006, 14:16
Was meinst Du genau damit?
Die Berechnungen müssen ja trotzdem gemacht werden, weil jedes einzelnes Wert umgerechnet werden muss (analog halt)

Hanni
11.08.2006, 15:20
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 ....)

Nico99
11.08.2006, 18:28
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.

Hanni
11.08.2006, 18:31
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

Nico99
11.08.2006, 18:53
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.