Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ad7606.cpp@0:d47d291acdf4, 2021-04-09 (annotated)
- Committer:
- antonmadto
- Date:
- Fri Apr 09 06:27:33 2021 +0000
- Revision:
- 0:d47d291acdf4
nnn
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
antonmadto | 0:d47d291acdf4 | 1 | /*************************************************************************** |
antonmadto | 0:d47d291acdf4 | 2 | * @author Francesco Adamo |
antonmadto | 0:d47d291acdf4 | 3 | * |
antonmadto | 0:d47d291acdf4 | 4 | * @section LICENSE |
antonmadto | 0:d47d291acdf4 | 5 | * |
antonmadto | 0:d47d291acdf4 | 6 | * Copyright (c) 2015 Francesco Adamo, Italy |
antonmadto | 0:d47d291acdf4 | 7 | * |
antonmadto | 0:d47d291acdf4 | 8 | * @section DESCRIPTION |
antonmadto | 0:d47d291acdf4 | 9 | * |
antonmadto | 0:d47d291acdf4 | 10 | * AD7606.CPP |
antonmadto | 0:d47d291acdf4 | 11 | * Source file for AD7606 class library |
antonmadto | 0:d47d291acdf4 | 12 | * The AD7606BSTZ is a 16-bits, 8-channels, SPI/Parallel-interfaced ADC from Analog Devices |
antonmadto | 0:d47d291acdf4 | 13 | * |
antonmadto | 0:d47d291acdf4 | 14 | *****************************************************************************/ |
antonmadto | 0:d47d291acdf4 | 15 | |
antonmadto | 0:d47d291acdf4 | 16 | #include "ad7606.h" |
antonmadto | 0:d47d291acdf4 | 17 | |
antonmadto | 0:d47d291acdf4 | 18 | |
antonmadto | 0:d47d291acdf4 | 19 | // Constructor |
antonmadto | 0:d47d291acdf4 | 20 | AD7606::AD7606(PinName MISO, PinName SCLK, PinName CS, PinName CONVST, PinName BUSY, PinName RESET, int frequency) : _spi(NC, MISO, SCLK), _cs(CS), _convst(CONVST), _busy(BUSY), _reset(RESET) { |
antonmadto | 0:d47d291acdf4 | 21 | _spi.frequency(frequency); |
antonmadto | 0:d47d291acdf4 | 22 | _spi.format(8, 0); |
antonmadto | 0:d47d291acdf4 | 23 | _cs = 1; |
antonmadto | 0:d47d291acdf4 | 24 | _convst = 1; |
antonmadto | 0:d47d291acdf4 | 25 | _reset = 0; |
antonmadto | 0:d47d291acdf4 | 26 | _q = 0.0; |
antonmadto | 0:d47d291acdf4 | 27 | reset(); |
antonmadto | 0:d47d291acdf4 | 28 | }; |
antonmadto | 0:d47d291acdf4 | 29 | |
antonmadto | 0:d47d291acdf4 | 30 | // Resets the AD7606 |
antonmadto | 0:d47d291acdf4 | 31 | void AD7606::reset() { |
antonmadto | 0:d47d291acdf4 | 32 | _reset = 1; |
antonmadto | 0:d47d291acdf4 | 33 | _reset = 0; |
antonmadto | 0:d47d291acdf4 | 34 | } |
antonmadto | 0:d47d291acdf4 | 35 | |
antonmadto | 0:d47d291acdf4 | 36 | // Computes and stores the quantization step of the AD7606 as a function of its dynamic range (10 V or 20 V) |
antonmadto | 0:d47d291acdf4 | 37 | void AD7606::setDR(double DR) { |
antonmadto | 0:d47d291acdf4 | 38 | _q = (double) DR/65535.0; // Quantization step |
antonmadto | 0:d47d291acdf4 | 39 | } |
antonmadto | 0:d47d291acdf4 | 40 | |
antonmadto | 0:d47d291acdf4 | 41 | // Read raw values from all 8 channels |
antonmadto | 0:d47d291acdf4 | 42 | // rawDataBuffer is a pointer to an array of 8 16-bit integers |
antonmadto | 0:d47d291acdf4 | 43 | void AD7606::readRAW(int16_t *rawDataBuffer) { |
antonmadto | 0:d47d291acdf4 | 44 | uint8_t lowByte, highByte; |
antonmadto | 0:d47d291acdf4 | 45 | |
antonmadto | 0:d47d291acdf4 | 46 | _convst = 0; // Pulse CONVSTA/CONVSTB to start conversion |
antonmadto | 0:d47d291acdf4 | 47 | _convst = 1; |
antonmadto | 0:d47d291acdf4 | 48 | wait_us(5); |
antonmadto | 0:d47d291acdf4 | 49 | //while (_busy) { |
antonmadto | 0:d47d291acdf4 | 50 | // wait for conversions to be completed (low level on BUSY) |
antonmadto | 0:d47d291acdf4 | 51 | //} |
antonmadto | 0:d47d291acdf4 | 52 | _cs = 0; // Enable DOUTA/DOUTB lines and shift-out the conversion results |
antonmadto | 0:d47d291acdf4 | 53 | for (char k = 0; k < 8; k++) { |
antonmadto | 0:d47d291acdf4 | 54 | highByte = _spi.write(0x00); |
antonmadto | 0:d47d291acdf4 | 55 | lowByte = _spi.write(0x00); |
antonmadto | 0:d47d291acdf4 | 56 | *(rawDataBuffer + k) = (int16_t) ((highByte << 8) + lowByte); |
antonmadto | 0:d47d291acdf4 | 57 | } |
antonmadto | 0:d47d291acdf4 | 58 | _cs = 1; |
antonmadto | 0:d47d291acdf4 | 59 | } |
antonmadto | 0:d47d291acdf4 | 60 | |
antonmadto | 0:d47d291acdf4 | 61 | // Read analog values from all 8 channels |
antonmadto | 0:d47d291acdf4 | 62 | // analogDataBuffer is a pointer to an array of 8 doubles |
antonmadto | 0:d47d291acdf4 | 63 | void AD7606::readAnalog(double *analogDataBuffer) { |
antonmadto | 0:d47d291acdf4 | 64 | uint8_t lowByte, highByte; |
antonmadto | 0:d47d291acdf4 | 65 | |
antonmadto | 0:d47d291acdf4 | 66 | _convst = 0; // Pulse CONVSTA/CONVSTB to start conversion |
antonmadto | 0:d47d291acdf4 | 67 | wait_us(1); |
antonmadto | 0:d47d291acdf4 | 68 | _convst = 1; |
antonmadto | 0:d47d291acdf4 | 69 | wait_us(5); |
antonmadto | 0:d47d291acdf4 | 70 | //while (_busy) { |
antonmadto | 0:d47d291acdf4 | 71 | // wait for conversions to be completed (low level on BUSY) |
antonmadto | 0:d47d291acdf4 | 72 | //} |
antonmadto | 0:d47d291acdf4 | 73 | _cs = 0; // Enable DOUTA/DOUTB lines and shift-out the conversion results |
antonmadto | 0:d47d291acdf4 | 74 | for (char k = 0; k < 8; k++) { |
antonmadto | 0:d47d291acdf4 | 75 | highByte = _spi.write(0x00); |
antonmadto | 0:d47d291acdf4 | 76 | lowByte = _spi.write(0x00); |
antonmadto | 0:d47d291acdf4 | 77 | *(analogDataBuffer + k) = (double) ((int16_t) ((highByte << 8) + lowByte))*_q; |
antonmadto | 0:d47d291acdf4 | 78 | } |
antonmadto | 0:d47d291acdf4 | 79 | _cs = 1; |
antonmadto | 0:d47d291acdf4 | 80 | } |