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

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
kkado
Date:
Wed Aug 02 22:10:06 2017 +0000
Commit message:
Initial commit

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r f638a5d8ddf4 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Aug 02 22:10:06 2017 +0000
@@ -0,0 +1,124 @@
+#include "mbed.h"
+
+#define SAMPLES 128
+
+I2C i2c(PB_9, PB_8);                //Initialize i2c master, where PB_9 is SDA, PB_8 is SCL
+Serial pc(SERIAL_TX, SERIAL_RX);    //Init serial connection to PC
+Timer t;                            //Timing and stuff
+
+const int addr = 0x90;
+float C[SAMPLES];
+
+////////////////////////////////////////////////////////////////////////////////
+//                              FUNCTIONS                                     //
+////////////////////////////////////////////////////////////////////////////////
+
+//Initialize the AD7746
+void capInit(){             //Initialize EXC and CAP
+    char cmd[2];
+    
+    cmd[0] = 0x09;          //EXC setup
+    cmd[1] = 0b00001011;
+    i2c.write(addr,cmd,2);
+    
+    cmd[0] = 0x07;          //CAP setup
+    
+    //De-comment the integration time desired
+    //cmd[1] = 0b10000000;  //11.0ms (90.9 Hz)
+    //cmd[1] = 0b10000001;  //11.9ms (83.8 Hz)
+    cmd[1] = 0b10000010;  //20.0ms (50.0 Hz)
+    //cmd[1] = 0b10000011;  //38.0ms (26.3 Hz)
+    //cmd[1] = 0b10000100;  //62.0ms (16.1 Hz)
+    //cmd[1] = 0b10000101;  //77.0ms (13.0 Hz)
+    //cmd[1] = 0b10000110;  //92.0ms (10.9 Hz)
+    //cmd[1] = 0b10000111;  //109.6ms (9.1 Hz)
+    i2c.write(addr,cmd,2);
+}
+
+//Initialize the CAPDAC
+void capdac(){
+    char cmd[2];
+    
+    cmd[0] = 0x0B;
+    cmd[1] = 0x80 | 30;
+    i2c.write(addr,cmd,2);
+}
+
+//Check if the AD7746 is ready to do another measurement
+bool checkRdy(){
+    uint8_t donebit;
+    
+    i2c.start();            //Read register 0x00 (status), mask & shift RDY bit
+    i2c.write(addr & 0xFE);
+    i2c.write(0x00);
+    i2c.start();
+    i2c.write(addr | 0x01);
+    donebit = i2c.read(0);
+    i2c.stop();
+    donebit = (bool)((donebit & 0b00000100) >> 2);
+    return donebit;
+}
+
+//Take a single capacitance measurement
+float capRead(){
+    char cmd[2];
+    uint8_t lb1, lb2, lb3;
+    uint32_t lb;
+    float result;
+    
+    cmd[0] = 0x0A;          //Set up a single measurement
+    cmd[1] = 0b00000010;
+    i2c.write(addr,cmd,2);
+    
+    while(checkRdy()){      //Check status register if measurement is done
+        ;
+    }
+    
+    i2c.start();            //Read 3 bytes
+    i2c.write(addr & 0xFE);
+    i2c.write(0x01);
+    i2c.start();
+    i2c.write(addr | 0x01);
+    lb1 = i2c.read(1);
+    lb2 = i2c.read(1);
+    lb3 = i2c.read(0);
+    i2c.stop();
+    
+    lb = lb1*65536+lb2*256+lb3;     //Calculate capacitance
+    result = (lb-8388608)*4.096/8388608;
+    
+    //pc.printf("lb1 = %d, lb2 = %d, lb3 = %d\n",lb1,lb2,lb3);
+    //pc.printf("lb = %d\n",lb);
+    //pc.printf("C = %f\n",result);
+    
+    return result;
+}
+
+//Print over serial
+void printCap(){
+    for(uint16_t i = 0; i < SAMPLES; i++){
+        if(i == SAMPLES-1){
+            pc.printf("%f\n",C[i]);
+        }
+        else{
+            pc.printf("%f,",C[i]);
+        }
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//                                   MAIN                                     //
+////////////////////////////////////////////////////////////////////////////////
+
+int main(){
+    pc.baud(115200);
+    capInit();
+    capdac();
+    
+    while(1){        
+        for(uint16_t i = 0; i < SAMPLES; i++){
+            C[i] = capRead();
+        }
+        printCap();
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r f638a5d8ddf4 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Aug 02 22:10:06 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/mbed/builds/856d2700e60b
\ No newline at end of file