some more adc code

This commit is contained in:
2014-11-04 16:33:45 +01:00
parent eb89aef4a5
commit 4947094772
5 changed files with 130 additions and 55 deletions

View File

@ -15,7 +15,7 @@ void setup() {
pinMode(13, OUTPUT); pinMode(13, OUTPUT);
ads1210.begin(9); ads1210.begin(9, 8);
} }
@ -24,8 +24,7 @@ void loop() {
delay(1000); // wait for a second delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second delay(1000); // wait for a second
Serial << "Tick" << endl;
ads1210.begin(9);
uint32_t adcValue = ads1210.get();
Serial << "AdcValue: " << adcValue << endl;
} }

View File

@ -9,6 +9,9 @@
#include <SPI.h> #include <SPI.h>
#include "Streaming.h" #include "Streaming.h"
#include "ads1210.h" #include "ads1210.h"
#include "fatal.h"
ADS1210::ADS1210() { ADS1210::ADS1210() {
} }
@ -20,68 +23,119 @@ void ADS1210::disableCS() const {
digitalWrite(m_csPin, HIGH); digitalWrite(m_csPin, HIGH);
} }
void ADS1210::writeCMR () const { void ADS1210::waitForDRdy() const {
uint8_t instr = INSR_MB1 | INSR_MB0 | ADDR_CMR3; uint32_t timeOut = 100000;
enableCS(); while ((0 != digitalRead(m_drdyPin)) && timeOut--) {
SPI.transfer(instr); }
SPI.transfer(m_cmrWriteShadow[3]); if (0 == timeOut) {
SPI.transfer(m_cmrWriteShadow[2]); fatal(1);
SPI.transfer(m_cmrWriteShadow[1]); }
SPI.transfer(m_cmrWriteShadow[0]);
disableCS();
} }
void ADS1210::readCMR () { void waitForDRdyWOTimeout() const {
uint8_t instr = INSR_MB1 | INSR_MB0 | ADDR_CMR3 | INSR_RW; while (0 != digitalRead(m_drdyPin)) {
enableCS(); }
SPI.transfer(instr); }
m_cmrReadShadow[3] = SPI.transfer(0);
m_cmrReadShadow[2] = SPI.transfer(0);
m_cmrReadShadow[1] = SPI.transfer(0); void ADS1210::writeRegister(const uint8_t regAddr, const uint8_t value) const {
m_cmrReadShadow[0] = SPI.transfer(0); waitForDRdy();
disableCS(); enableCS();
SPI.transfer(regAddr);
SPI.transfer(value);
disableCS();
} }
uint8_t ADS1210::readRegister(const uint8_t regAddr) const {
uint8_t res;
waitForDRdy();
enableCS();
SPI.transfer(regAddr | INSR_RW);
res = SPI.transfer(0);
disableCS();
return res;
}
void ADS1210::begin(uint8_t csPin) { uint32_t ADS1210::readDataOutRegister() const {
union {
uint8_t in[4];
uint32_t out;
} res;
waitForDRdy();
enableCS();
SPI.transfer(ADDR_DOR2 | INSR_MB1 | INSR_RW);
res.in[2] = SPI.transfer();
res.in[1] = SPI.transfer();
res.in[0] = SPI.transfer();
res.in[3] = 0;
disableCS();
Serial << "DOR4x8: " << _HEX(res.in[3]) << " " << _HEX(res.in[2]) << " " << _HEX(res.in[1]) << " " << _HEX(res.in[0]) << endl;
Serial << "DOR1x32: " << _HEX(res.out) << endl;
return res.out;
}
void ADS1210::disableRefO() const {
uint8_t cmr = readRegister(ADDR_CMR3);
cmr &= ~CMR_REFO;
writeRegister(ADDR_CMR3, cmr);
}
void ADS1210::enableRefO() const {
uint8_t cmr = readRegister(ADDR_CMR3);
cmr |= CMR_REFO;
writeRegister(ADDR_CMR3, cmr);
}
void ADS1210::setMode(uint8_t mode) const {
uint8_t cmr = readRegister(ADDR_CMR2);
cmr &= ~CMR_MD_Mask;
cmr |= mode;
writeRegister(ADDR_CMR2, cmr);
}
void ADS1210::setGain(uint8_t gain) const {
uint8_t cmr = readRegister(ADDR_CMR2);
cmr &= ~CMR_Gain_Mask;
cmr |= gain;
writeRegister(ADDR_CMR2, cmr);
}
void ADS1210::begin(uint8_t csPin, uint8_t drdyPin) {
static bool onlyOnce = false; static bool onlyOnce = false;
m_csPin = csPin; m_csPin = csPin;
m_drdyPin = drdyPin;
// initialization of SPI // initialization of SPI
Serial << "Start SPI initialization ... ";
pinMode(m_csPin, OUTPUT); pinMode(m_csPin, OUTPUT);
digitalWrite(m_csPin, HIGH); digitalWrite(m_csPin, HIGH);
SPI.begin(); SPI.begin();
SPI.setBitOrder(MSBFIRST); SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV16); SPI.setClockDivider(SPI_CLOCK_DIV16);
SPI.setDataMode(SPI_MODE1); SPI.setDataMode(SPI_MODE1);
Serial << "done." << endl;
if (! onlyOnce) { // initialization of ADS1210
// initialization of the ADS1210 Serial << "Start ADS1210 initialization ... ";
m_cmrWriteShadow[3] |= CMR_SDL; pinMode(m_drdyPin, INPUT);
m_cmrWriteShadow[2] = 0; writeRegister(ADDR_CMR3, CMR_SDL | CMR_UB | CMR_REFO);
m_cmrWriteShadow[1] = 0; Serial << "done." << endl;
m_cmrWriteShadow[0] = 0;
writeCMR(); Serial << "SelfCalibration ... ";
// onlyOnce = true; setMode(CMR_MD_SelfCalibration);
} waitForDRdyWOTimeout();
Serial << "done." << endl;
// static bool toggleRefO = false;
// if (toggleRefO) {
// toggleRefO = false;
// m_cmrWriteShadow[3] |= CMR_REFO;
// } else {
// toggleRefO = true;
// m_cmrWriteShadow[3] &= ~CMR_REFO;
// }
// writeCMR();
readCMR();
Serial << "CMR3: " << _HEX(m_cmrReadShadow[3]) <<
", CMR2: " << _HEX(m_cmrReadShadow[2]) <<
", CMR1: " << _HEX(m_cmrReadShadow[1]) <<
", CMR0: " << _HEX(m_cmrReadShadow[0]) << endl;
} }
uint32_t ADS1210::get() const {
return readDataOutRegister();
}

View File

@ -11,8 +11,9 @@
class ADS1210 { class ADS1210 {
public: public:
ADS1210(); ADS1210();
void begin(uint8_t csPin); void begin(uint8_t csPin, uint8_t drdyPin);
uint32_t get(); uint32_t get() const;
private: private:
// register addresses // register addresses
const uint8_t ADDR_DOR2 = 0x00; const uint8_t ADDR_DOR2 = 0x00;
@ -67,14 +68,20 @@ private:
const uint8_t INSR_ADDR = 0x0f; const uint8_t INSR_ADDR = 0x0f;
uint8_t m_csPin; uint8_t m_csPin;
uint8_t m_drdyPin;
uint8_t m_cmrReadShadow[4];
uint8_t m_cmrWriteShadow[4];
void enableCS() const; void enableCS() const;
void disableCS() const; void disableCS() const;
void writeCMR() const; void writeRegister(const uint8_t regAddr, const uint8_t value) const;
void readCMR(); uint8_t readRegister(const uint8_t regAddr) const;
uint32_t readDataOutRegister() const;
void waitForDRdy() const;
void waitForDRdyWOTimeout() const;
void disableRefO() const;
void enableRefO() const;
void setMode(uint8_t mode) const;
void setGain(uint8_t gain) const;
}; };

9
fatal.cpp Normal file
View File

@ -0,0 +1,9 @@
#include "Streaming.h"
#include "fatal.h"
void fatal(uint8_t code) {
Serial << "Fatal: " << code << endl;
delay(1000);
while (true) ;
}

6
fatal.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef _FATAL_H_
#define _FATAL_H_
void fatal(uint8_t code);
#endif // _FATAL_H_