PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CMPS10 Genauigkeit



filth
24.02.2013, 19:49
Hallo,

ich habe irgendwie leichte Schwierigkeiten mit dem Kompass.

Ich habe eine sich drehende Plattform aus Holz. Ganz außen ist der Kompass angebracht. Die Plattform dreht sich um den Punkt "o"

------o----X--

Wenn ich die Plattform nun um 90° drehe, weicht der abgelesene Kompasswert um ca 10° ab.
Sind die Sensoren so ungenau oder muss noch etwas kalibriert werden? Sollte ja auch in geschlossenen Räumen funktionieren - dem Magnetfeld ist es ja egal "wo".

Hat evtl jemand einen Rat?

Danke

Cyclon
24.02.2013, 20:28
Datenblatt des Kompasses lesen, Seite 15. Dort steht was über die Genauigkeit und die Fehleranfälligkeit. (Edit: Meine Antwort bezieht sich auf das autmatisch verlinkte Datenblatt für den CMPS03)

Oder anderen Kompass ausprobieren, z.B.
http://teske-electronics.de/product_info.php?products_id=347 für 3.3 - 5V
http://www.watterott.com/de/LSM303-Breakout-Board für 1.8V

filth
24.02.2013, 20:35
Ja, der CMP10 ist mit etwa 4° Genauigkeit angegeben - das ist aber viel genauer als das, was ich auf meinem Tisch feststelle. Ich frage mich nur warum.

Cyclon
24.02.2013, 20:43
Ich würd's mal mit Kalibrieren versuchen. Wenn ich mit Google nach cmps10 suche finde ich an 4. Stelle eine Doku in der erklärt wird, wie die Kalibrierung abläuft.

PICture
24.02.2013, 21:11
Hallo!


Sollte ja auch in geschlossenen Räumen funktionieren - dem Magnetfeld ist es ja egal "wo".

Aber nicht genau zwischen Metalgegenständen im Raum, die die Feldlinien verzerren. ;)

filth
24.02.2013, 21:48
Hmm - auf meiner Plattform befindet sich ein Halter aus Metall (diese Baumarktwinkel) in Form von einem "U"

...|_|.....x

so sieht es von der Seite aus. x ist der Sensor.
Könnte das Teil schon stören? Falls ja, sollte die Störung nicht "linear" sein?

oberallgeier
25.02.2013, 08:13
... auf meiner Plattform befindet sich ein Halter aus Metall (diese Baumarktwinkel) ...Aus Metall!? Kupfer=Metall=unmagnetisch, Alu=Metall=unmagnetisch, U-Magnet=Metall=ziemlichmagnetisch*ggg*, Mu-Metall=Metall(meist zum Abschirmen von Magnetfeldern), Flach-/Winkeleisen(heisst eher "Stahl")=Metall=magnetisch-störend. Die Auswahl - selbst im Baumarkt - ist groß, ein Baumarkt schreibt aber meist dazu was für ein Metall das ist.

damfino
25.02.2013, 12:14
Probiers mit einer neuen Kalibrierung, aber weit weg vom Schreibtisch, Heizkörpern, oder allen anderen großen Metallteilen. Dann geht es so halbwegs.
Zusammen mit den Beschleunigungssensoren ist der Kompass etwas träge, er braucht 640ms um einen neuen Wert zu berechnen. Daher mal langsam die Plattform drehen.
Ich will eine eigene Software für die Auswertung der Rohdaten basteln, aber kennt einer eine Methode wie man die Werte kalibriert?
LG!

Andre_S
25.02.2013, 14:04
Hallo,

also der CMPS10 ist recht genau, deine 10° sind absolut nicht nachvollziebar...
Ich habe 2, brauchte bisher keinen Nachkalibrieren, dies kannst Du allerdings gern tun, man kann ihn ja wieder auf Werkskalibrierung zurücksetzen. Wichtig ist wirklich, je nach Metallart und Größe recht weit weg zu bleiben. Schon kleinere Teile welche man so im Bot verwendet störten bei mir bereits in 15cm Nähe. Eventuell kannst Du das Teil mit einem "Nichtmetallstab" von der Plattform (vielleicht nach oben) absetzen, natürlich weiß ich nicht ob dies bei Dir geht.
Also ich lese auf Basis I²C in deutlich schnelleren Zyklen, nämlich im zweistelligen ms Bereich, aus, habe jetzt aber nicht ins Datenblatt geschaut, denke aber die 640ms sind sicher noch etwas anderes. Seriell und PWM habe ich allerdings keine Erfahrungen.

Also teste ihn nochmal, weit ab von Metallteilen und Flächen und am besten mit Examples welche dazu angeboten werden. Es sei denn Du bist sicher, dass kein Fehler in Deiner Software ist, ich habe keine Abweichung größer 3° bei mir feststellen können.

Gruß André

filth
25.02.2013, 19:32
Hallo,

ich konnte jetzt mein U testen. Die Teile sind magnetisch und mit Sicherheit für die Probleme verantwortlich. Ich überlege nun, ob ich das Teil umbaue oder den Sensor wegsetze.
Wahrscheinlich werden magnetische Teile in der Nähe immer für Probleme sorgen, daher ist mit Sicherheit der Umbau die beste Lösung.

Gruß
Alex

damfino
27.02.2013, 13:50
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!

filth
27.02.2013, 13:53
Kannst du deinen Code anfügen? Würde mich interessieren

damfino
27.02.2013, 16:01
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.



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*1000

richtung_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


}