Kannst du deinen Code anfügen? Würde mich interessieren
Ich habe jetzt die Auswertung der Rohdaten (Register 10-13) für x und y (atan2(y,x) damit Werte im Kompasswinkel rauskommen) hinzugefügt:
Damit wird der aktuelle Kompasswinkel schnell und sicher berechnet, die Werte werden 4x pro Sekunde abgefragt und sind jedesmal aktualisiert. Kalibriert ist da in der Auswertung noch gar nichts.
Der vom CMPS10 selbst berechnete Winkel (Register 2+3) dagegen stimmt nur im Bereich zwischen 0 und PI/2, und kommt mit neuer und zurückgestellt auf Werkskalibrierung nie über PI hinaus. Und bis sich hier ein stabiler neuer Wert einstellt vergehen schon mal ein 1-2 Sekunden, da wie oben erwähnt die Auswertung der Beschleunigungssensoren 640ms dauert, und ein paar Durchläufe für stabile Werte benötigt werden.
Also ich bleib mal bei der Auswertung der Rohdaten, keine Ahnung warum mein CMPS10 selbst so falsche Werte berechnet.
LG!
alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)
Kannst du deinen Code anfügen? Würde mich interessieren
Hier der Code der Funktion, die Ergänzung ist schnell hingepfuscht. Ich verwende als Winkel Radiant*1000, dh PI/2 ist hier 3141 um in weiteren Berechnungen die schnelleren Integervariablen verweden zu können.
Code:static inline void Kompass() { unsigned short h,l; short x,y,xx,yy,kompass_x;//,offset_x,offset_y; double temp; //offset_x=-125;offset_y=15; if(!(i2c_start(Adresse_Kompass))) { i2c_write(2); // register i2c_rep_start(Adresse_Kompass+I2C_READ); // restart h=i2c_readAck(); l=i2c_readAck(); kompass_akt=uniq(l,h); l=i2c_readAck();//4 l=i2c_readAck();//5 l=i2c_readAck();//6 l=i2c_readAck();//7 l=i2c_readAck();//8 l=i2c_readAck();//9 h=i2c_readAck();//10 l=i2c_readAck();//11 xx=uniq(l,h); h=i2c_readAck();//12 l=i2c_readNak();//13 yy=uniq(l,h); i2c_stop(); x=xx-(-125); // Offset Test y=yy-15; // Offset Test temp=1000*atan2(y,x); // für Kompasswinkel kompass_x=(short)temp; if (kompass_x<0) kompass_x=kompass_x+6282;richtung_kom=(kompass_akt/10); // Umrechnen rad*1000richtung_kom=(richtung_kom*35)/2;// für Testauswertung debug_eins=richtung_kom; debug_zwei=kompass_x;debug_fuenf=xx; debug_sechs=yy;} else richtung_kom= (-9999); // verwerfen wenn keine neuen Daten vorhanden }
alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)
Lesezeichen