Hinzufügen von High-Byte und Low-Byte des LSM303DLHC-Beschleunigungsmesserausgangs

Interpretieren der Ausgabe des LSM303DLHC-Beschleunigungsmessers

Hallo zusammen, Dies ist meine erste StackExchange-Frage überhaupt, daher werde ich mein Bestes tun, um spezifisch zu sein und so viele Referenzen wie möglich anzubieten. Ich arbeite derzeit an einem Navigationsmodul, das einen PIC16F873A-Mikrocontroller verwendet, um Daten von einem GPS über das USART-Modul und von einem LSM303DLHC-Magnetometer / Beschleunigungsmesser mit I2C zu lesen. In dieser Phase des Projekts versuche ich nur, Beschleunigungsmesserdaten zu verwenden, was ich derzeit tue, indem ich den PIC im Master-Modus betreibe und aus den entsprechenden Registern lese. Der Beschleunigungsmesser funktioniert so, dass die X-, Y- und Z-Beschleunigungsdaten in sechs verschiedenen aufeinanderfolgenden Registern innerhalb des Registerbereichs des linearen Beschleunigungsmessers gespeichert werden (dh OUT_X_L_A (28h), OUT_X_H_A (29h) ... OUT_Y_L_A (2Ah), OUT_Y_H_A (2Bh ) ... OUT_Z_L_A (2Ch), OUT_Z_H_A (2Dh)). MeinDie Funktion I2C_Accelrometer_Data (unsigned char reg_address, unsigned char ack) liest jeweils ein Datenbyte ein, sodass mein Code das Low-Byte und dann das High-Byte aus dem nächsten Register liest, sie in einem Array von unsigned chars speichert und sie zusammenfügt . Laut Datenblatt: LSM303DLHC werden diese Bytes im Zweierkomplement ausgedrückt.


Ein Abschnitt meines C-Codes (XC8-Compiler), den ich teilweise von hier auf Seite #6 angepasst habe , behandelt es wie folgt:

    unsigned char ACC_Data[6];

                                            ACC_Data[0] = I2C_Accelerometer_Data(0x28, 0);//X_Low Byte
                                            ACC_Data[1] = I2C_Accelerometer_Data(0x29, 0);//X_High_Byte

                                            ACC_Data[2] = I2C_Accelerometer_Data(0x2A, 0);//Y_Low_Byte
                                            ACC_Data[3] = I2C_Accelerometer_Data(0x2B, 0);//Y_High_Byte

                                            ACC_Data[4] = I2C_Accelerometer_Data(0x2C, 0);//Z_Low_Byte
                                            ACC_Data[5] = I2C_Accelerometer_Data(0x2D, 1);//Z_High_Byte

                                            int Ax = (int) (ACC_Data[1] << 8) + ACC_Data[0];
                                            int Ay = (int) (ACC_Data[3] << 8) + ACC_Data[2];
                                            int Az = (int) (ACC_Data[5] << 8) + ACC_Data[4];

                                            char Ax_str[];
                                            char Ay_str[];
                                            char Az_str[];
                                            itoa(Ax_str, Ax, 10);
                                            lcdcmd(0x94);//third row, first column position
                                            send_string(Ax_str);

                                            itoa(Ay_str, Ay, 10);
                                            lcdcmd(0x9E);//third row, 10th column position
                                            send_string(Ay_str);

                                            itoa(Az_str, Az, 10);
                                            lcdcmd(0xD4);//4th row, first column position
                                            send_string(Az_str);

Meine Frage ist: Da die Zahlen im Zweierkomplement binär sind, wird das nicht die Art und Weise durcheinander bringen, wie sie addiert werden, zumal die Bytes als unsigned chars gespeichert werden? Oder kann ich einfach das tun, was ich oben getan habe, um diese beiden Bytes in ein Int umzuwandeln? Grundsätzlich ist das Ziel, diese Zahlen auf einen LCD-Bildschirm zu bringen, indem diese Ganzzahl dann in die entsprechende Zeichenfolge umgewandelt wird. Ich bin mir nur nicht sicher, ob ich die Daten hier richtig verwende. Danke im Voraus für jeden Einblick.

Antworten (2)

Sie kleben die Bytes in der falschen Reihenfolge zusammen. Da ACC_Data[0] das Low-Byte und ACC_Data[1] das High-Byte ist, müssen Sie ACC_Data[1] um 8 nach links verschieben und zu ACC_Data[0] (unverschoben) hinzufügen, um den korrekten int-Wert zu erhalten.

Ach, das habe ich nicht gesehen! Das ist ein dummer Fehler von mir. Aber nach dieser Korrektur frage ich mich immer noch, ob diese Methode mir Probleme bereiten wird.

Eine weitere Komplikation über die zuvor erwähnte Byte-Reihenfolge des LSM303DLHC-Beschleunigungsmessers hinaus besteht darin, dass der Beschleunigungsmesser nur 12 Wertbits hat, die in zwei Bytes gespeichert sind, gezählt vom MSB.

Das bedeutet, dass die Werte, die Sie erhalten, durch 16 geteilt werden müssen, dies geschieht im STM32F3-Democode, wird aber im LSM303DLHC-Datenblatt nicht erklärt. Wenn Sie einen Debugger anschließen und die empfangenen Bytes binär anzeigen, sehen Sie, dass die letzten 4 Bits im LSB immer Null sind.