A test program for the MMA8452 accelerometer

Dependencies:   MMA8452 mbed

The test program runs a bunch of tests for the MMA8452 accelerometer.

What is below is not the test program, but an example to whet your appetite about the library.

#include "mbed.h"
#include "MMA8452.h"

int main() {
   Serial pc(USBTX,USBRX);
   pc.baud(115200);
   double x = 0, y = 0, z = 0;

   MMA8452 acc(p28, p27, 40000);
   acc.setBitDepth(MMA8452::BIT_DEPTH_12);
   acc.setDynamicRange(MMA8452::DYNAMIC_RANGE_4G);
   acc.setDataRate(MMA8452::RATE_100);
   
   while(1) {
      if(!acc.isXYZReady()) {
         wait(0.01);
         continue;
      }
      acc.readXYZGravity(&x,&y,&z);
      pc.printf("Gravities: %lf %lf %lf\r\n",x,y,z);
   }
}

An easy way to test that this actually works is to run the loop above and hold the MMA8452 parallel to the ground along the respective axis (and upsidedown in each axis). You will see 1G on the respective axis and 0G on the others.

Committer:
ashleymills
Date:
Tue Mar 04 17:51:27 2014 +0000
Revision:
0:0c17274c3b7c
Child:
1:e9981919b524
(Incomplete) test program for the MMA8452 accelerometer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:0c17274c3b7c 1 #include "mbed.h"
ashleymills 0:0c17274c3b7c 2 #include "MMA8452.h"
ashleymills 0:0c17274c3b7c 3
ashleymills 0:0c17274c3b7c 4 DigitalOut myled(LED1);
ashleymills 0:0c17274c3b7c 5
ashleymills 0:0c17274c3b7c 6 Serial pc(USBTX,USBRX);
ashleymills 0:0c17274c3b7c 7
ashleymills 0:0c17274c3b7c 8 #define LOG(...) pc.printf(__VA_ARGS__); pc.printf("\r\n");
ashleymills 0:0c17274c3b7c 9 #define LOGX(...) pc.printf(__VA_ARGS__);
ashleymills 0:0c17274c3b7c 10
ashleymills 0:0c17274c3b7c 11 void printByte(char b) {
ashleymills 0:0c17274c3b7c 12 LOG("%d%d%d%d%d%d%d%d",
ashleymills 0:0c17274c3b7c 13 (b&0x80)>>7,
ashleymills 0:0c17274c3b7c 14 (b&0x40)>>6,
ashleymills 0:0c17274c3b7c 15 (b&0x20)>>5,
ashleymills 0:0c17274c3b7c 16 (b&0x10)>>4,
ashleymills 0:0c17274c3b7c 17 (b&0x08)>>3,
ashleymills 0:0c17274c3b7c 18 (b&0x04)>>2,
ashleymills 0:0c17274c3b7c 19 (b&0x02)>>1,
ashleymills 0:0c17274c3b7c 20 (b&0x01)
ashleymills 0:0c17274c3b7c 21 );
ashleymills 0:0c17274c3b7c 22 }
ashleymills 0:0c17274c3b7c 23
ashleymills 0:0c17274c3b7c 24 void sampleMMA8452(MMA8452 *acc, int nsamples) {
ashleymills 0:0c17274c3b7c 25 int samples = 0;
ashleymills 0:0c17274c3b7c 26 int bufLen = 6;
ashleymills 0:0c17274c3b7c 27 char buffer[6];
ashleymills 0:0c17274c3b7c 28 memset(&buffer,0x00,bufLen);
ashleymills 0:0c17274c3b7c 29 while(samples<nsamples) {
ashleymills 0:0c17274c3b7c 30 if(!acc->isXYZReady()) {
ashleymills 0:0c17274c3b7c 31 wait(0.01);
ashleymills 0:0c17274c3b7c 32 continue;
ashleymills 0:0c17274c3b7c 33 }
ashleymills 0:0c17274c3b7c 34 memset(&buffer,0x00,bufLen);
ashleymills 0:0c17274c3b7c 35 acc->readRawXYZ(buffer);
ashleymills 0:0c17274c3b7c 36 LOGX("Sample %d of %d: ",samples,nsamples);
ashleymills 0:0c17274c3b7c 37 for(int i=0; i<bufLen; i++) {
ashleymills 0:0c17274c3b7c 38 LOGX("%.2x ",buffer[i]);
ashleymills 0:0c17274c3b7c 39 }
ashleymills 0:0c17274c3b7c 40 LOG(" ");
ashleymills 0:0c17274c3b7c 41 samples++;
ashleymills 0:0c17274c3b7c 42 }
ashleymills 0:0c17274c3b7c 43 }
ashleymills 0:0c17274c3b7c 44
ashleymills 0:0c17274c3b7c 45 int test() {
ashleymills 0:0c17274c3b7c 46 MMA8452 acc(p28, p27, 40000);
ashleymills 0:0c17274c3b7c 47
ashleymills 0:0c17274c3b7c 48 acc.debugRegister(MMA8452_CTRL_REG_1);
ashleymills 0:0c17274c3b7c 49
ashleymills 0:0c17274c3b7c 50 LOG("Entering standby");
ashleymills 0:0c17274c3b7c 51 if(acc.standby()) {
ashleymills 0:0c17274c3b7c 52 LOG("Error putting MMA8452 in standby");
ashleymills 0:0c17274c3b7c 53 return false;
ashleymills 0:0c17274c3b7c 54 }
ashleymills 0:0c17274c3b7c 55
ashleymills 0:0c17274c3b7c 56 acc.debugRegister(MMA8452_CTRL_REG_1);
ashleymills 0:0c17274c3b7c 57
ashleymills 0:0c17274c3b7c 58 LOG("Activating MMA8452");
ashleymills 0:0c17274c3b7c 59 if(acc.activate()) {
ashleymills 0:0c17274c3b7c 60 LOG("Error activating MMA8452");
ashleymills 0:0c17274c3b7c 61 return false;
ashleymills 0:0c17274c3b7c 62 }
ashleymills 0:0c17274c3b7c 63
ashleymills 0:0c17274c3b7c 64 // test setting dynamic range
ashleymills 0:0c17274c3b7c 65 MMA8452::DynamicRange setRange = MMA8452::DYNAMIC_RANGE_UNKNOWN;
ashleymills 0:0c17274c3b7c 66 MMA8452::DynamicRange readRange = MMA8452::DYNAMIC_RANGE_UNKNOWN;
ashleymills 0:0c17274c3b7c 67 for(int i=0; i<=(int)MMA8452::DYNAMIC_RANGE_8G; i++) {
ashleymills 0:0c17274c3b7c 68 setRange = (MMA8452::DynamicRange)i;
ashleymills 0:0c17274c3b7c 69 if(acc.setDynamicRange(setRange)) {
ashleymills 0:0c17274c3b7c 70 LOG("Error setting dynamic range. Failing.");
ashleymills 0:0c17274c3b7c 71 return false;
ashleymills 0:0c17274c3b7c 72 }
ashleymills 0:0c17274c3b7c 73 readRange = acc.getDynamicRange();
ashleymills 0:0c17274c3b7c 74 if(readRange!=setRange) {
ashleymills 0:0c17274c3b7c 75 LOG("Read dynamic range: 0x%x does not match set: 0x%x",readRange,setRange);
ashleymills 0:0c17274c3b7c 76 return false;
ashleymills 0:0c17274c3b7c 77 }
ashleymills 0:0c17274c3b7c 78 LOG("Success on dynamic range %d",i);
ashleymills 0:0c17274c3b7c 79 }
ashleymills 0:0c17274c3b7c 80
ashleymills 0:0c17274c3b7c 81 // test setting data rate
ashleymills 0:0c17274c3b7c 82 for(int i=0; i<=(int)MMA8452::RATE_1_563; i++) {
ashleymills 0:0c17274c3b7c 83 if(acc.setDataRate((MMA8452::DataRateHz)i)) {
ashleymills 0:0c17274c3b7c 84 LOG("Error setting data rate. Failing.");
ashleymills 0:0c17274c3b7c 85 return false;
ashleymills 0:0c17274c3b7c 86 }
ashleymills 0:0c17274c3b7c 87 if(acc.getDataRate()!=(MMA8452::DataRateHz)i) {
ashleymills 0:0c17274c3b7c 88 LOG("Read data rate: 0x%x does not match set: 0x%x",acc.getDataRate(),(MMA8452::DataRateHz)i);
ashleymills 0:0c17274c3b7c 89 return false;
ashleymills 0:0c17274c3b7c 90 }
ashleymills 0:0c17274c3b7c 91 LOG("Success on data rate %d",i);
ashleymills 0:0c17274c3b7c 92 }
ashleymills 0:0c17274c3b7c 93
ashleymills 0:0c17274c3b7c 94 // set bit depth to 8 and read some values
ashleymills 0:0c17274c3b7c 95 LOG("Sampling at BIT_DEPTH_8");
ashleymills 0:0c17274c3b7c 96 acc.setBitDepth(MMA8452::BIT_DEPTH_8);
ashleymills 0:0c17274c3b7c 97 sampleMMA8452(&acc,10);
ashleymills 0:0c17274c3b7c 98
ashleymills 0:0c17274c3b7c 99 // set bit depth to 12 and read some values
ashleymills 0:0c17274c3b7c 100 LOG("Sampling at BIT_DEPTH_12");
ashleymills 0:0c17274c3b7c 101 acc.setDataRate(MMA8452::RATE_100);
ashleymills 0:0c17274c3b7c 102 acc.setBitDepth(MMA8452::BIT_DEPTH_12);
ashleymills 0:0c17274c3b7c 103 sampleMMA8452(&acc,10);
ashleymills 0:0c17274c3b7c 104
ashleymills 0:0c17274c3b7c 105 return true;
ashleymills 0:0c17274c3b7c 106 }
ashleymills 0:0c17274c3b7c 107
ashleymills 0:0c17274c3b7c 108 void loop() {
ashleymills 0:0c17274c3b7c 109 while(1) {
ashleymills 0:0c17274c3b7c 110 wait(1);
ashleymills 0:0c17274c3b7c 111 }
ashleymills 0:0c17274c3b7c 112 }
ashleymills 0:0c17274c3b7c 113
ashleymills 0:0c17274c3b7c 114 int main() {
ashleymills 0:0c17274c3b7c 115 pc.baud(115200);
ashleymills 0:0c17274c3b7c 116 LOG("Begin");
ashleymills 0:0c17274c3b7c 117 for(int i=0; i<20; i++) {
ashleymills 0:0c17274c3b7c 118 LOG(" ");
ashleymills 0:0c17274c3b7c 119 }
ashleymills 0:0c17274c3b7c 120 if(!test()) {
ashleymills 0:0c17274c3b7c 121 LOG("FAIL.");
ashleymills 0:0c17274c3b7c 122 loop();
ashleymills 0:0c17274c3b7c 123 }
ashleymills 0:0c17274c3b7c 124 LOG("Tests passed");
ashleymills 0:0c17274c3b7c 125 loop();
ashleymills 0:0c17274c3b7c 126 }