Sample program for interfacing with PNI's RM3100 Breakout Board

Dependencies:   mbed

Committer:
ddelsuc
Date:
Thu Oct 26 18:40:57 2017 +0000
Revision:
0:6ddf88b49483
Sample program for interfacing with PNI's RM3100 Breakout Board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ddelsuc 0:6ddf88b49483 1 /**
ddelsuc 0:6ddf88b49483 2 * @file main.cpp
ddelsuc 0:6ddf88b49483 3 *
ddelsuc 0:6ddf88b49483 4 * @brief Sample code for RM3100.
ddelsuc 0:6ddf88b49483 5 * @authors Betty Zhang, Daniel Delsuc
ddelsuc 0:6ddf88b49483 6 * @date 03/03/2017
ddelsuc 0:6ddf88b49483 7 * @copyright (C) 2017 PNI Corp
ddelsuc 0:6ddf88b49483 8 *
ddelsuc 0:6ddf88b49483 9 * @copyright This sample code is provided "as is" without express or implied warranty.
ddelsuc 0:6ddf88b49483 10 *
ddelsuc 0:6ddf88b49483 11 */
ddelsuc 0:6ddf88b49483 12
ddelsuc 0:6ddf88b49483 13 // Note: This program assumes the RM3100 is connected using the I2C Interface
ddelsuc 0:6ddf88b49483 14
ddelsuc 0:6ddf88b49483 15 #include "main.h"
ddelsuc 0:6ddf88b49483 16
ddelsuc 0:6ddf88b49483 17 // Check if DRDY was triggered
ddelsuc 0:6ddf88b49483 18 bool DataReady()
ddelsuc 0:6ddf88b49483 19 {
ddelsuc 0:6ddf88b49483 20 if (DRDY_PIN == 1)
ddelsuc 0:6ddf88b49483 21 return true;
ddelsuc 0:6ddf88b49483 22 else
ddelsuc 0:6ddf88b49483 23 return false;
ddelsuc 0:6ddf88b49483 24 }
ddelsuc 0:6ddf88b49483 25
ddelsuc 0:6ddf88b49483 26 int main()
ddelsuc 0:6ddf88b49483 27 {
ddelsuc 0:6ddf88b49483 28 pc.baud(115200);
ddelsuc 0:6ddf88b49483 29 int dataInCount[3];
ddelsuc 0:6ddf88b49483 30 float x, y, z;
ddelsuc 0:6ddf88b49483 31
ddelsuc 0:6ddf88b49483 32 mag_initialize_sensor();
ddelsuc 0:6ddf88b49483 33
ddelsuc 0:6ddf88b49483 34 mag_set_sample_rate(100); //100Hz
ddelsuc 0:6ddf88b49483 35
ddelsuc 0:6ddf88b49483 36 mag_set_power_mode(SensorPowerModeActive);
ddelsuc 0:6ddf88b49483 37
ddelsuc 0:6ddf88b49483 38 //while (!DataReady()); //wait here, if using DRDY Int
ddelsuc 0:6ddf88b49483 39 //If not using DRDY, user can check status Reigster 0x34 for dataready.
ddelsuc 0:6ddf88b49483 40
ddelsuc 0:6ddf88b49483 41 //From User Manual Table 3-1 : Geomagnetic Sensor Performance
ddelsuc 0:6ddf88b49483 42 //50 CycleCount ~ 20 LSB/uT
ddelsuc 0:6ddf88b49483 43 //100 CycleCount ~ 38 LSB/uT
ddelsuc 0:6ddf88b49483 44 //200 CycleCount ~ 75 LSB/uT
ddelsuc 0:6ddf88b49483 45 //Linear equation: gain (LSB/uT) = (0.3671 * CycleCount + 1.5)
ddelsuc 0:6ddf88b49483 46
ddelsuc 0:6ddf88b49483 47 int CycleCount = CCP0 | (CCP1 << 8);
ddelsuc 0:6ddf88b49483 48 float gain = 0.3671 * CycleCount + 1.5;
ddelsuc 0:6ddf88b49483 49
ddelsuc 0:6ddf88b49483 50 while(1)
ddelsuc 0:6ddf88b49483 51 {
ddelsuc 0:6ddf88b49483 52 //Get sample data in counts
ddelsuc 0:6ddf88b49483 53 mag_get_sample_data((int*)&dataInCount);
ddelsuc 0:6ddf88b49483 54
ddelsuc 0:6ddf88b49483 55 while (!DataReady()); //wait here, if using DRDY Int
ddelsuc 0:6ddf88b49483 56
ddelsuc 0:6ddf88b49483 57 //Convert to uT
ddelsuc 0:6ddf88b49483 58 x = (float)dataInCount[0] / gain;
ddelsuc 0:6ddf88b49483 59 y = (float)dataInCount[1] / gain;
ddelsuc 0:6ddf88b49483 60 z = (float)dataInCount[2] / gain;
ddelsuc 0:6ddf88b49483 61
ddelsuc 0:6ddf88b49483 62 pc.printf("X: %f, Y: %f, Z: %f\n", x, y, z);
ddelsuc 0:6ddf88b49483 63 //wait(1);
ddelsuc 0:6ddf88b49483 64 }
ddelsuc 0:6ddf88b49483 65 return 0;
ddelsuc 0:6ddf88b49483 66 }