STM32----MPU6050

Vorwort: Ich habe in den letzten Monaten keinen Artikel geschrieben, da es in diesem Semester wirklich viele Dinge gibt, aber nachdem ich darüber nachgedacht habe, muss der Artikel noch aktualisiert werden. Es ist wirklich wichtig, das Wissen, das ich gelernt habe, zusammenzufassen! ! !

Nicht viel Unsinn, der Text beginnt:
1. Einführung in MPU6050

MPU6050 ist die weltweit erste integrierte 6-Achsen-Bewegungsverarbeitungskomponente, die von InvenSense auf den Markt gebracht wurde . Im Vergleich zu Mehrkomponentenlösungen beseitigt sie das Problem der Achsunterschiede bei der Kombination von Gyroskopen und Beschleunigern und reduziert den Installationsraum. Die MPU6050 integriert ein 3-Achsen-Gyroskop und einen 3-Achsen-Beschleunigungssensor und enthält eine zweite IIC-Schnittstelle , über die externe Magnetsensoren, nämlich AUX_CL und AUX_DA, angeschlossen und der integrierte digitale Bewegungsprozessor (DMP: Hardwarebeschleunigung des DigitalMotion-Prozessors Die Engine gibt vollständige 9-Achsen-Fusionsberechnungsdaten über die Haupt-IIC-Schnittstelle an die Anwendungsseite aus. Mit DMP können wir die von InvenSense bereitgestellte Bewegungsverarbeitungsdatenbank verwenden, um die Lageberechnung sehr bequem zu realisieren, die Belastung des Betriebssystems durch Bewegungsverarbeitungsberechnungen zu reduzieren und die Entwicklungsschwierigkeiten erheblich zu reduzieren.

2. Einführung in Initialisierungsschritte und Register

(i) Initialisieren Sie zunächst das IIC-Kommunikationsprotokoll, initialisieren Sie die SCL- und SDA-Schnittstellen und stellen Sie sicher, dass der mpu6050 mit dem STM32-Motherboard kommunizieren kann.

(ii) MPU6050 zurücksetzen und MPU6050 aufwecken

Wenn Sie die MPU6050 zurücksetzen, setzen Sie Bit7 [DEVICE_RESET] auf 1, um sie zurückzusetzen. Gleichzeitig wird das SLEEP-Bit 1 [1: Schlafmodus 0: normaler Arbeitsmodus], sodass die MPU6050 aufgeweckt werden muss wird in „Setzen Sie es auf 0“ geändert, um mit dem nächsten Schritt fortzufahren. TEMP_DIS wird verwendet, um festzulegen, ob der Temperatursensor aktiviert werden soll, und setzen Sie es auf 0, um ihn zu aktivieren.

MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	//复位MPU6050
delay_ms(100);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);	//唤醒MPU6050 

(iii) Initialisieren Sie den Gyroskopsensor [Winkelgeschwindigkeitssensor]

 

 Das Register muss auf die beiden Bits von FS_SEL achten, bei denen es sich um den Bereich des Winkelgeschwindigkeitsbereichs handelt

 Das Konzept des vollständigen Maßstabs dieses Gyroskops ist:

Der Bereich bezieht sich auf den maximalen Bereich. Wenn Sie beispielsweise FS_SEL == 2 ---> ±1000°/s wählen, kann er innerhalb von 1000 pro Sekunde erkannt werden, aber wenn er größer als 1000° ist, kann er nicht erkannt werden .

(iv) Beschleunigungssensor

 Achten Sie wie oben auf diese beiden FS_SEL.

 zB: 2g == zwei Erdbeschleunigungen = 19,6m/s², und so weiter, um die maximale Reichweite zu bestimmen.

Die Empfindlichkeit beträgt: 65536(2^16) /4000(2000*2)=16384LSB/g。

Aber im Allgemeinen verwenden wir den mpu6050, um ±1000°/s und ±2g zu wählen.

    MPU_Set_Gyro_Fsr(3);					//陀螺仪传感器,±2000dps
	MPU_Set_Accel_Fsr(0);					//加速度传感器,±2g

(v) FIFO-Freigaberegister

 Setzen Sie ACCEL_FIFO_EN auf 1, schalten Sie dann FIFO ein, schalten Sie dann die drei Bits des Beschleunigungssensors ein, setzen Sie es auf 0 und schalten Sie dann FIFO aus. Der Winkelgeschwindigkeitssensor muss individuell gesteuert werden, um eingeschaltet zu werden oder nicht.

MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);	//关闭FIFO

(vi) Gyroskop-Abtastratenteilerregister

                        Die Formel lautet: Abtastfrequenz = Gyroskop-Ausgangsfrequenz / ( 1+SMPLRT_DIV )
Im Allgemeinen beträgt die Ausgangsfrequenz des Gyroskops 1 kHz oder 8 kHz, was durch den digitalen Tiefpassfilter bestimmt wird. Wenn die Abtastfrequenz 50 Hz beträgt, beträgt der aktuelle SMPLRT_DIV (1000/50-1 = 19).

(vii) Konfigurationsregister

Schauen Sie sich hauptsächlich die unteren drei Einstellungen an:

 

 Im Allgemeinen ist die Bandbreite = Abtastfrequenz/2.

(viii) Beschleunigungsausgaberegister, Gyroskopausgaberegister, Temperaturausgaberegister

 

Die Temperaturumrechnungsformel lautet:
Temperatur = 36,53 + Regval/340.
 

 Diese drei sind die Werte des Ausgangssensors, das High-Byte liegt vorne und das Low-Byte hinten.

//得到温度值
//返回值:温度值(扩大了100倍)
short MPU_Get_Temperature(void)
{
    u8 buf[2]; 
    short raw;
	float temp;
	MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf); 
    raw=((u16)buf[0]<<8)|buf[1];  
    temp=36.53+((double)raw)/340;  
    return temp*100;;
}
//得到陀螺仪值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,错误代码
u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{
    u8 buf[6],res;  
	res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
	if(res==0)
	{
		*gx=((u16)buf[0]<<8)|buf[1];  
		*gy=((u16)buf[2]<<8)|buf[3];  
		*gz=((u16)buf[4]<<8)|buf[5];
	} 	
    return res;;
}
//得到加速度值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,错误代码
u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{
    u8 buf[6],res;  
	res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
	if(res==0)
	{
		*ax=((u16)buf[0]<<8)|buf[1];  
		*ay=((u16)buf[2]<<8)|buf[3];  
		*az=((u16)buf[4]<<8)|buf[5];
	} 	
    return res;;
}

 Verstehen Sie eine Codezeile:

((u16)buf[0]<<8)|buf[1]

Erzwingen Sie die Konvertierung von buf[0] in Daten vom Typ 16int, verschieben Sie sie dann um acht Bits nach links, sodass die unteren acht Bits frei werden, verschieben Sie die acht Bits von buf[1] in die unteren acht Bits und bilden Sie 16- Bit-Daten. Dann senden Sie es aus.

(ix) Einfache Erklärung von DMP

Der DMP überträgt die Werte des Gyroskopsensors und des Beschleunigungssensors und gibt mit Hilfe des DMP das Quaternion [q30-Format] aus, das um 2 bis 30 Potenzen vergrößert wird und daher zurückgeteilt werden muss.

        q0 = quat[0] / q30; //q30-Format wird in eine Gleitkommazahl konvertiert
        q1 = quat[1] / q30;
        q2 = quat[2] / q30;
        q3 = quat[3] / q30; 

 Anschließend mit Hilfe der Formel in Winkel umrechnen. Teilen Sie durch 57,3, um Bogenmaß in Grad umzuwandeln

         *pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57,3; // pitch
        *roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2 * q2 + 1)* 57,3; // roll
        *yaw = atan2(2*(q1*q2 + q0*q3), q0*q0+q1*q1-q2*q2-q3*q3) * 57,3; //gieren

 Hinweis: Wenn Sie eine OLED-Anzeige benötigen, müssen Sie nur eine normale OLED-IIC-Kommunikation konfigurieren, dann die benötigte Zeichengröße einstellen und dann die entsprechende erforderliche Schriftart und Variablen festlegen, damit sie auf dem Bildschirm angezeigt werden kann, oder Sie Sie können auch die serielle Schnittstelle 1printf als Ausgabe auswählen.

Physikalische Karte:

 

 

Ich denke du magst

Origin blog.csdn.net/weixin_63032791/article/details/129629772
Empfohlen
Rangfolge