italia
Offline
Jr. Member
Karma: 0
Posts: 56
|
 |
« on: June 22, 2012, 04:32:37 am » |
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
|