Tutoriel d'apprentissage de la voiture d'équilibre 2 (logiciel) - MPU6050 lecture des données de l'angle d'Euler, transplantation de DMP pour lire l'angle de roulis, l'angle de tangage, l'angle de lacet

avant-propos

Dans l'article précédent, j'ai présenté les ressources matérielles de la voiture d'équilibre et le matériel de fond de la voiture.

Tutoriel d'apprentissage de l'équilibrage de la voiture 1 —— Introduction aux ressources matérielles et au matériel sous-jacent de la voiture

C'est pour t'apprendre如何快速的使用MPU6050自带的DMP库读取陀螺仪数据,读取翻滚角(Roll)、俯仰角(Pitch)、航向角(Yaw)这三个角的数据。

Et notre voiture d'équilibre 直立环est通过读取Roll角的数据

Selon le changement de l'angle de roulis, grâce à l'algorithme PID, la valeur réelle et la valeur attendue sont obtenues, de manière à obtenir la valeur calculée et à la transmettre au PWM. Faites ainsi en sorte que le chariot atteigne l'état vertical.

donc,Comment utiliser le microcontrôleur pour lire les données du gyroscope est un point très important

Tutoriel pour cet article采用的是STM32单片机,读取这三个角


1. Comprendre MPU6050


1. Connaissances de base

MPU6050 est généralement le petit module suivant.Généralement, il est divisé en 6 broches et 8 broches , 6脚和8脚的区别c'est-à-dire que le 8 broches a une interface XDA et une interface XCL, et ces deux interfaces peuvent être connectées à un magnétomètre externe . L'image ci-dessous est le MPU6050 à 8 broches.
insérez la description de l'image ici


2. Présentation de la broche

parce queMPU6050 est une communication IIC, utilisez donc la communication IIC pour initialiser le MPU6050, lisez ses registres internes, afin d'obtenir l'état en temps réel de la voiture.

Donc, ses deux broches importantes sont SCL引脚和SDA引脚.

aussi,MPU6050还有一个中断引脚INT,可以配置寄存器,让其产生中断,读取陀螺仪数据可放在中断内部进行。

broche Présentation de la broche
VCC Entrée d'alimentation 3,3 V/5 V
Terre mise à la terre
SDA Ligne de données de communication IIC
SCL Ligne d'horloge de communication IIC
XDA Ligne de données de communication externe IIC
XCL Ligne d'horloge de communication externe IIC
AD0 Broche de réglage esclave IIC ( 悬空或接GND时为0x68 / 接高电平为0x69)
INT MPU6050中断引脚

2. Méthode de transplantation

Je n'aborde pas ici le principe des registres internes du MPU6050, je ne l'ai effectivement pas compris ici.

On peut d'abord commencer par le fonctionnement pratique, et savoir s'en servir rapidement, en effet cela n'a pas beaucoup de sens de se plonger trop profondément dans ses principes internes, et ce n'est pas un problème de l'étudier en profondeur plus tard.

donc iciJe vais vous expliquer étape par étape comment greffer rapidement la bibliothèque DMP intégrée du MPU6050 et comment utiliser le processeur de mouvement numérique intégré (bibliothèque DMP) pour lire les données complètes de calcul de fusion d'attitude à 6 ou 9 axes. .


1. Qu'est-ce que la DMP

Nous pouvons lire les registres internes du MPU6050 via la communication IIC pour obtenir des données de capteur d'accélération ou des données de capteur de vitesse angulaire

Mais lorsque nous fabriquons une voiture d'équilibre, nous n'avons pas besoin de ces six données, mais des angles d'Euler, c'est-à-dire des trois angles de roulis, de tangage et de lacet.

Pour obtenir l'angle d'Euler, il faut en fait calculer l'assiette, c'est un peu difficile de calculer l'assiette soi-même., mais utiliser DMP n'est pas la même chose,À l'aide de DMP, les données d'origine peuvent être directement converties en une sortie quaternion. Une fois le quaternion obtenu, l'angle d'Euler peut être facilement calculé pour obtenir les angles de roulis, de tangage et de lacet.

2. Comment greffer du DMP


Télécharger les données du disque réseau Baidu d'Atom

Téléchargement ponctuel des données atom MPU6050

  1. Cliquez d'abord sur le lien ci-dessus, cliquez et téléchargez ces informations
    insérez la description de l'image ici

  2. Ensuite, téléchargez-le et pincez les anciennes données -> code source du programme -> choisissez un fichier de package compressé à décompresser

je choisis ici(库函数版本,适合MiniSTM32开发板)扩展实验16 ATK-MPU6050六轴传感器实验


Transplanter les fichiers correspondants et les ajouter à notre propre projet

  1. Dans ce projet, ce dont nous avons besoin est ce dont nous avons besoin, et ce dont nous avons besoin est seulement

Module de capteur à six axes Données ATK-MPU6050 (anciennes données) \ 2, code source du programme \ greffe \ (version de la fonction de bibliothèque, adaptée à la carte de développement MiniSTM32) expérience étendue 16 Expérience de capteur à six axes ATK-MPU6050 \ MATÉRIEL

Le dossier MPU6050 dans ce dossier
insérez la description de l'image ici

  1. Copiez ce fichier entier dans votre propre dossier de projet, puis ajoutez le fichier correspondant dans Keil. Je n'en dirai pas plus sur la façon d'ajouter le fichier correspondant dans Keil.

Ensuite, comme vous pouvez le voir, les fichiers finaux dont nous avons besoin sont mpuiic.c, , mpu6050.c, inv_mpu.c, inv_mpu_dmp_motion_driver.cet ces quatre fichiers sont ajoutés au fichier du pilote dans Keil, et l'effet final est comme indiqué dans la figure ci-dessous

  1. Puis pincez et modifiez les broches correspondantes de votre propre carte ou utilisez des fils Dupont pour vous connecter au 6050
  2. Ensuite, les fichiers de projet dans Keil sont affichés dans la figure ci-dessous,
    insérez la description de l'image ici
    ce sont les quatre fichiers, et ce dont nous avons besoin, ce sont ces quatre fichiers

3. Remarques sur la transplantation

1, mpuiic.cetmpuiic.h


La première chose à laquelle faire attention est de modifier la broche d'initialisation

venez

	void MPU_IIC_Init(void)

On peut voir qu'il s'agit de la broche d'initialisation de SCL et SDA correspondant au MPU6050.Le MPU6050 utilise la communication IIC pour obtenir l'angle d'Euler

Nous devons donc modifier cet IO

下方是源文件中的初始化

insérez la description de l'image ici

Nous le modifions en fonction du GPIO tiré du PCB, puisque notre broche embarquée est

broche Correspondant au GPIO
AD0 Terre
INT PB5
SCL PB4
SDA PB3

insérez la description de l'image ici

Apportez les modifications suivantes

// 初始化IIC  SCL PB4	SDA PB3
void MPU_IIC_Init(void)
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 先使能外设IO PORTC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  // 使能AFIO 复用时钟
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 失能JTAG调试端口  这样PB3 pB4 就是作为一个普通的IO口使用

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; // 端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	   // 推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	   // IO口速度为50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);				   // 根据设定参数初始化GPIO

	GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4); // PB3 PB4 输出高
}

Quant à savoir pourquoi JTAG est désactivé lors de l'initialisation ?
insérez la description de l'image ici
Vous pouvez voir les fonctions correspondantes des broches.PB3 et PB4 sont des ports de test JTAG.Nous devons désactiver les ports JTAG pour utiliser ces deux IO comme GPIO.


La deuxième chose à laquelle il faut faire attention est de modifier les définitions de macro de SCL et SDA

ouvrir mpuiic.hle fichier

Vous pouvez voir que de nombreuses définitions de macros sont définies ici, c'est le programme source
insérez la description de l'image ici
第一个IO设置是啥意思呢?
Nous savons que dans la communication IIC, SDA est une ligne de données, qui doit avoir une entrée et une sortie, le réglage de la direction IO ici consiste à définir le mode d'entrée et le mode de sortie de SDA. Vous pouvez vous référer au manuel de la fonction de la bibliothèque, comme indiqué dans la figure ci-dessous. Il s'agit du registre du port correspondant au numéro de broche supérieur de huit bits Analysons-le d'abord en fonction du programme source 端口配置高寄存器(GPIOx_CRH) (x=A..E)
insérez la description de l'image ici
insérez la description de l'image ici
Tout d'abord, il utilise
SCL-->PC12
SDA-->PC11
la direction IO, qui consiste à exploiter le registre du port, donc

#define MPU_SDA_IN()  {
      
      GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}

Le début de cette phrase consiste à réinitialiser le bit de mode de port de PC11, puis à définir les 15e à 12e bits du registre de port de PC11 sur 1000
insérez la description de l'image ici
Cette image est facile à comprendre, et la capacité à résumer est parfaite

Nous apportons les modifications suivantes

#define MPU_SDA_IN()              \
    {
      
                                   \
        GPIOB->CRL &= 0XFFFF0FFF; \
        GPIOB->CRL |= 8 << 12;    \
    }
#define MPU_SDA_OUT()             \
    {
      
                                   \
        GPIOB->CRL &= 0XFFFF0FFF; \
        GPIOB->CRL |= 3 << 12;    \
    }

// IO操作函数
#define MPU_IIC_SCL PBout(4) // SCL
#define MPU_IIC_SDA PBout(3) // SDA
#define MPU_READ_SDA PBin(3) // 输入SDA

2. Vérifiez si le code atomique ponctuel que vous avez vous-même transplanté utilise la broche INT

Si la broche INT est utilisée, elle est généralement interrompue pour lire l'angle d'Euler, et l'IO doit être initialisé, retirez cette partie, nous n'avons pas utilisé la broche INT ( 使用的是主程序中循环读取)

Son IO initialisé peut provoquer des erreurs de programme

Veuillez donc le commenter pour vous assurer de l'exactitude des opérations ultérieures


4. Initialisez le MPU6050 dans le programme principal

1. Initialiser MPU6050 dans le programme principal

    delay_ms(500); // 延时0.5s 使MPU6050初始化稳定
	MPU_Init();    // 初始化MPU6050
	mpu_dmp_init();

2. Obtenir en continu les données traitées par DMP dans le programme principal

  while( mpu_dmp_get_data(&pitch, &roll, &yaw)!=0 ){
    
    }//返回值:0,正常	//    其他,失败1
  u1_printf("\n\r pitch=%0.2f roll=%0.2f yaw=%0.2f \n\r", pitch, roll, yaw);

3. Connectez le port série pour voir le changement d'angle

Il faut généralement quelques secondes pour attendre que le MPU6050 s'initialise avec succès !

Utilisez ensuite le port série pour afficher les données

On peut voir que les données lues sont réussies, et les trois coins sont lus avec succès, et notre objectif est atteint
insérez la description de l'image ici


4. La distinction entre les angles de roulis, de tangage et de lacet

1. Tournez manuellement le MPU6050 pour distinguer

Pour cela, vous pouvez distinguer en fonction de l'angle que vous lisez, faire pivoter le MPU6050 et vérifier le changement d'angle

Gauche et droite est l'angle de lacet (le long de l'axe X),
haut et bas est l'angle de tangage (le long de l'axe Z),
gauche et droite est l'angle de roulis (le long de l'axe Y)

Tu peux aller voir les grands pour en parler, il y a beaucoup d'informations sur Internet

2. Utilisez le contrôle vofa + pour distinguer (non implémenté)

Au départ, je voulais utiliser vofa + pour afficher visuellement la transformation de l'angle, mais je ne l'ai pas sorti. Je ne sais pas comment jouer ce contrôle. Quand je le sortirai, je le ferai.
insérez la description de l'image ici


V. Résumé

Cet article est principalement un article logiciel, vous apprenant comment transplanter et lire les données du MPU6050, après tout, toutes les voitures d'équilibrage sont basées sur l'angle à atteindre, c'est la première étape de l'article logiciel.

Après avoir appris cela, vous pouvez rapidement transplanter des documents officiels pour obtenir les fonctions que vous souhaitez

Il y a encore pas mal de choses qui ne sont pas expliquées clairement dans l'article.J'ai également remis grosso modo les étapes de la greffe à tout le monde.Certains principes ne sont pas encore assez approfondis.

希望大家,还是要先了解原理,再深入,再做项目,在项目中二次深入理解

Eh bien, la section suivante vous apportera
Le logiciel du pilote inférieur de la voiture - le pilote inférieur de la voiture (moteur, encodeur)

Tout le monde peut l'attendre à nouveau avec impatience, hé, allez, allez !

Je suppose que tu aimes

Origine blog.csdn.net/cyaya6/article/details/131438928
conseillé
Classement