Forum: Mikrocontroller und Digitale Elektronik ITG3200 Probleme Bascom


von Christian (Gast)


Lesenswert?

Hallo,
ich bin dabei ein Gyro ITG3200 per I2C Bus auszulesen und den absoluten 
Winkel auszurechnen (ja ich weiß das wegen Drift nicht lange stabil ist)
Mich interressiert eigendlich nur Drehung um die Z-Achse.
Auf jedenfall hab ich schon ein nettes Progrämmchen geschrieben, da ist 
aber der Wurm drin.
Wenn ich mein Steckbrett um 90 Grad drehe zeigt mein Display schon ein 
paar Hundert grad an, also da is was faul.

Also das auslesen per I²C ist denke ich richtig. Der Fehler tritt bei 
der Integration über die Zeot auf.
Ich habe jetzt eine Abtastrate von 1000 Messungen pro Sekunde.
Ich denke, das bei meinem Timer irgendwas schief geht. Timer hab ich 
damit berechnet http://evolutec.publicmsg.de/index.p...prescalertools
Vielleicht ist meine Sub Reed_gyro auch viel zu lang. Ich weiß leider 
nicht wie lange diese I²C Geschichte dauert.

Hier mal das Programm:
Vielleicht sticht euch was ins Auge
1
$regfile = "m644def.dat"
2
$crystal = 16000000
3
$hwstack = 50
4
$swstack = 50
5
$framesize = 50
6
7
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.5 , Db6 = Portc.6 , _
8
Db7 = Portd.7 , E = Portc.3 , Rs = Portc.4
9
Config Lcd = 16 * 4
10
Waitms 10
11
Initlcd
12
Cls
13
Waitms 50
14
Cursor Off Noblink
15
16
$lib "i2c_twi.lbx"
17
Config Scl = Portc.0
18
Config Sda = Portc.1
19
Config Twi = 400000
20
I2cinit
21
22
Config Timer1 = Timer , Prescale = 64
23
On Timer1 Isr_von_timer1
24
Timer1 = 65286
25
Enable Interrupts
26
Enable Timer1
27
28
Dim Temp_out_h As Byte
29
Dim Temp_out_l As Byte
30
Dim Gyro_xout_h As Byte
31
Dim Gyro_xout_l As Byte
32
Dim Gyro_yout_h As Byte
33
Dim Gyro_yout_l As Byte
34
Dim Gyro_zout_h As Byte
35
Dim Gyro_zout_l As Byte
36
37
Dim Temp_out As Word
38
Dim Gyro_xout As Integer
39
Dim Gyro_yout As Integer
40
Dim Gyro_zout As Integer
41
42
' adress: b110100X
43
' ADO ist high -> Bit 7 ist 1 -> adress = &H69
44
' Read Bit ist 1, write bit ist 0 an adresse anfuegen
45
Const Itg3200_w = &HD2
46
Const Itg3200_r = &HD3
47
48
Dim Grad_sec As Single
49
Dim Gyroangle As Single
50
Dim Angle As Single
51
Dim Ausgabe As String * 16
52
Dim Ausgabe_single As Single
53
54
Angle = 0
55
Gyroangle = 0
56
Waitms 100
57
58
Do
59
   Ausgabe = Fusing( Gyroangle , "###.###")
60
   Locate 1 , 1
61
   Cls
62
   Lcd Ausgabe
63
   Waitms 500
64
Loop
65
66
Isr_von_timer1:
67
   Timer1 = 65286
68
   Gosub Reed_gyro
69
   If Gyro_zout > -90 And Gyro_zout < 90 Then
70
      Gyro_zout = 0
71
   End If
72
   Grad_sec = Gyro_zout / 14.375                            'Skalierungsfaktor aus Datenblatt
73
   Angle = Grad_sec * 0.001                                 'Winkelgeschwinigkeit Mal 1ms
74
   Gyroangle = Gyroangle + Angle
75
Return
76
77
Reed_gyro:
78
   I2cstart
79
   I2cwbyte Itg3200_w
80
   I2cwbyte &H1B
81
82
   I2cstart
83
   I2cwbyte Itg3200_r
84
   I2crbyte Temp_out_h , Ack
85
   I2crbyte Temp_out_l , Ack
86
   I2crbyte Gyro_xout_h , Ack
87
   I2crbyte Gyro_xout_l , Ack
88
   I2crbyte Gyro_yout_h , Ack
89
   I2crbyte Gyro_yout_l , Ack
90
   I2crbyte Gyro_zout_h , Ack
91
   I2crbyte Gyro_zout_l , Nack
92
   I2cstop
93
94
   Temp_out = Makeint(temp_out_l , Temp_out_h)
95
   Gyro_xout = Makeint(gyro_xout_l , Gyro_xout_h)
96
   Gyro_yout = Makeint(gyro_yout_l , Gyro_yout_h)
97
   Gyro_zout = Makeint(gyro_zout_l , Gyro_zout_h)
98
Return

von Paul Baumann (Gast)


Lesenswert?

Lies doch mal weniger oft aus, um zu sehen, ob die Rechnerei in der
ISR länger dauert, als der Abstand zweier ISR.

MfG Paul

von Christian (Gast)


Lesenswert?

Hallo Paul,
ja habe ich schon mal Probiert, aber der Winkel ist auch vieel zu groß.
Irgendwas ist da noch faul.

Ich hab grad den Skalierungsator im Auge:
Im Datenblatt steht: "Sensitivity Scale Factor: 14.375 LSB/(º/s)
Mich irretiert das LSB etwas (Least Significant Byte?)
Bezieht sich der Skalierungsfator womöglich nur auf das niedriger 
wertige Byte oder wie soll ich das verstehen?
Bei mir im Code steht  "Grad_sec = Gyro_zout / 14.375"
Da sind beide Bytes schon wieder zu einen Integer zusammengesetzt.

von Norbert S. (norberts)


Lesenswert?

hi,

nö, eigentlich sollte das passen. bei 2000°/s passt das ja auch so 
gerade in ein integer.

auch wenn deine rechnerei mit float in der isr ganz schlechter stil ist, 
zeitlich sollte das passen.
das auslesen des gyro dürfte auch recht schnell sein, das klappert ja 
mit 400kHz. kannst du aber auch mal überschlagen.

das hier:
   If Gyro_zout > -90 And Gyro_zout < 90 Then
      Gyro_zout = 0
   End If
ist ziemlich sinnfrei. 1. hast du den wert da noch nicht skaliert und 2. 
ist das wohl falsch rum.
damit schmeisst du alle werte von -6 bis +6°/s raus.

speck das ganze mal ab und versuche mal nur die winkelgeschwindigkeit 
auszulesen. so 10°/s bekommt man ja per hand gedreht, um zu sehen, ob 
das simple auslesen passt.

gruß,
norbert

: Bearbeitet durch User
von Christian (Gast)


Lesenswert?

Hallo Norbert,
ich beabsichtige ja auch alles von -6 bis +6°/s rauszuschmeißen.
Dies habe ich ermittelt, als das Gyro im Stillstand dauert geschwankt 
hat.
Das wird natürlich noch verfeinert und dient erst mal zum Test, damit 
der Winkelwert nicht im Stillstand schon gleich wegläuft.
Das erklärt aber leider nicht warum der ausgegebene Winkel vieeel zu 
groß ist.

Werde den Code jetzt nochml zerlegen und unter die Lupe nehmen.

von MWS (Gast)


Lesenswert?

Ändere doch mal in:
1
On Timer1 Isr_von_timer1 SAVEALL

von Norbert S. (norberts)


Lesenswert?

hi,

das macht bascom von alleine.

gruß,
norbert

von MWS (Gast)


Lesenswert?

Norbert S. schrieb:
> das macht bascom von alleine.

Nein. Lies die Bedeutung von SAVEALL nach.

von Christian (Gast)


Lesenswert?

Hallo,
also so einen Befehl wie SAVEALL kennt mein Bascom nicht.

von Norbert S. (norberts)


Lesenswert?

ja, ich wollte gerade editieren aber ging nicht mehr.
du hast recht.

von Christian (Gast)


Lesenswert?

Mein Bascom erkennt das nicht mal als Schlüsselwort.
Ich denke da wirds mal Zeit für ein Update :D

von Norbert S. (norberts)


Lesenswert?

Christian schrieb:
> Hallo,
> also so einen Befehl wie SAVEALL kennt mein Bascom nicht.

welche version hast du?

sonst sichere die register manuell wie in der hilfe beschrieben.

gruß,
norbert

von Christian (Gast)


Lesenswert?

2.0.7.2

von Norbert S. (norberts)


Lesenswert?

bingo, die history sagt, mit 2.0.7.4 kam saveall dazu.
aktuell ist 2.0.7.7

von MWS (Gast)


Lesenswert?

Christian schrieb:
> Im Datenblatt steht: "Sensitivity Scale Factor: 14.375 LSB/(º/s)

Im DB steht noch mehr:

> The power-on-reset value of FS_SEL is 00h.
> Set to 03h for proper operation.

Das passiert nirgends im gezeigten Code.

von Christian (Gast)


Lesenswert?

Hallo,
SUPER!! DANKE :D :D :D

Das mit dem FS_SEL hatte ich völlig übersehen.
Hab Jetzt noch ne kleine Sub geschrieben:
1
Init_gyro:
2
   I2cstart
3
   I2cwbyte Itg3200_w   'schreibeadresse
4
   I2cwbyte &H16        'register adresse
5
   I2cwbyte &H18        'FS_SEL = 3 , DLPF_CFG = 0
6
   I2cstop
7
Return

Damit hauts jetzt eiwandfrei hin.
Kann mein Steckbrett durchschütteln und hab dann nur 2 Grad Abweichung.
Das kann sich sehen lassen ;)

Jetzt muss ich noch ein wenig mit Drift rumspielen.
Und dann noch Temperaturdirft mit einrechnen, da lässt sich da noch
die genauigkeit erhöhen.

von Christian (Gast)


Lesenswert?

Hallo,
ich bin grad dabei zu grübeln wie ich das mit der Temperaturkompensation 
mache...Also eine Temperatur in °C habe ich schon berechnet.
Das verschiebt sich ja der Nullpunkt.
Ich werde grad nicht aus dem Datenblatt schlau, ob sich
da eine Information verbirgt, mit der man den Nullpunkt anhand der 
Temperatur
berechnen kann.

Aber da wird es sowieso Sinsoll sein, selbst eine Kurve zu erstellen?

von Norbert S. (norberts)


Lesenswert?

hi,

da steht nur

Initial ZRO Tolerance ±40º/s

ZRO Variation Over Temperature-40°C to +85°C ±40º/s

das heisst wohl, bis ±40º/s eiert das ding schon in ruhe (oder ist so 
komplett daneben) und weitere ±40º/s kommen über den temperaturbereich 
dazu.

die toleranz der linearität, vor allem pos vs. neg. wirkt sich auch 
heftig aus, wenn du aufintegrieren willst.

ob man da nun eine charakteristik vermessen kann, das ding sozusagen 
kalibrieren... wer weiß, ob das verhalten reproduzierbar ist.
vermutlich schon, aber wie zum teufel willst du das kalibrieren?
mit steckbrett, geodreieck und stoppuhr?

also ich würde, bevor ich einen besseren gyro suche, es mal so 
versuchen:
hinlegen und in ruhe über einige sekunden den nullpunkt kalibrieren.
dann schau dir mal an, was das ding macht und wie es driftet.
dann mal um 45° drehen und warten was passiert.


und bevor du dich totmachst: nach ein paar sekunden kannst du nur noch 
abschätzen, ob sich das ding um 90° gedreht hat oder nicht. viel besser 
kriegst du den drift nicht in den griff.
nach einer minute kannst du nur noch raten.

der gyro scheint mir auch nicht sonderlich toll zu sein, 2000°/s braucht 
man auch niemals, falss es um ein modell oder roboter geht.

gruß,
norbert

von Christian (Gast)


Lesenswert?

Hallo, ja ich versuche das Ding in Ruhe zu kalibrieren,
dass wenigstens der Nullpunkt einigermaßen da bleibt wo er ist.
Das wär ja schon mal was.

Mit Geodreieck und Stoppuhr ja.. das wird wohl nix.
Aber wenn du sagst, dass der da noch mal umn 40° variiert ist
das natürlich zimlich schlecht.

Der Gyro wird in der Tat in einen Roboter eingebaut.
Dieser Robo ist zudem auch noch zimlich lahn.
Wenn das Gyro langsame Bewegungen besser wahrnimmt wärs besser,
aber Gyros haben ja bei langsamen Bewegungen Schwierigkeiten.

Ich habe den Sensor genommen wegen dem integriertem ADC.
Vorher hatte ich einen ADXRS620. Mit AVR hatte ich aber nur 10 Bit ADC.
Das war etwas wenig und bei guten ADCs kann kan mit Layout usw.
zimlich viel genauigkeit versauen.

Mich wunderts ja sowieso wie 3 Axen in das winzige Ding passsen
und dann auch noch zu dem Preis.
Mein Projekt ist so umfangreich, das ich ehrlich gesagt nicht so viel 
Zeit
habe mich damit zu beschäftigen, wie ich den Temperaturdrift
entgegenwirken kann.

Aber was es da am Markt noch alles für Gyros gibt, habe ich wenig 
Überblick
Obs da auch welche gibt, die Temperaturkompensiert sind?
Ist halt alles eine Frage des Preises.
Habe auch schon mal wegen Faserkreisel geschaut, das ist aber dann schon 
overkill.

von Norbert S. (norberts)


Lesenswert?

hi,

16bit ist ja schön und gut aber wieviel nutzt du davon? 20°/s?  dann 
liegt dein messbereich im bereich des messfehlers.

schau dir mal den lpy503al an.
mit dem verstärkten ausgang hast du auch fast die auflösung des jetzigen 
gyros wenn du den avr mit 3V betreibst.
dreht er sich doch mit mehr als 30°/s hast du noch den unverstärkten 
ausgang und somit auch eine dynamik von 12bit.
dann lass das mal mit 1kHz, das muß nicht so schnell. die analogen 
ausgänge dämpfst du nochmal direkt am avr mit rc-glied 10k und 4µ7 und 
misst mit 10-20Hz.
das wäre so das was ich auf einen langsamen roboter loslassen würde.

die 40°/s abweichung sind ja nur 2% des messbereiches. bei den 
unverstärkten 120°/s wären das nur noch 2,4°/s. wenn der jetzt nicht um 
eine dimension schlechter ist, sieht das doch schon anders aus.

und vergiss eine autonome navigation damit. spätestens nach ein paar 
sekunden kannst du nur noch grob schätzen.
gyros sind zur kurzfristigen stabilisierung und nicht zur navigation, 
wenn sie nicht gerade aus dem militärischen bereich kommen und 
5-6-stellig kosten.

gruß,
norbert

von Christian (Gast)


Lesenswert?

Hallo,
ich habe jetzt etwas mit der Temperaturkompensation rumgespielt.
Es den Nullpunkt hält er jetzt mit einem Korrekturfator zimlich gut.
Das letzte bisschen Drift im Stillstand wird einfach igniriert,
damit der Wert nicht wegläuft.

Erste Tests sind erstaunlich gut.
Wenn ich eine Minute lang hin und her drehe langsam schnell, ganz 
schnell.
Abweichung vielleicht 1-3°.
Selbst wenn ich mit dem Heißluftf draufhalte ist fast keine veränderung
festzustellen. Ein auf den Tisch geklebtes Goedreieck stimmt mit dem 
Gyrowerte erstaunlich genau überein.
Die einzige Fehlerquelle ist jetzt nur das Steckbrett.
Der Sensor hängt nur an der Stiftleiste und kann rumkippeln und wackeln.
Außerdem reißts beim drehen manchmal die Kabel raus :D
Wird mal Zeit für eine gescheide Platine wo alles orgendlich fest ist.

Das ich nur mit dem Gyro alleine nicht Navigieren kann ist mir klar,
dennnoch ist es eine gewaltige Hilfe beim Navigieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.