本帖最后由 树·水·风 于 2012-5-6 18:55 编辑
两天前买了一个LSM303DLH模块,该模块集成了加速度计和电子罗盘。不过卖家给的代码只有51单片机的,Arduino代码只能自己写。
起先我在网上找了一个函数库,原以为可以变简单,没想到库所提供的示例程序运行后完全没反应,于是只好自己摸索着写。
下面是获取x,y,z三个方向加速度计值的代码。- #include <Wire.h>
- #define AccAddress ( 0x30>>1 )
- byte BUF[6];
- float xAcc, yAcc, zAcc;
- void setup() {
- Serial.begin(9600);
- Wire.begin();
- delay(100);
- Serial.println("Starting up ...");
-
- WriteAccReg(0x20, 0x27);
- delay(1000);
- }
- void PrintBUF() {
- for (int i = 0; i < 6; i++) {
- Serial.print(BUF[i]);
- Serial.print("\t");
- }
- }
- void PrintAcc() {
- Serial.print(xAcc);
- Serial.print("\t");
- Serial.print(yAcc);
- Serial.print("\t");
- Serial.print(zAcc);
- Serial.println();
- }
- void loop() {
- ReadAccValues();
-
- if (xAcc < 0) xAcc = -xAcc;
- if (yAcc < 0) yAcc = -yAcc;
- if (zAcc < 0) zAcc = -zAcc;
-
- PrintBUF();
- PrintAcc();
- delay(300);
- }
- void ReadAccValues() {
- BUF[0] = ReadAccReg(0x28);
- BUF[1] = ReadAccReg(0x29);
- xAcc = (BUF[1] << 8) + BUF[0];
-
- BUF[2] = ReadAccReg(0x2A);
- BUF[3] = ReadAccReg(0x2B);
- yAcc = (BUF[3] << 8) + BUF[2];
-
- BUF[4] = ReadAccReg(0x2C);
- BUF[5] = ReadAccReg(0x2D);
- zAcc = (BUF[5] << 8) + BUF[4];
- }
- void WriteAccReg(byte reg, byte value) {
- Wire.beginTransmission(AccAddress);
- Wire.write(reg);
- Wire.write(value);
- Wire.endTransmission();
- }
- byte ReadAccReg(byte reg) {
- byte value;
-
- Wire.beginTransmission(AccAddress);
- Wire.write(reg);
- Wire.endTransmission();
- Wire.requestFrom(AccAddress, 1);
- value = Wire.read();
- Wire.endTransmission();
-
- return value;
- }
复制代码 上面的代码每次设定一个寄存器,然后读取一个字节,最后将六个字节合成三个方向的加速度值,没有问题;
然而当我连续读取6个字节时,6个字节的值都一样,即BUF[0]=BUF[1]=...=BUF[5]。连续读取6个字节的代码如下:- Wire.beginTransmission(AccAddress);
- Wire.write(0x28);
- Wire.endTransmission();
- Wire.requestFrom(AccAddress, 6);
- while (Wire.available() < 6);
- BUF[0] = Wire.read();
- BUF[1] = Wire.read();
- BUF[2] = Wire.read();
- BUF[3] = Wire.read();
- BUF[4] = Wire.read();
- BUF[5] = Wire.read();
- Wire.endTransmission();
复制代码 我又试了一下,连续读3个字节,3个字节都一样,连续读n个字节,n个字节都一样。不明白是什么原因造成的。
另外,我又修改了一下设备地址、寄存器地址等,用每次读取一个字节的方法读Magnetic即磁感器的值,却发现读出的全都是255,无论模块怎么运动都不改变。真的很奇怪。
下面是我下载的库、模块说明书、51代码:
P.10
P.27
希望同学们能帮我看看。 |