- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: Skalierung der Analogwerte

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.05.2004
    Ort
    Meppen
    Alter
    47
    Beiträge
    51

    Skalierung der Analogwerte

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.06.2006
    Beiträge
    151
    Alle Angaben ohne Gewährleistung
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    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.

    Code:
    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
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.05.2004
    Ort
    Meppen
    Alter
    47
    Beiträge
    51
    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?
    Angehängte Dateien Angehängte Dateien

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Pack die Tabelle ins Flash ... ist min 100 mal schneller wie deine Formel (Berechnungen mit Komma und Divisionen dauern nunmal sehr lange ...)

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    20.05.2004
    Ort
    Meppen
    Alter
    47
    Beiträge
    51
    Was meinst Du genau damit?
    Die Berechnungen müssen ja trotzdem gemacht werden, weil jedes einzelnes Wert umgerechnet werden muss (analog halt)

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    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 ....)

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    20.05.2004
    Ort
    Meppen
    Alter
    47
    Beiträge
    51
    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.

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Zitat Zitat von Nico99
    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

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    20.05.2004
    Ort
    Meppen
    Alter
    47
    Beiträge
    51
    Ich habe es gerade auch festgestellt.
    Es ergibt sich folgender Code:
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen