Код для MCP3201

arssev1
Offline
Зарегистрирован: 10.04.2014

Появилась необходимость использовать MCP3201, по началу решил, что проблем с кодом не должно возникнуть, т.к. в сети куча примеров работы с серией MCP320X, да только вот все примеры для MCP3208/3204, у них есть одно аппаратное отличие - наличие пина Din или MOSI, а вот в MCP3201 его нет. Как отредактировать код под MCP3201

#define SELPIN 10 //Selection Pin 
#define DATAOUT 11//MOSI 
#define DATAIN  12//MISO 
#define SPICLOCK  13//Clock 
int readvalue; 

void setup(){ 
 //set pin modes 
 pinMode(SELPIN, OUTPUT); 
 pinMode(DATAOUT, OUTPUT); 
 pinMode(DATAIN, INPUT); 
 pinMode(SPICLOCK, OUTPUT); 
 //disable device to start with 
 digitalWrite(SELPIN,HIGH); 
 digitalWrite(DATAOUT,LOW); 
 digitalWrite(SPICLOCK,LOW); 

 Serial.begin(9600); 
} 

int read_adc(int channel){
  int adcvalue = 0;
  byte commandbits = B11000000; //command bits - start, mode, chn (3), dont care (3)

  //allow channel selection
  commandbits|=((channel-1)<<3);

  digitalWrite(SELPIN,LOW); //Select adc
  // setup bits to be written
  for (int i=7; i>=3; i--){
    digitalWrite(DATAOUT,commandbits&1<<i);
    //cycle clock
    digitalWrite(SPICLOCK,HIGH);
    digitalWrite(SPICLOCK,LOW);    
  }

  digitalWrite(SPICLOCK,HIGH);    //ignores 2 null bits
  digitalWrite(SPICLOCK,LOW);
  digitalWrite(SPICLOCK,HIGH);  
  digitalWrite(SPICLOCK,LOW);

  //read bits from adc
  for (int i=11; i>=0; i--){
    adcvalue+=digitalRead(DATAIN)<<i;
    //cycle clock
    digitalWrite(SPICLOCK,HIGH);
    digitalWrite(SPICLOCK,LOW);
  }
  digitalWrite(SELPIN, HIGH); //turn off device
  return adcvalue;
}


void loop() { 
 readvalue = read_adc(1); 
 Serial.println(readvalue,DEC); 
 readvalue = read_adc(2); 
 Serial.println(readvalue,DEC); 
 Serial.println(" "); 
 delay(250); 
} 

http://ww1.microchip.com/downloads/en/DeviceDoc/21290F.pdf - даташит MCP3201

http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf - даташит MCP3204/3208

arssev1
Offline
Зарегистрирован: 10.04.2014

Нашел в гугле следующий вариант кода для работы непосредственно с MCP3201, но он не рабочий

#include <SPI.h>

const int chipSelectPinADC = 9;
unsigned int result = 0;
byte inByte = 0;

void setup()
{
Serial.begin(9600);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV4);
pinMode(chipSelectPinADC, OUTPUT);
digitalWrite(chipSelectPinADC, HIGH);
}

void loop()
{
digitalWrite(chipSelectPinADC, LOW);
result = SPI.transfer(0×00);
result = result << 8;
inByte = SPI.transfer(0×00);
result = result | inByte;
digitalWrite(chipSelectPinADC, HIGH);
result = result >> 1;
result = result & 0b0000111111111111;
Serial.println(result);
delay(1000);
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

И в чем проблема?
Spi без одного пина. Потому что АЦП нечего от вас получать. Как только вы выбираете его чип селектом. Он сразу начинает слать вам чего у него там на входе. Почитайте протокол spi.