Here is a ADS330 Datasheet. A Sample from other pcb and headers.
A code with slightly clearer command namings.
Neither alpha nor beta attempts work for single channel reading.
Here is a ADS330 Datasheet. A Sample from other pcb and headers.
A code with slightly clearer command namings.
Neither alpha nor beta attempts work for single channel reading.
#include <SPI.h> | |
#define ADC_CS_PIN 2 | |
#define ADC_CONVERSION_PIN 3 | |
#define ADC_EOC_PIN 4 | |
enum Command : uint16_t { | |
SEL_AN_IN_CHANNEL_0 = 0b0000 << 12, | |
SEL_AN_IN_CHANNEL_1 = 0b0001 << 12, | |
WAKE_UP = 0b1011 << 12, | |
READ_CFG_REGISTER = 0b1100 << 12, | |
READ_DATA = 0b1101 << 12, | |
WRITE_CFG_REGISTER = 0b1110 << 12, | |
RESET_CFG_REGISTER = 0b1111 << 12, | |
}; | |
enum CfgReg : uint16_t { | |
SYSTEM_RESET_, | |
AUTO_SELECT = 0b1 << 11, | |
INTERNAL_CCLK = 0b1 << 10, | |
MANUAL_TRIGGER = 0b1 << 9, | |
EOC_ACTIVE_LOW = 0b1 << 7, | |
PIN_EOC = 0b1 << 6, | |
EOC_OUT = 0b1 << 5, | |
DISABLE_POWER_DOWN = 0b111 << 2, | |
ENABLE_TAG = 0b1 << 1, | |
NORMAL_OPERATION = 0b1 << 0, | |
}; | |
uint16_t write_(uint16_t txBuffer) { | |
uint16_t data_; | |
digitalWrite(ADC_CS_PIN, LOW); | |
data_ = SPI.transfer16(txBuffer); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
return data_; | |
} | |
uint16_t read_(int16_t channel) | |
{ | |
// Select channel | |
write_(channel); | |
// Start conversion | |
digitalWrite(ADC_CONVERSION_PIN, LOW); | |
digitalWrite(ADC_CONVERSION_PIN, HIGH); | |
// Wait until EOC | |
while (digitalRead(ADC_EOC_PIN) == LOW); | |
// Read result | |
return write_(READ_DATA); | |
} | |
void setup() | |
{ | |
Serial.begin(115200); | |
while (!Serial){ | |
delay(1); | |
} | |
SPI.setDataMode(SPI_MODE0); | |
SPI.begin(0); | |
pinMode(ADC_CS_PIN, OUTPUT); | |
pinMode(ADC_CONVERSION_PIN, OUTPUT); | |
pinMode(ADC_EOC_PIN, INPUT); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
digitalWrite(ADC_CONVERSION_PIN, HIGH); | |
uint16_t command = 0, result; | |
result = write_(WRITE_CFG_REGISTER | SYSTEM_RESET_); | |
result = write_(WRITE_CFG_REGISTER | |
| INTERNAL_CCLK | |
| MANUAL_TRIGGER | |
| EOC_ACTIVE_LOW | |
| PIN_EOC | |
| EOC_OUT | |
| DISABLE_POWER_DOWN | |
| NORMAL_OPERATION); | |
result = write_(READ_CFG_REGISTER); | |
result = write_(SEL_AN_IN_CHANNEL_0); | |
} | |
void loop() | |
{ | |
// READ CH0 | |
uint16_t adc_ch0_value = read_(SEL_AN_IN_CHANNEL_0); | |
// ------------------------ | |
Serial.println(adc_ch0_value); | |
delay(10); | |
} |
#include <SPI.h> | |
#define ADC_CS_PIN 2 | |
#define ADC_CONVERSION_PIN 3 | |
#define ADC_EOC_PIN 4 | |
/* Command Definitions */ | |
#define ADS8330_CMR_DEFAULT 0b1111000000000000ul /* reset to device default */ | |
#define ADS8330_CMR_WCFR 0b1110000000000000ul /* write device commands */ | |
#define ADS8330_CMR_RCFR 0b1100000000000000ul /* read device commands */ | |
#define ADS8330_CMR_WAKE 0b1011000000000000ul /* wake device from nap */ | |
#define ADS8330_CMR_RDATA 0b1101000000000000ul /* read ADC data */ | |
#define ADS8330_CMR_CH0 0b0000000000000000ul /* select ADC channel 0 */ | |
#define ADS8330_CMR_CH1 0b0001000000000000ul /* select ADC channel 1 */ | |
#define ADS8330_CFR_D11 0b0000100000000000ul /* auto channel */ | |
#define ADS8330_CFR_D10 0b0000010000000000ul /* internal conversion clock */ | |
#define ADS8330_CFR_D9 0b0000001000000000ul /* manual conversion */ | |
#define ADS8330_CFR_D6_7 0b0000000011000000ul /* EOC low */ | |
#define ADS8330_CFR_D5 0b0000000000100000ul /* EOC output */ | |
#define ADS8330_CFR_D2_3_4_MANU 0b0000000000010100ul /* power save */ | |
#define ADS8330_CFR_D2_3_4_AUTO 0b0000000000011100ul /* power save */ | |
#define ADS8330_CFR_D1 0b0000000000000010ul /* tag bit */ | |
#define ADS8330_CFR_D0 0b0000000000000001ul /* device run normal/reset */ | |
#define ADS8330_CMR_CONF_MANU ADS8330_CMR_WCFR | ADS8330_CFR_D10 | ADS8330_CFR_D9 | |
#define ADS8330_CMR_CONF_AUTO ADS8330_CMR_WCFR | ADS8330_CFR_D10 | |
#define ADS8330_CFR_CONF_MANU ADS8330_CFR_D6_7 | ADS8330_CFR_D5 | ADS8330_CFR_D2_3_4_MANU | ADS8330_CFR_D0 | |
#define ADS8330_CFR_CONF_AUTO ADS8330_CFR_D6_7 | ADS8330_CFR_D5 | ADS8330_CFR_D2_3_4_AUTO | ADS8330_CFR_D0 | |
uint16_t adc_ch0_value; | |
float adc_ch0_volts; | |
const float adc_referecnce_voltage = 3.3f; | |
const float adc_factor = adc_referecnce_voltage / UINT16_MAX; | |
void setup() | |
{ | |
Serial.begin(115200); | |
while (!Serial){ | |
delay(1); | |
} | |
SPI.setDataMode(SPI_MODE0); | |
SPI.begin(ADC_CS_PIN); | |
pinMode(ADC_CS_PIN, OUTPUT); | |
pinMode(ADC_CONVERSION_PIN, OUTPUT); | |
pinMode(ADC_EOC_PIN, INPUT); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
digitalWrite(ADC_CONVERSION_PIN, HIGH); | |
uint16_t command = 0; | |
command = (ADS8330_CMR_WCFR | ADS8330_CMR_DEFAULT); | |
digitalWrite(ADC_CS_PIN, LOW); | |
SPI.transfer16(command); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
command = (ADS8330_CMR_CONF_MANU | ADS8330_CFR_CONF_MANU); | |
digitalWrite(ADC_CS_PIN, LOW); | |
SPI.transfer16(command); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
command = ADS8330_CMR_RCFR; | |
digitalWrite(ADC_CS_PIN, LOW); | |
SPI.transfer16(command); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
command = ADS8330_CMR_CH0; | |
digitalWrite(ADC_CS_PIN, LOW); | |
SPI.transfer16(command); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
} | |
void loop() | |
{ | |
// READ CH0 | |
digitalWrite(ADC_CS_PIN, LOW); | |
SPI.transfer16(ADS8330_CMR_CH0); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
digitalWrite(ADC_CONVERSION_PIN, LOW); | |
digitalWrite(ADC_CONVERSION_PIN, HIGH); | |
while (digitalRead(ADC_EOC_PIN) == LOW); | |
digitalWrite(ADC_CS_PIN, LOW); | |
adc_ch0_value = SPI.transfer16(ADS8330_CMR_RDATA); | |
digitalWrite(ADC_CS_PIN, HIGH); | |
adc_ch0_volts = adc_ch0_value * adc_factor; | |
// ------------------------ | |
Serial.println(adc_ch0_volts, 5); | |
Serial.println(); | |
delay(10); | |
} |
Thanks @Hennnnnnryyyy project using ADS8830 is moving slowly so any help is welcome :) event 2 years later. Will try your suggested changes.