Kevin Kadooka
/
Nucleo_AD7746
Sample code to interface with the Analog Devices AD7746 capacitance-to-digital converter (CDC).
main.cpp@0:f638a5d8ddf4, 2017-08-02 (annotated)
- Committer:
- kkado
- Date:
- Wed Aug 02 22:10:06 2017 +0000
- Revision:
- 0:f638a5d8ddf4
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |