Код для MCP3201
- Войдите на сайт для отправки комментариев
Чт, 09/10/2014 - 21:31
Появилась необходимость использовать 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
Нашел в гугле следующий вариант кода для работы непосредственно с 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); }И в чем проблема?
Spi без одного пина. Потому что АЦП нечего от вас получать. Как только вы выбираете его чип селектом. Он сразу начинает слать вам чего у него там на входе. Почитайте протокол spi.