Jump to content
elektro-skateboard.de

Wii Nunchuck mit Teensy 3.1


barney

Empfohlene Beiträge

Geschrieben

Nehme an, Du möchtest die Differenz der beiden Kurven approximieren? Bei Polyomen höherer Ordnung bekommst Du vermutlich Schwingungen mit rein. Ich könnte mir vorstellen, dass ein Spline da ganz gut passen - kannst Du bitte mal ein Bild der Kurve schicken, die Du annähern möchtest?

 

So rein vom Draufstehen sieht das aus, als ob die hochgerechnete und die tatsächliche Kurve sich mit einem Offset und einer Drehung ganz gut ineinander überführen lassen. Kannst ja mal ein Excel mit den Werten schicken? Wenn's nicht ganz so eilt finde ich bestimmt eine Matlab Lizenz mit Curve-Fitting Toolbox.

Geschrieben (bearbeitet)
Nehme an, Du möchtest die Differenz der beiden Kurven approximieren? Bei Polyomen höherer Ordnung bekommst Du vermutlich Schwingungen mit rein. Ich könnte mir vorstellen, dass ein Spline da ganz gut passen - kannst Du bitte mal ein Bild der Kurve schicken, die Du annähern möchtest?

 

So rein vom Draufstehen sieht das aus, als ob die hochgerechnete und die tatsächliche Kurve sich mit einem Offset und einer Drehung ganz gut ineinander überführen lassen. Kannst ja mal ein Excel mit den Werten schicken? Wenn's nicht ganz so eilt finde ich bestimmt eine Matlab Lizenz mit Curve-Fitting Toolbox.

 

Ich habe auch was über die Linearisierung mittels Splines gelesen. In der angehängten Excel Tabelle habe ich mit Offset und Drehung gearbeitet. Die Werte zwischen 25V bis 31V sind akzeptabel. In Scilab findet man auch Kurve Fitting Tools, ich benötige aber die Koeffizienten für die Abbildung im Teensy.

 

Vielen Dank

 

Barney

 

Edit:

Externe Links nur für Mitglieder sichtbar

teensy.zip

735000447_Teensy_Linearitt.png.3288530d1eca1a448399115286fef3f7.png

bearbeitet von barney
Geschrieben

Ich stehe noch begrifflich auf dem Schlauch. Ich will ja nicht nur ein Spline durchlegen, sondern auch die Werte Mappen. Ich komme nicht auf die richtigen Begriffe für Matlab und Scilab. Das ist doch Messtechnischer Standard .....

Geschrieben

Ich hab das Vorgehen so verstanden: Du hast die tatsächlichen Werte (="angelegt") und die Werte, die der Teensy zunächst misst (="Teensy"). Von den beiden Kurven wird die Differenz gebildet. Die "Differenzkurve" (x-Achse: "Teensy-Spannungen", y-Achse: Korrekturwerte) möchtest Du durch ein Polynom o.ä. annähern um dann im Betrieb die "Teensy" Werte zu korrigieren?

Geschrieben
Ich hab das Vorgehen so verstanden: Du hast die tatsächlichen Werte (="angelegt") und die Werte, die der Teensy zunächst misst (="Teensy"). Von den beiden Kurven wird die Differenz gebildet. Die "Differenzkurve" (x-Achse: "Teensy-Spannungen", y-Achse: Korrekturwerte) möchtest Du durch ein Polynom o.ä. annähern um dann im Betrieb die "Teensy" Werte zu korrigieren?

 

Da können mehrere Ansätze gefahren werden.

 

1. Mapping der Werte durch mehrere Stützstellen und lineare Interpolation.

2. Polynom durch die Teensy Messkurve legen und Korrekturdifferenz berechnen.

Geschrieben

Ich hab mir die Differenzwerte angesehen ... und die könnte man (auf den ersten Blick) durch einen Spline approximieren (die Grafik bekomme ich aber nicht in meinen Post eingebunden, da wir eine andere, die nicht von mir stammt, angezeigt).

Geschrieben (bearbeitet)
Ich hab mir die Differenzwerte angesehen ... und die könnte man (auf den ersten Blick) durch einen Spline approximieren:

 

Mann muss nicht immer in die Ferne schweifen....

 

Mit Libre Office oder Excel (nur bis zur 3 Ordnung) kann man die Polynome bestimmen. Leider Rundet Excel zu früh, so das Polynome > 3 Ordnung nur Schrott sind.

 

Es war zu trivial:

 

Die beiden Achsen angelegt und Teensy in ein XY-Diagagram anzeigen lassen. Die Teensy-Werte sind die X-Achse. Dann eine Trendlinie in den Graphen einzeichnen lassen. Hier Linear oder Poly auswählen. Die Formel dazu anzeigen lassen und in die Tabelle kopieren. x durch *B2^ ersetzen und das wars. Bis auf +- 10mV genau.

Teensy Linearität 22.04.2015.zip

bearbeitet von barney
Geschrieben

Für Scilab Nutzer:

 

function p = polyfit(x, y, n)
 if length(x) ~= length(y)
   error('x and y vectors must be the same size')
 end 

 x = x( : );
 y = y( : );
 V = ones(length(x), n+1); 

 for j = n : -1 : 1
   V(:, j) = x .* V (:, j+1);
 end 

 [Q, R] = qr(V);
 QTy = Q' * y;
 p = R(1 : n+1, 1 : n+1) \ QTy(1 : n+1);
 p = p.';
endfunction

Polynom dritter Ordnung:

y auf x Normieren

p=polyfit2(y,x,3)

 

--> x  =  20.    23.    25.    27.    29.    31.
--> y = 20.77    23.38    25.14    26.93    28.53    30.15 

--> p=polyfit2(y,x,3)
p  =  0.0015586  - 0.1118917    3.8060089  - 24.744834

--> 0.0015586*20.77**3  - 0.1118917*20.77**2  +  3.8060089*20.77**1  - 24.744834
ans  =  20.001789

Damit kann man fahren.

 

Edit:

 

--> 0.0015586*y**3  - 0.1118917*y**2 +   3.8060089*y**1  - 24.744834
ans  = 20.00    22.99    24.98    27.04    28.95   31.01
--> x  =  20.    23.    25.    27.    29.    31.

Geschrieben

Ich hab die Differenzenwerte gerade auch durch Excel approximiert ... wie Du sagst, ab 3.Ordnung sieht es auf dem Diagramm sehr gut aus, die ausgegebenen Koeffizienten sind aber nur Schrott. Achtung: bei den Polynomen hoher Ordnung ist wichtig, dass Du die Korrekturwerte über den maximalen Wertebereich ermittelst ... außerhalb hauen dir die sonst so was von weg !!!

 

P.S.: Verdammte Axt, wie schaff ich es, dass die angehängte Datei richtig angezeigt wird??????

Geschrieben
Ich hab die Differenzenwerte gerade auch durch Excel approximiert ... wie Du sagst, ab 3.Ordnung sieht es auf dem Diagramm sehr gut aus, die ausgegebenen Koeffizienten sind aber nur Schrott. Achtung: bei den Polynomen hoher Ordnung ist wichtig, dass Du die Korrekturwerte über den maximalen Wertebereich ermittelst ... außerhalb hauen dir die sonst so was von weg !!!

 

P.S.: Verdammte Axt, wie schaff ich es, dass die angehängte Datei richtig angezeigt wird??????

 

Kann ich dir nicht sagen, was da los ist.

 

Ich habe jetzt Polynome bis zur 5 Ordnung mit den Werten verglichen. Die Grafen sind mehr die Freude eines Einzelnen.

 

Grün = so sollte der Verlauf sein

Schwarz = Poly 3 Ordnung

Rot = Poly 6 Ordnung

Blau = so misst der Teensy

 

Ergo Lineare Interpolation oder das Polynom dritten Grades fittet am besten. :peace:

330321055_Grafik-FensterNummer0.thumb.png.8a91d5e2b682de1dc97c046fce3a4b10.png

Geschrieben
Dann eben mit zip Anhang.

 

OK! Welche Erkenntnis ziehen wir daraus?

 

Lassen wir die Widerstände so wie sie sind und benutzen ein Polynom 3 Ordnung?

10 Werte messen und in einer Tabelle eintragen sollte nicht die Schwierigkeit sein. Mit Libre Office oder Scilab kann man das Polynom bestimmen und die Werte in das Programm eintragen. Die Rechenzeit sollte sich in Grenzen halten.

 

Jetzt ist nur noch die Formel in die Software als Funktion einbringen! Mehr machts? Die Schweizer?

 

VG

 

Barney

 

 

Edit:

 

Und nächste Woche gibt es wieder eine Folge

 

"Spaß mit Scilab"

Geschrieben

Klassischerweise macht man in diesem Fall eine Open-Point-List im Wiki Beitrag auf. Dann gerät's schon nicht in Vergessenheit ... :thumbsup:

 

Die spannende Frage ist, ob die Korrekturfunktion bei allen Akkuspannungen bzw. zugehörigen Spannungsteilern die gleiche ist? Kannst Du das beurteilen?

Geschrieben
Klassischerweise macht man in diesem Fall eine Open-Point-List im Wiki Beitrag auf. Dann gerät's schon nicht in Vergessenheit ... :thumbsup:

 

Die spannende Frage ist, ob die Korrekturfunktion bei allen Akkuspannungen bzw. zugehörigen Spannungsteilern die gleiche ist? Kannst Du das beurteilen?

 

Plopp -> geistige Implosion!

Geschrieben
Klassischerweise macht man in diesem Fall eine Open-Point-List im Wiki Beitrag auf. Dann gerät's schon nicht in Vergessenheit ... :thumbsup:

 

Die spannende Frage ist, ob die Korrekturfunktion bei allen Akkuspannungen bzw. zugehörigen Spannungsteilern die gleiche ist? Kannst Du das beurteilen?

 

Ich vermute schon, das die Abweichungen bei uns allen gleich sind. Eine Kombination aus Austausch der Widerstände und Einführung des Polynoms wird der Ansatz sein. Ich werde einfach eine Excel Tabelle für 10 Messwerte zur Verfügung stellen und jeder kann sich dann das Polynom 3 Grades generieren und Koeffizienten abschreiben. Das sollte kein Drama sein. Wer das nicht möchte, kann mit meinen default Werten leben. Der BamBam Controller ist auch kein Messinstrument. Der Controller soll nicht völlig daneben liegen, aber 20mV sind hinnehmbar.

 

Wiki Eintrag mache ich in den nächsten Tagen.

 

VG

 

Barney

Geschrieben

Schande,

 

ich bin gestern von zwei angehenden Programmieren zu der Polynom Thematik ausgelacht worden. Das wären wohl die Anforderungen im Grundstudium Informatik und zum Lösen eines Polynoms 3 Ordnung benötigt man nur ein Blatt Papier und ein Bleistift oder 10 Zeilen C-Code. :mad:

 

Heul

 

Und dann kam noch so was despektierliches wie "Wenn der Hardware Entwickler (wieder mal) Mist gebaut hat, muss der Programmierer den Pfusch ausgleichen."

  • 2 weeks later...
Geschrieben
Braucht noch wer solch eine Empfängerplatine für die Wii Steuerung?

Bestellmenge ist wohl 6 und ich nehm erstmal 2 also wer noch ein Longboard oder Trampa baut, das wäre die Gelegenheit!

 

Am 11.05.2015 7 Stück bestellt.

2 Chrizz

1 Barney

Rest - frei!

Geschrieben

Polynom ist jetzt im Grundsatz erledigt und wird im Code eingearbeitet.

 

// Die Spanungsmessung ist nicht linear daher Polynom dritter Ordnung
#define PolynomX0 (float) 24.744834   // Polynom 3 Grades für die Korrektur der Messverzerung Spannung
#define PolynomX1 (float) 3.8060089   // Polynom 3 Grades für die Korrektur der Messverzerung Spannung
#define PolynomX2 (float) 0.1118917   // Polynom 3 Grades für die Korrektur der Messverzerung Spannung
#define PolynomX3 (float) 0.0015586   // Polynom 3 Grades für die Korrektur der Messverzerung Spannung
#define UBatPoly (float) ( PolynomX3 * pow(Ubatt,3) - PolynomX2 * pow(Ubatt,2) + PolynomX1 * Ubatt - PolynomX0 )

void setup() {
 Serial.begin(9600);
}

void loop() {
 float Ubatt = 20.77 ;//
 Serial.println(Ubatt);
 Serial.println(UBatPoly);
 delay (1000);
}

Geschrieben

Die Messwertkorrektur ist einarbeitet und verbesserte die Messergebnisse, die eine Abweichung von bis zu 1V hatten, auf 50mV. Das Fenster bei mir ist von 18V bis 32V, mit dieser Genauigkeit. Als nächstes ist der Stromsensor dran

Geschrieben

Da habe ich keine Hoffnung, diesen besonders genau zu bekommen. Im Datenblatt ist zu finden, dass durch die Remanenz des magnetischen Materials im ACS756, der Fehlerstrom bis zu 230mA betragen kann, wenn der Stromsensor für 50A mit 100A gesättigt wurde.

 

Edit:

Weiter ist der ACS756 für 5.0V getrimmt worden und nicht für 3.3V, wie ich ihn einsetze. Da kommen weitere Fehler hinzu. Vom 200A Typ gibt es eine 3.3V Variante. Bei 100A bin ich mir momentan nicht sicher.

 

Ansonsten werde ich die selbe Methode wie bei der Spannungsmessung testen, ob man nicht noch mehr Genauigkeit rausholen kann.

Geschrieben

Gibt da noch einen Zusatz in den Notes:

Customers that plan to operate the device from a 3.3 V regulated supply should contact their local Allegro sales representative regarding

expected device accuracy levels under these bias conditions.

 

Ich verwende die ACS758-100B. Die sind mit 100 mA Fehler nach 50 A Belastung angegeben. Besonders genau sind diese Sensoren allgemein nicht, besonders bei niedrigen Strömen. Daher ist es auch nicht von Vorteil einen 200A Sensor einzubauen, wenn die meiste Zeit eh nur < 5 A fließen. Die höchste Genauigkeit sollte bei dem Strom liegen, der am häufigsten fließt. Sind bei meinem Board um 10 A, darauf habe ich auch abgeglichen. Passt auch ganz gut, obwohl ich mit 10 bit nur eine Auflösung von 0,25 A generieren konnte.

 

Bei 3,3V Versorgung läuft Dir der Sensor aber früher in die Begrenzung, da ja nicht soviel Spannungshub zur Verfügung steht. Da musst Du wahrscheinlich schon den 200 A nehmen und mit der geringeren Sensitivität leben...

Geschrieben
Gibt da noch einen Zusatz in den Notes:

 

 

Ich verwende die ACS758-100B. Die sind mit 100 mA Fehler nach 50 A Belastung angegeben. Besonders genau sind diese Sensoren allgemein nicht, besonders bei niedrigen Strömen. Daher ist es auch nicht von Vorteil einen 200A Sensor einzubauen, wenn die meiste Zeit eh nur < 5 A fließen. Die höchste Genauigkeit sollte bei dem Strom liegen, der am häufigsten fließt. Sind bei meinem Board um 10 A, darauf habe ich auch abgeglichen. Passt auch ganz gut, obwohl ich mit 10 bit nur eine Auflösung von 0,25 A generieren konnte.

 

Bei 3,3V Versorgung läuft Dir der Sensor aber früher in die Begrenzung, da ja nicht soviel Spannungshub zur Verfügung steht. Da musst Du wahrscheinlich schon den 200 A nehmen und mit der geringeren Sensitivität leben...

 

Bei der geringen Stückzahl, die ich benötige, brauch ich keinen Versuch bei dem Hersteller zu starten. Da mein System (Skateboard) nicht groß über 50A gehen kann, habe ich den ACS756-050 im Einsatz. Leider hat mit 3.3V und nicht 5V.

Da eine Ruhestrommessung nicht sinnig ist, stimme ich dir zu, versuche ich den Sensor auf 10-15A abzugleichen. Üblicher weise benutze ich Halogenlampen als ohmsche Last für den Abgleich.

Hätte ich nicht die Potentialfreiheit benötigt, wäre der klassische Shunt Mittel der Wahl. Ja, es gibt Schaltungen mit OPs, dass wollte ich aber keinen antun.

 

Was mich nur nachdenklich stimmt, dass viele ESC-Schaltungen diese Stromsensoren einsetzen. Für den Toshiba ESC bin ich kurz vor der Entscheidung, einfache Shunts zu benutzen. Meine Tests basierten bisher auf ACS756-050 und funktionierten so, wie ich es erwartet habe.

 

VG

 

Barney

Geschrieben
Gibt da noch einen Zusatz in den Notes:

 

 

Ich verwende die ACS758-100B. Die sind mit 100 mA Fehler nach 50 A Belastung angegeben. Besonders genau sind diese Sensoren allgemein nicht, besonders bei niedrigen Strömen. Daher ist es auch nicht von Vorteil einen 200A Sensor einzubauen, wenn die meiste Zeit eh nur < 5 A fließen. Die höchste Genauigkeit sollte bei dem Strom liegen, der am häufigsten fließt. Sind bei meinem Board um 10 A, darauf habe ich auch abgeglichen. Passt auch ganz gut, obwohl ich mit 10 bit nur eine Auflösung von 0,25 A generieren konnte.

 

(Nur zum Verständnis für die anderen Leser!)

2^10 = 1024, 200A/2^10 ~ 200mA/bit,

 

vielleicht erwarte ich zu viel Genauigkeit. +-50mV für die Spannungsmessung sollte auch reichen. Wenn ich die Koeffizienten noch mal neu bestimme, bekomme ich sicherlich auch +-25mV hin. Das 12S Batteriemesssystem soll nachher auf +-180mV und +-10mV pro Zelle an Genauigkeit erreichen.

Geschrieben

Hallo zusammen

Ich find die Steuerung mit dem nunchuck is ne feine Sache! Habe eins zuhause rumliegen und würde mir gern einbauen... Problem ich hab kein Plan von was ihr hier redet hab etliche Seiten hier durchgelesen und bin auch nicht schlauer geworden! Kann mir jemand helfen was ich dazu brauch oder gleich so ein Teil bauen damit ich es einfach einstecken kann und loslegen kann falls es möglich ist! Hab mal ein Teil gefunden auf diyelektroskateboard aber was das programmieren angeht da Blick ich so garnicht durch

Tritt dem Gespräch bei

Du kannst jetzt posten und dich später registrieren. Wenn du bereits einen Account hast kannst du dich hier anmelden.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...