J'ai cherché un peu sur ce forum en ce qui concerne le gyroscope L3G4200D, et je n'ai pas vu ce problème mentionné, mais j'ai vu d'autres en parler sur d'autres forums. Je vois une étrange grande valeur dans ma sortie lorsque le gyroscope est à l'arrêt. Malheureusement, personne ne semble avoir pu expliquer pourquoi, alors j'ai pensé demander
Donc, je collecte des données du gyroscope en utilisant i2c à 400 kHz (mode rapide), en collectant les données du gyroscope en utilisant la lecture multi-octets (six octets à la fois). Échantillonnage à 100 Hz (essayé également le 800 Hz supérieur), également essayé avec le filtrage activé et désactivé à différentes valeurs. Je n'utilise pas la broche d'interruption, mais j'utilise l'attribut `` mise à jour des données de bloc '' dans le GYRCTRLREG4, de sorte que les données ne sont pas sorties jusqu'à ce que LSB et MSB soient lus. 2000dps complets et rien fait avec le FIFO. Je peux poster mes valeurs de registre exactes si cela aide, mais je pense que la plupart d'entre vous n'auront pas la fiche technique à portée de main.
L'image ci-dessous montre mon problème. Les données produites sont bonnes, calculées correctement (à ma connaissance) et le bruit général est très acceptable. Mais ensuite, j'ai remarqué que ces «blips» gênants apparaissaient au hasard lorsque l'appareil est à l'arrêt. Si je le laisse immobile pendant quelques secondes, j'obtiendrai l'un de ces pics, toujours égal à environ 250-255 (donc ~ 18 lors de la conversion, en utilisant '(sortie * 70) / 1000'). Les pics, comme je le dis, sont aléatoires, peuvent apparaître dans n'importe quel plan (dans l'image ci-dessous, vous pouvez voir le premier pic dans le plan X, le second dans le Y), toujours autour de la même valeur, et un, deux ou tous trois peuvent se produire en même temps. La grande valeur est uniquement pour un seul échantillon, puis revient à la normale.
J'ai vu dans un autre thread quelque part que je devrais utiliser la fonction d'attente de données de bloc dans GYRCTRLREG4, comme je l'ai mentionné précédemment, mais aucun changement. J'ai réduit le problème à être lorsque le MSB est nul ou supérieur, c'est-à-dire un nombre positif, puis lorsque le MSB et le LSB sont combinés, j'obtiens ces grands nombres. Par exemple, j'attrape les deux octets nécessaires pour le plan X, j'obtiens un -6 dans le LSB, et un 0 dans le MSB, les combiner me donne 250, puis la conversion donne (250 * 70) / 1000 = 17,5 dps ( c'est-à-dire trop grand pour stationnaire / incorrect). Dans le même échantillon, les deux octets pour le plan Y sont -3 LSB et -1 MSN, leur combinaison donne -3 et la conversion donne -0,21 (c'est-à-dire attendu / correct).
Été sur ce problème depuis des jours maintenant, je vois également un peu de ces pointes aléatoires avec mon magnétomètre, donc je pense que c'est moi qui lit l'appareil (via i2c) de manière incorrecte?
Toutes les suggestions ou choses à essayer sont vraiment les bienvenues!
Réponses:
Parce que vous observez un problème similaire avec votre magnétomètre, je suppose que vous avez un problème sur le bus I2C. Bien que cela puisse bien être un problème de code en raison de l'opération intermittente, je vérifierais d'abord comment le bus est connecté. Quelques choses à vérifier / essayer:
Si vous n'utilisez pas de résistances de rappel externes, essayez des résistances de rappel 10K sur SDA et SCL. Le pull-up interne sur la plupart des microcontrôleurs ne sera pas assez fort.
Si possible, réduisez autant que possible la longueur du bus et essayez de le garder à l'écart des signaux à grande vitesse.
Si vous utilisez une planche à pain, essayez de garder les connexions aussi directes que possible pour éviter une capacité excessive.
Si vous utilisez des cartes prototypes qui incluent déjà des résistances de pull-up, elles peuvent se retrouver en parallèle et vous pouvez en effet avoir une valeur de résistance de pull-up qui est trop faible.
Si vous pouvez organiser l'accès à une portée, ce serait idéal pour vous assurer que l'horloge et les lignes de données sont belles et carrées et ne sont pas trop biaisées.
Si ces étapes ne fonctionnent pas, Texas Instruments dispose du rapport d'application Dépannage du protocole de bus I2C qui explique plus en détail le calcul des résistances de pull-up et les problèmes que vous pouvez rencontrer avec la capacité.
la source
Ce qui peut arriver, c'est qu'un nouvel échantillon est en train d'être prélevé entre la lecture du LSB et du MSB. Donc, si MSB = 0 et LSB = -4, vous devriez obtenir 252, soit environ 1g. Si la lecture suivante est MSB = 1 et LSB = 2, vous devriez obtenir 258, ce qui est raisonnable. Leur problème est quand pour 1 échantillon seul le MSB a mis à jour à 1 et le LSB est toujours -4 vous obtenez 508, environ 2g, ce qui pourrait être ce blip.
BDU sur CTRL_REG4 est censé empêcher cela. Peut-être lire ce registre sur le capteur et s'assurer que le blocage de bloc est activé?
la source
essayez avec un filtre médian et ces pointes disparaîtront.
Veuillez vous référer à ma question ici sur StackExchange, puis lisez cet article sur le même problème
la source