This is a Driver for the Analog Devices AD7989 18 Bit ADC.
AD7989.cpp@8:b143706d6c43, 2019-02-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |