Tabelle mit Wertebereichen.

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Tabelle mit Wertebereichen.

      Hallo,

      ich hätte gern mal ein Problem :D .

      Es soll eine lineares Potentiometer über den 10Bit ADC eines Mega2560 ausgewertet werden und der Schleiferstand logarithmisch per SPI in 8Bit an ein Digipoti ausgegeben werden.
      Ich habe mir eine Tabelle erstellt die mit 1-1024 und die entsprechenden 8Bit Werte dahinter. Um Platz zu sparen würde ich nur die 256 Werte eintragen und im Programm Wertebereiche verwenden z.B. 970-1024 -> 256, 920-970 -> 255 usw.
      Wie kann man das realisieren? Oder ist die 1024 Wertetabelle sinnvoller?

      Viele Dank für eure Hilfe!
    • @Picard dein Digitalpoti kann nur 8Bit und du willst 10Bit einlesen, dann teile deinen ADC-Wert einfach durch 4 und du hast immer den richtigen Wert für dein Poti.
      Ganz ohne Tabelle. Du musst nur dafür sorgen, dass dein ADC-Wert nicht kleiner als 4 werden kann.
      Ich denke mal, dass man den ADC auch als 8Bit konfigurieren kann.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Wenn ich das richtig verstehe, soll eine logarithmische Ausgabe erfolgen.

      Das ist auch recht einfach zu machen.

      Den ADC-Wert mit Function Log10 logarithmieren und dann mit einem Faktor ca. 84 multiplizieren.
      So bekommt man eine Logarithmische Ausgabe bei linearem Eingangswert.

      Code etwa so:

      BASCOM Source Code

      1. Dim adcValue as Integer
      2. Dim tmpSingle as Single
      3. Dim tmpPotiwert as Byte
      4. adcValue=getADC(0) ' linearer Wert holen
      5. Incr adcValue ' Werte-Bereich 1 bis 1024
      6. tmpSingle = adcValue ' in Single convertieren (casten)
      7. tmpSingle = log10(tmpSingle) ' Umrechnen in 10er-Log (ergibt Werte von 0 bis max 3,01)
      8. tmpSingle = tmpSingle * 85.3 ' Mit Faktor umrechnen auf Bereich 0 bis 255
      9. tmpPotiwert = tmpSingle ' Ergebnis in Byte wandeln
      Display All

      Faktor muss noch etwas genauer angegeben werden.

      Vielleicht soll's aber anstelle des 10er-Logarithmus der natürliche Logarithmus sein?
      Auch dafür hat Bascom eine Funktion: log()
      Das ergibt dann andere Werte (0 bis 6.93) und der Faktor muss angepasst werden, damit bei maximaler Eingabe die Ausgabe nicht über 255 steigt.

      Ist es das was du gesucht hast?
    • Danke für dir Antworten.

      Die 10Bit auflösung wird benötgit um dann nicht zu große Sprünge in den 8Bit Ausgangswerten zu erhalten.
      Der PGA2320 ist linear und somit muss man ihn mit angepassten Werten füttern.
      Mit logarithmischen Berechnugen hab ich es probiert, aber die Flanke ist am Anfang zu steil. Daher hab ich mir eine Tabelle erstellt. Ich hab mal einen Vergleich angehängt.
      Kann man die Formel noch etwas anpassen, damit der Anstieg etwas sanfter wird?
      Files
      • vergleich.jpg

        (93.76 kB, downloaded 7 times, last: )
    • Picard wrote:

      Kann man die Formel noch etwas anpassen, damit der Anstieg etwas sanfter wird?
      Deine Frage kann man mit ja beantworten.

      Du hast ja selbst festgestellt, dass der Logarithmus bei höheren Werten flacher wird.
      Es spricht also nichts dagegen, dem ADC-Wert einen relativ hohen Offset mitzugeben.
      Natürlich muss man dann das Ergebnis wieder korrigieren.
      Denn die Werte liegen dann in einem anderen Bereich.
      Als Korrektur kann man dann wieder einen Offset vom Ergebnis bei ADCWert=0 abziehen und dann wieder mit Faktor multiplizieren, um die 255 bei maximaler Aussteuerung zu erreichen.

      Etwa so:

      Offset1 = 500 ' Wert ausprobieren

      ADC-Wert = 0 annehmen und Ergebnis mit Log berechnen.
      ADCWert = 1023 annehmen und Ergebnis mit Log berechnen

      Das ergibt 2 Werte, in denen sich das Ergebnis bewegt.
      ErgebnisMin = Log(ADCWert-Min + Offset1) = 6,21
      ErgebnisMax = log(ADCWert-Max + Offset1) = 7,3

      Jetzt soll aber der Ausgabewert bei 0 anfangen. Also ist dein Offset2 (der gilf für Ausgang) = ErgebnisMin.

      Offset2 = ErgebnisMin

      Daraus ergibt sich ein Ausgabebereich von (6,21 - Offset2) bis (7,2 - Offset2), also von 0 bis 0,99)

      Jetzt noch der Faktor damit man von 0,99 auf 255 kommt:

      Faktor = 255 / 0,99 / 257,58

      Das kannst du alles in Excel eingeben und den Offset1 machst du einstellbar.
      Dann kannst du schön die Kurve raus suchen, die du möchtest.

      Hier drei Ausgaben mit Werten für Offset1 = 1, 50 und 150

      Offset_1.png
      Offset_50.png
      Offset_150.png

      The post was edited 1 time, last by Mitch64 ().

    • Das war keine Arbeit. In Excel ging das keine 10 Minuten, die Diagramme zu erstellen.

      Kommst du mit der folgenden Beschreibung besser klar?


      ' Offset1 flacht die logarithmische Kurve ab, den Wert legst du fest!
      Offset1 = 50 ' Bereich 1 bis 150


      ' Grundformel
      ' Mit ihr wird der log. Ausgabewert ermittelt wird.
      ' Der Offset2 und der Faktor muss aber vorher berechnet sein und hängt ab von Offset1.
      Ausgabe = (Log(ADCWert + Offset1) - Offset2) * Faktor


      ' Berechnung Offset2
      ' Offset2 ist der der kleinste Ausgabe-Wert ohne Faktor bei ADC-Wert = 0 (die 0 steht für ADCWert = 0)
      Offset2 = Log(0 + Offset1)


      ' Berechnung Faktor
      ' Durch den Offset2 ergibt sich natürlich eine geringere Obergrenze für den Ausgabewert.
      ' Daher den Wert berechnen mit max. ADC-Wert. Die 255 in der Formel steht für den max. Ausgabewert.
      Faktor = 255 / (Log(1023 + Offset1) - Offset2)
    • Sehr schön, jetzt funktioniert es wie ich mir das vorstelle.

      Ich bin von der Kompetenz und der Hilfsbereitschaft echt begeistert.

      Auch wenn das Thema jetzt anders geklärt wurde, möchte ich aus reinem Interesse wissen ob man Tabellen mit Wertebereichen versehen kann oder muss man den abgelegten Wert genau treffen?
    • Natürlich kann man auch eine Tabelle erstellen.
      Die Werte muss man eben vorher berechnen, z.B. mit Excel, und dann in die Tabelle übernehmen.

      Der Wert muss nicht genau getroffen werden.
      Wenn der gesuchte Wert zwischen zwei Tabellenwerten liegt, kann man interpolierien.

      Sowas kann man machen, wenn die Berechnung mit Log etc für eine Anwendung zu lange dauert.
      Werte aus einer Tabelle suchen geht natürlich schneller.

      Hat aber den Nachteil, dass es etwas ungenauer wird. Die Ungenauigkeit hängt wieder mit den Abständen der Werte in der Tabelle zusammen.

      Also ja, man kann auch Tabelle nehmen und der Wert muss nicht genau treffen.