Kevin Kadooka
/
Nucleo_AD7746
Sample code to interface with the Analog Devices AD7746 capacitance-to-digital converter (CDC).
Revision 0:f638a5d8ddf4, committed 2017-08-02
- 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