This is a Driver for the Analog Devices AD7989 18 Bit ADC.

Committer:
Ryan Vasquez
Date:
Mon Feb 04 11:09:56 2019 -0600
Revision:
8:b143706d6c43
Parent:
0:64eaedfa13a2
fixed the for loop in the averaging function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rvasquez6089 0:64eaedfa13a2 1 #include "AD7989.h"
rvasquez6089 0:64eaedfa13a2 2
rvasquez6089 0:64eaedfa13a2 3 const float AD7989_Driver::zero_point = 5.0;
rvasquez6089 0:64eaedfa13a2 4
rvasquez6089 0:64eaedfa13a2 5 AD7989_Driver::AD7989_Driver(SPI *SPI_BUS, DigitalOut *Chip_Select, DigitalOut *Convert)
rvasquez6089 0:64eaedfa13a2 6 {
rvasquez6089 0:64eaedfa13a2 7 ADC_SPI = SPI_BUS;
rvasquez6089 0:64eaedfa13a2 8 CS = Chip_Select;
rvasquez6089 0:64eaedfa13a2 9 ADC_CONV = Convert;
rvasquez6089 0:64eaedfa13a2 10 }
rvasquez6089 0:64eaedfa13a2 11
rvasquez6089 0:64eaedfa13a2 12 double AD7989_Driver::sample()
rvasquez6089 0:64eaedfa13a2 13 {
rvasquez6089 0:64eaedfa13a2 14 long raw;
rvasquez6089 0:64eaedfa13a2 15 long bits;
rvasquez6089 0:64eaedfa13a2 16 ADC_CONV->write(1);
rvasquez6089 0:64eaedfa13a2 17 wait_us(2);
rvasquez6089 0:64eaedfa13a2 18 CS->write(0);
rvasquez6089 0:64eaedfa13a2 19 raw = 0;
rvasquez6089 0:64eaedfa13a2 20 bits = (ADC_SPI->write(0x00)) << 16;
rvasquez6089 0:64eaedfa13a2 21 //printf("First Octet = 0x%X \n",bits);
rvasquez6089 0:64eaedfa13a2 22 raw = bits;
rvasquez6089 0:64eaedfa13a2 23 bits = 0;
rvasquez6089 0:64eaedfa13a2 24 bits = (ADC_SPI->write(0x00)) << 8;
rvasquez6089 0:64eaedfa13a2 25 //printf("Second Octet = 0x%X \n",bits);
rvasquez6089 0:64eaedfa13a2 26 raw = bits + raw;
rvasquez6089 0:64eaedfa13a2 27 bits = 0;
rvasquez6089 0:64eaedfa13a2 28 bits = (ADC_SPI->write(0x00));
rvasquez6089 0:64eaedfa13a2 29 CS->write(1);
rvasquez6089 0:64eaedfa13a2 30 ADC_CONV->write(0);
rvasquez6089 0:64eaedfa13a2 31 //printf("Third Octet = 0x%X \n",bits);
rvasquez6089 0:64eaedfa13a2 32 raw = bits + raw;
rvasquez6089 0:64eaedfa13a2 33 bits = 0;
rvasquez6089 0:64eaedfa13a2 34 raw = raw >> 6;
rvasquez6089 0:64eaedfa13a2 35 //converts 2's complement 18 bit number into a 32 bit signed 2's complement number
rvasquez6089 0:64eaedfa13a2 36 raw = (raw >> 17) == 0 ? raw : (0xFFFFFFFF ^ 0x3FFFF) | raw;
rvasquez6089 0:64eaedfa13a2 37 volts = (static_cast<double>(raw)/(pow(2.0,18)));
rvasquez6089 0:64eaedfa13a2 38 volts = (volts*10.0)-zero_point; //This assumed you are using a 5 volt Vref
rvasquez6089 0:64eaedfa13a2 39 //pc.printf("%f \n", volts);
rvasquez6089 0:64eaedfa13a2 40 return volts;
rvasquez6089 0:64eaedfa13a2 41 }
rvasquez6089 0:64eaedfa13a2 42
rvasquez6089 0:64eaedfa13a2 43 double AD7989_Driver::sample_avg(int num_avgs)
rvasquez6089 0:64eaedfa13a2 44 {
rvasquez6089 0:64eaedfa13a2 45 double temp = 0.0;
Ryan Vasquez 8:b143706d6c43 46 for(int i = 0; i < num_avgs; i++)
rvasquez6089 0:64eaedfa13a2 47 {
rvasquez6089 0:64eaedfa13a2 48 temp = temp + sample();
rvasquez6089 0:64eaedfa13a2 49 }
rvasquez6089 0:64eaedfa13a2 50 temp = temp/num_avgs;
Ryan Vasquez 8:b143706d6c43 51 }