Devo collegare ed utilizzare l'ADC MCP3301.
L'ADC utilizza l'interfaccia SPI, che sembra semplice da utilizzare.
Però mi sfuggono alcune cose:
1.per quanto riguarda la configurazione
SPI.setClockDivider
SPI.setDataMode
SPI.setBitOrder()
quale sono i valori ottimali e/o esatti da utilizzare ?
Sto utilizzando il codice seguente per acquisire i valori, però non riesco a capire se funziona correttamente.
Come faccio a verificare ?
// inslude the SPI library:
#include <SPI.h>
define CS 10 // Pin Selezione
//# define MOSI 11 // MOSI
define MISO 12 // MISO
define SCLK 13 // CLOCK
#define FASTADC 1
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
long readvalue0;
void setup()
{
// Set pin modalità
pinMode (CS, OUTPUT);
//pinMode (MOSI, OUTPUT);
pinMode (MISO, INPUT);
pinMode (SCLK, OUTPUT);
// Disabilitare il dispositivo per iniziare
digitalWrite (CS, HIGH);
//digitalWrite (MOSI, LOW);
digitalWrite (SCLK, LOW);
Serial.begin (115200);
//SPI.setClockDivider (SPI_CLOCK_DIV2);
//SPI.setClockDivider (SPI_CLOCK_DIV4);
//SPI.setClockDivider (SPI_CLOCK_DIV8);
//SPI.setClockDivider (SPI_CLOCK_DIV16);
//SPI.setClockDivider (SPI_CLOCK_DIV32);
//SPI.setClockDivider (SPI_CLOCK_DIV64);
SPI.setClockDivider (SPI_CLOCK_DIV128);
SPI.setDataMode (SPI_MODE0);
//SPI.setDataMode (SPI_MODE1);
//SPI.setBitOrder (MSBFIRST);
//SPI.setBitOrder (LSBFIRST);
}
void loop ()
{
long t0=micros();
for(int k=0; k<500; k++)
{
readvalue0 = read_adcSlow ();
Serial.println (readvalue0, DEC);
}
}
int read_adcSlow ()
{
long avg = 0; int value=0;
for (int k=0; k<16; k++)
{
//Select adc
digitalWrite (CS, LOW); //pull CS low to enable
//cycle clock twice, ignore two null bits
digitalWrite (SCLK, HIGH);
digitalWrite (SCLK, LOW);
digitalWrite (SCLK, HIGH);
digitalWrite (SCLK, LOW);
// Legge i bit di adc
for (int i=11; i>=0; i--)
{
//value += digitalRead (MISO) << i;
value += (bitRead(PINB, 4) << i);
//cycle clock
digitalWrite (SCLK, HIGH);
digitalWrite (SCLK, LOW);
}
avg=avg+value;
digitalWrite (CS, HIGH);
//delayMicroseconds (10);
}
avg=avg/4;
return avg;
}
Praticamente