Interface library for ST LSM303DLM 3-axis magnetometer/accelerometer

Dependents:   AVC_2012 m3pi_Kompass Fish_2014Fall Fish_2014Fall ... more

Committer:
shimniok
Date:
Tue Jan 24 16:56:35 2012 +0000
Revision:
1:fc5c9258ec45
Parent:
0:faef9e4c8bea
Child:
2:0fcea8569714
Minor revisions to interfaces. Functional but still some functionality to add.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:faef9e4c8bea 1 #include "mbed.h"
shimniok 0:faef9e4c8bea 2 #include "LSM303DLM.h"
shimniok 0:faef9e4c8bea 3 #include "stdio.h"
shimniok 0:faef9e4c8bea 4
shimniok 0:faef9e4c8bea 5 #define MAG_ADDRESS 0x3C
shimniok 0:faef9e4c8bea 6 #define ACC_ADDRESS 0x30
shimniok 0:faef9e4c8bea 7
shimniok 0:faef9e4c8bea 8 LSM303DLM::LSM303DLM(PinName sda, PinName scl): _device(sda, scl)
shimniok 0:faef9e4c8bea 9 {
shimniok 0:faef9e4c8bea 10 _device.frequency(400000);
shimniok 0:faef9e4c8bea 11 init();
shimniok 0:faef9e4c8bea 12 }
shimniok 0:faef9e4c8bea 13
shimniok 0:faef9e4c8bea 14 void LSM303DLM::init()
shimniok 0:faef9e4c8bea 15 {
shimniok 0:faef9e4c8bea 16 // init mag
shimniok 0:faef9e4c8bea 17 // continuous conversion mode
shimniok 0:faef9e4c8bea 18 _data[0] = MR_REG_M;
shimniok 0:faef9e4c8bea 19 _data[1] = 0x00;
shimniok 1:fc5c9258ec45 20 #ifdef DEBUG_I2C
shimniok 0:faef9e4c8bea 21 if (!_device.write(MAG_ADDRESS, _data, 2))
shimniok 0:faef9e4c8bea 22 fprintf(stdout, "MR_REG_M: no ack\n");
shimniok 1:fc5c9258ec45 23 #endif
shimniok 0:faef9e4c8bea 24 // data rate 75hz
shimniok 0:faef9e4c8bea 25 _data[0] = CRA_REG_M;
shimniok 0:faef9e4c8bea 26 _data[1] = 0x18; // 0b00011000
shimniok 1:fc5c9258ec45 27 #ifdef DEBUG_I2C
shimniok 0:faef9e4c8bea 28 if (_device.write(MAG_ADDRESS, _data, 2))
shimniok 0:faef9e4c8bea 29 fprintf(stdout, "CRA_REG_M: no ack\n");
shimniok 1:fc5c9258ec45 30 #endif
shimniok 0:faef9e4c8bea 31 // init acc
shimniok 0:faef9e4c8bea 32 // data rate 100hz
shimniok 0:faef9e4c8bea 33 _data[0] = CTRL_REG1_A;
shimniok 0:faef9e4c8bea 34 _data[1] = 0x2F; // 0b00101111
shimniok 1:fc5c9258ec45 35 #ifdef DEBUG_I2C
shimniok 0:faef9e4c8bea 36 if (!_device.write(ACC_ADDRESS, _data, 2))
shimniok 0:faef9e4c8bea 37 fprintf(stdout, "CTRL_REG1_A: no ack\n");
shimniok 1:fc5c9258ec45 38 #endif
shimniok 0:faef9e4c8bea 39 }
shimniok 0:faef9e4c8bea 40
shimniok 0:faef9e4c8bea 41 void LSM303DLM::read(int a[3], int m[3])
shimniok 0:faef9e4c8bea 42 {
shimniok 0:faef9e4c8bea 43 readAcc(a);
shimniok 0:faef9e4c8bea 44 readMag(m);
shimniok 0:faef9e4c8bea 45 }
shimniok 0:faef9e4c8bea 46
shimniok 0:faef9e4c8bea 47 void LSM303DLM::readAcc(int a[3])
shimniok 0:faef9e4c8bea 48 {
shimniok 0:faef9e4c8bea 49 _data[0] = OUT_X_L_A | (1<<7);
shimniok 0:faef9e4c8bea 50 _device.write(ACC_ADDRESS, _data, 1);
shimniok 0:faef9e4c8bea 51 _device.read(ACC_ADDRESS, _data, 6);
shimniok 0:faef9e4c8bea 52
shimniok 0:faef9e4c8bea 53 // 12-bit values
shimniok 1:fc5c9258ec45 54 a[0] = (short) (_data[1]<<8 | _data[0]) >> 4;
shimniok 1:fc5c9258ec45 55 a[1] = (short) (_data[3]<<8 | _data[2]) >> 4;
shimniok 1:fc5c9258ec45 56 a[2] = (short) (_data[5]<<8 | _data[4]) >> 4;
shimniok 0:faef9e4c8bea 57 }
shimniok 0:faef9e4c8bea 58
shimniok 0:faef9e4c8bea 59 void LSM303DLM::readMag(int m[3])
shimniok 0:faef9e4c8bea 60 {
shimniok 0:faef9e4c8bea 61 _data[0] = OUT_X_H_M;
shimniok 0:faef9e4c8bea 62 _device.write(MAG_ADDRESS, _data, 1);
shimniok 0:faef9e4c8bea 63 _device.read(MAG_ADDRESS, _data, 6);
shimniok 0:faef9e4c8bea 64
shimniok 1:fc5c9258ec45 65 m[0] = (short) (_data[0]<<8 | _data[1]); // X
shimniok 1:fc5c9258ec45 66 m[1] = (short) (_data[4]<<8 | _data[5]); // Y
shimniok 1:fc5c9258ec45 67 m[2] = (short) (_data[2]<<8 | _data[3]); // Z
shimniok 1:fc5c9258ec45 68 }
shimniok 1:fc5c9258ec45 69
shimniok 1:fc5c9258ec45 70 void LSM303DLM::setScale(float x, float y, float z)
shimniok 1:fc5c9258ec45 71 {
shimniok 1:fc5c9258ec45 72 scale[0] = x;
shimniok 1:fc5c9258ec45 73 scale[1] = y;
shimniok 1:fc5c9258ec45 74 scale[2] = z;
shimniok 1:fc5c9258ec45 75 }
shimniok 1:fc5c9258ec45 76
shimniok 1:fc5c9258ec45 77 void LSM303DLM::setOffset(float x, float y, float z)
shimniok 1:fc5c9258ec45 78 {
shimniok 1:fc5c9258ec45 79 offset[0] = x;
shimniok 1:fc5c9258ec45 80 offset[1] = y;
shimniok 1:fc5c9258ec45 81 offset[2] = z;
shimniok 0:faef9e4c8bea 82 }