Sample code to interface with the Analog Devices AD7746 capacitance-to-digital converter (CDC).

Dependencies:   mbed

Committer:
kkado
Date:
Wed Aug 02 22:10:06 2017 +0000
Revision:
0:f638a5d8ddf4
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kkado 0:f638a5d8ddf4 1 #include "mbed.h"
kkado 0:f638a5d8ddf4 2
kkado 0:f638a5d8ddf4 3 #define SAMPLES 128
kkado 0:f638a5d8ddf4 4
kkado 0:f638a5d8ddf4 5 I2C i2c(PB_9, PB_8); //Initialize i2c master, where PB_9 is SDA, PB_8 is SCL
kkado 0:f638a5d8ddf4 6 Serial pc(SERIAL_TX, SERIAL_RX); //Init serial connection to PC
kkado 0:f638a5d8ddf4 7 Timer t; //Timing and stuff
kkado 0:f638a5d8ddf4 8
kkado 0:f638a5d8ddf4 9 const int addr = 0x90;
kkado 0:f638a5d8ddf4 10 float C[SAMPLES];
kkado 0:f638a5d8ddf4 11
kkado 0:f638a5d8ddf4 12 ////////////////////////////////////////////////////////////////////////////////
kkado 0:f638a5d8ddf4 13 // FUNCTIONS //
kkado 0:f638a5d8ddf4 14 ////////////////////////////////////////////////////////////////////////////////
kkado 0:f638a5d8ddf4 15
kkado 0:f638a5d8ddf4 16 //Initialize the AD7746
kkado 0:f638a5d8ddf4 17 void capInit(){ //Initialize EXC and CAP
kkado 0:f638a5d8ddf4 18 char cmd[2];
kkado 0:f638a5d8ddf4 19
kkado 0:f638a5d8ddf4 20 cmd[0] = 0x09; //EXC setup
kkado 0:f638a5d8ddf4 21 cmd[1] = 0b00001011;
kkado 0:f638a5d8ddf4 22 i2c.write(addr,cmd,2);
kkado 0:f638a5d8ddf4 23
kkado 0:f638a5d8ddf4 24 cmd[0] = 0x07; //CAP setup
kkado 0:f638a5d8ddf4 25
kkado 0:f638a5d8ddf4 26 //De-comment the integration time desired
kkado 0:f638a5d8ddf4 27 //cmd[1] = 0b10000000; //11.0ms (90.9 Hz)
kkado 0:f638a5d8ddf4 28 //cmd[1] = 0b10000001; //11.9ms (83.8 Hz)
kkado 0:f638a5d8ddf4 29 cmd[1] = 0b10000010; //20.0ms (50.0 Hz)
kkado 0:f638a5d8ddf4 30 //cmd[1] = 0b10000011; //38.0ms (26.3 Hz)
kkado 0:f638a5d8ddf4 31 //cmd[1] = 0b10000100; //62.0ms (16.1 Hz)
kkado 0:f638a5d8ddf4 32 //cmd[1] = 0b10000101; //77.0ms (13.0 Hz)
kkado 0:f638a5d8ddf4 33 //cmd[1] = 0b10000110; //92.0ms (10.9 Hz)
kkado 0:f638a5d8ddf4 34 //cmd[1] = 0b10000111; //109.6ms (9.1 Hz)
kkado 0:f638a5d8ddf4 35 i2c.write(addr,cmd,2);
kkado 0:f638a5d8ddf4 36 }
kkado 0:f638a5d8ddf4 37
kkado 0:f638a5d8ddf4 38 //Initialize the CAPDAC
kkado 0:f638a5d8ddf4 39 void capdac(){
kkado 0:f638a5d8ddf4 40 char cmd[2];
kkado 0:f638a5d8ddf4 41
kkado 0:f638a5d8ddf4 42 cmd[0] = 0x0B;
kkado 0:f638a5d8ddf4 43 cmd[1] = 0x80 | 30;
kkado 0:f638a5d8ddf4 44 i2c.write(addr,cmd,2);
kkado 0:f638a5d8ddf4 45 }
kkado 0:f638a5d8ddf4 46
kkado 0:f638a5d8ddf4 47 //Check if the AD7746 is ready to do another measurement
kkado 0:f638a5d8ddf4 48 bool checkRdy(){
kkado 0:f638a5d8ddf4 49 uint8_t donebit;
kkado 0:f638a5d8ddf4 50
kkado 0:f638a5d8ddf4 51 i2c.start(); //Read register 0x00 (status), mask & shift RDY bit
kkado 0:f638a5d8ddf4 52 i2c.write(addr & 0xFE);
kkado 0:f638a5d8ddf4 53 i2c.write(0x00);
kkado 0:f638a5d8ddf4 54 i2c.start();
kkado 0:f638a5d8ddf4 55 i2c.write(addr | 0x01);
kkado 0:f638a5d8ddf4 56 donebit = i2c.read(0);
kkado 0:f638a5d8ddf4 57 i2c.stop();
kkado 0:f638a5d8ddf4 58 donebit = (bool)((donebit & 0b00000100) >> 2);
kkado 0:f638a5d8ddf4 59 return donebit;
kkado 0:f638a5d8ddf4 60 }
kkado 0:f638a5d8ddf4 61
kkado 0:f638a5d8ddf4 62 //Take a single capacitance measurement
kkado 0:f638a5d8ddf4 63 float capRead(){
kkado 0:f638a5d8ddf4 64 char cmd[2];
kkado 0:f638a5d8ddf4 65 uint8_t lb1, lb2, lb3;
kkado 0:f638a5d8ddf4 66 uint32_t lb;
kkado 0:f638a5d8ddf4 67 float result;
kkado 0:f638a5d8ddf4 68
kkado 0:f638a5d8ddf4 69 cmd[0] = 0x0A; //Set up a single measurement
kkado 0:f638a5d8ddf4 70 cmd[1] = 0b00000010;
kkado 0:f638a5d8ddf4 71 i2c.write(addr,cmd,2);
kkado 0:f638a5d8ddf4 72
kkado 0:f638a5d8ddf4 73 while(checkRdy()){ //Check status register if measurement is done
kkado 0:f638a5d8ddf4 74 ;
kkado 0:f638a5d8ddf4 75 }
kkado 0:f638a5d8ddf4 76
kkado 0:f638a5d8ddf4 77 i2c.start(); //Read 3 bytes
kkado 0:f638a5d8ddf4 78 i2c.write(addr & 0xFE);
kkado 0:f638a5d8ddf4 79 i2c.write(0x01);
kkado 0:f638a5d8ddf4 80 i2c.start();
kkado 0:f638a5d8ddf4 81 i2c.write(addr | 0x01);
kkado 0:f638a5d8ddf4 82 lb1 = i2c.read(1);
kkado 0:f638a5d8ddf4 83 lb2 = i2c.read(1);
kkado 0:f638a5d8ddf4 84 lb3 = i2c.read(0);
kkado 0:f638a5d8ddf4 85 i2c.stop();
kkado 0:f638a5d8ddf4 86
kkado 0:f638a5d8ddf4 87 lb = lb1*65536+lb2*256+lb3; //Calculate capacitance
kkado 0:f638a5d8ddf4 88 result = (lb-8388608)*4.096/8388608;
kkado 0:f638a5d8ddf4 89
kkado 0:f638a5d8ddf4 90 //pc.printf("lb1 = %d, lb2 = %d, lb3 = %d\n",lb1,lb2,lb3);
kkado 0:f638a5d8ddf4 91 //pc.printf("lb = %d\n",lb);
kkado 0:f638a5d8ddf4 92 //pc.printf("C = %f\n",result);
kkado 0:f638a5d8ddf4 93
kkado 0:f638a5d8ddf4 94 return result;
kkado 0:f638a5d8ddf4 95 }
kkado 0:f638a5d8ddf4 96
kkado 0:f638a5d8ddf4 97 //Print over serial
kkado 0:f638a5d8ddf4 98 void printCap(){
kkado 0:f638a5d8ddf4 99 for(uint16_t i = 0; i < SAMPLES; i++){
kkado 0:f638a5d8ddf4 100 if(i == SAMPLES-1){
kkado 0:f638a5d8ddf4 101 pc.printf("%f\n",C[i]);
kkado 0:f638a5d8ddf4 102 }
kkado 0:f638a5d8ddf4 103 else{
kkado 0:f638a5d8ddf4 104 pc.printf("%f,",C[i]);
kkado 0:f638a5d8ddf4 105 }
kkado 0:f638a5d8ddf4 106 }
kkado 0:f638a5d8ddf4 107 }
kkado 0:f638a5d8ddf4 108
kkado 0:f638a5d8ddf4 109 ////////////////////////////////////////////////////////////////////////////////
kkado 0:f638a5d8ddf4 110 // MAIN //
kkado 0:f638a5d8ddf4 111 ////////////////////////////////////////////////////////////////////////////////
kkado 0:f638a5d8ddf4 112
kkado 0:f638a5d8ddf4 113 int main(){
kkado 0:f638a5d8ddf4 114 pc.baud(115200);
kkado 0:f638a5d8ddf4 115 capInit();
kkado 0:f638a5d8ddf4 116 capdac();
kkado 0:f638a5d8ddf4 117
kkado 0:f638a5d8ddf4 118 while(1){
kkado 0:f638a5d8ddf4 119 for(uint16_t i = 0; i < SAMPLES; i++){
kkado 0:f638a5d8ddf4 120 C[i] = capRead();
kkado 0:f638a5d8ddf4 121 }
kkado 0:f638a5d8ddf4 122 printCap();
kkado 0:f638a5d8ddf4 123 }
kkado 0:f638a5d8ddf4 124 }