Sari la conținut
ELFORUM - Forumul electronistilor

Arduino mega cu MAX1285


Vlad Mihai

Postări Recomandate

@nico: dataADC e pe 16 biti si e neinitializata. Nu deranjeaza?

 

Pai Liviu, nu conteaza ce trimiti catre ADC pe SPI (in acest caz), e doar data pentru "fill in". Important este ce primesti. Nici nu e legat MOSI-ul la ceva.

 

Alimentarea  acestui max se face la 3.3V, voi folosi un level translator bidirectional pentru comunicatie

 

@vlad: Nu ai nevoie sa fie bidirectional. Un simplu 4050 este suficient. Poate chiar si numai un divizor din rezistente.

Editat de mars01
Link spre comentariu
  • Răspunsuri 33
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Vlad Mihai

    15

  • Liviu M

    9

  • nico_2010

    5

  • mars01

    5

Top autori în acest subiect

Imagini postate

Din punctul de vedere al aplicatiei de fata e clar. Intrebarea era legata de functia care primeste ca parametru un int in loc de byte. Probabil ca are loc un cast implicit. As putea testa daca genereaza macar un warning.

Link spre comentariu

@mars01 stiu ca nu am nevoie de  level  shifter  bidirectional, comunicatia se  face intr-un singur sens si se poate rezolva usor cu solutii amintite de tine sau chiar cu cate un tranzistor in conexiune emitor comun. Eu am deja acest level shifter gata  facut,  trebuie doar sa  trag firele si de asta il folosesc.

@nico_2010 am inlocuit int cu byte dataADC si s-a compilat.

 

Revin azi sau maine cu rezultate, dupa ce termin de facut cablajul. Multumesc.

Editat de Vlad Mihai
Link spre comentariu

Am descoperit o mica eroare in codul postat.

Trebuie introdus urmatorul cod:

  SPI.endTransaction();//opreste SPI pentru a fi folosit de alte device-uri 

inainte de :

  result = (byte_high << 8) | byte_low;  result = (result >> 1) & 0x0FFF;
Link spre comentariu

Salut,  am testat astazi codul propus ieri aici si  nu merge, primesc valoarea zero tot timpul.

Mai jos este codul testat:

// inslude the SPI library:#include <SPI.h>// set pin 10 as the slave select for the digital pot:const int slaveSelectPin = 10;int adc_value;int byte_high = 0;int byte_low = 0;int result;byte dataADC;void setup() {  Serial.begin(9600);  // set the slaveSelectPin as an output:  pinMode (slaveSelectPin, OUTPUT);  // initialize SPI:  SPI.begin();}void loop() {  SPI.beginTransaction(SPISettings(4800000, MSBFIRST, SPI_MODE0));  digitalWrite (slaveSelectPin, LOW);  delayMicroseconds(1);  byte_high = SPI.transfer(dataADC);  byte_low = SPI.transfer(dataADC);  digitalWrite (slaveSelectPin, HIGH);     SPI.endTransaction();  result = (byte_high << 8) | byte_low;  result = (result >> 1) & 0x0FFF;  Serial.print (result);  delay(80);}

Atasez si o captura de osciloscop cu masuratorile facute pe pinii max1285.

-cu galben e  pinul CS, cu albastru e pinul SCK si cu mov e  e MISO (dataout)

 

E ceva in neregula cu semnalul MISO... e cam ciudat. o sa incerc sa inlocuiesc max-ul cu altul sa vad daca  e acelasi comportament.

 

post-216107-0-87453800-1443695434_thumb.png

Link spre comentariu

Ceva nu se potriveste, CS (galben) ar trebui sa fie 0 pe toata durata transmisiei (il setezi cu mana ta - digitalWrite (slaveSelectPin, LOW);)

Si da, data out e dubios de tot.

Cum e conectat pinul SHDN?

Link spre comentariu

Salut Liviu, ca deobicei mi-a scapat ceva, dar tot datorita tie am rezolvat. pinul CS in cod era  declarat pe pinul 10 al atmega2560 dar in realitate e pe 53.

Acum  merge bine, am facut si conversia si indica bine. Multumesc!

 

Daca  vreau sa  citesc de pe 2 max-uri ma  joc doar cu pinii CS?

Editat de Vlad Mihai
Link spre comentariu

Revin cu o propunere pentru a citi date de la 2 max-uri. Va rog sa imi spuneti daca e corect si daca se  poate face sa fie mai eficient/rapid. Multumesc!

Il testez peste cateva ore.

// inslude the SPI library:#include <SPI.h>const int ss1 = 53;    // adc1 slave selectconst int ss2 = 54;    //adc2  slave selectfloat adc_value1;int byte_high1 = 0;int byte_low1 = 0;int result1;byte dataADC1;float adc_value2;int byte_high2 = 0;int byte_low2 = 0;int result2;byte dataADC2;void setup() {  Serial.begin(9600);     pinMode (ss1, OUTPUT);   pinMode (ss2, OUTPUT);  // initialize SPI:  SPI.begin();}void loop() {   //read from adcs  read_data_adc1();  delayMicroseconds(5);  read_data_adc2();    //converstion to volts  adc_value1=(result2*2.5)/4095;  adc_value2=(result2*2.5)/4095;    //print values to serial  Serial.print (adc_value1,5);  Serial.print("n");  Serial.print (adc_value2,5);  Serial.print("n");  delay(80);}void  read_data_adc1(){    SPI.beginTransaction(SPISettings(4800000, MSBFIRST, SPI_MODE0));  digitalWrite (ss1, LOW);  delayMicroseconds(1);  byte_high1 = SPI.transfer(dataADC1);  byte_low1 = SPI.transfer(dataADC1);  digitalWrite (ss1, HIGH);    SPI.endTransaction();//opreste SPI pentru a fi folosit de alte device-uri    result1 = (byte_high1 << 8) | byte_low1;  result1 = (result1 >> 1) & 0x0FFF;    }  void  read_data_adc2(){    SPI.beginTransaction(SPISettings(4800000, MSBFIRST, SPI_MODE0));  digitalWrite (ss2, LOW);  delayMicroseconds(1);  byte_high2 = SPI.transfer(dataADC2);  byte_low2 = SPI.transfer(dataADC2);  digitalWrite (ss2, HIGH);    SPI.endTransaction();//opreste SPI pentru a fi folosit de alte device-uri    result2 = (byte_high2 << 8) | byte_low2;  result2 = (result2 >> 1) & 0x0FFF;    }
Link spre comentariu

Mai rapid nu neaparat (desi am folosit transferSpi16 si am economisit niste operatii), da' daca tot scrii functii:

// include the SPI library:#include <SPI.h>const int ss1 = 53; // adc1 slave selectconst int ss2 = 54; //adc2 slave selectfloat adc_value1;int result1;float adc_value2;int result2;uint16_t read_data_adc(const int chipSelect);void setup() {   Serial.begin(9600);   pinMode (ss1, OUTPUT);   pinMode (ss2, OUTPUT);   // initialize SPI:   SPI.begin();}void loop() {   //read from adcs   result1 = read_data_adc(ss1);   delayMicroseconds(5);   result2 = read_data_adc(ss2);   //converstion to volts   adc_value1=(result1*2.5)/4095;   adc_value2=(result2*2.5)/4095;   //print values to serial   Serial.print (adc_value1,5);   Serial.print("n");   Serial.print (adc_value2,5);   Serial.print("n");   delay(80);}uint16_t read_data_adc(const int chipSelect){   uint16_t result;   uint16_t adcData;   SPI.beginTransaction(SPISettings(4800000, MSBFIRST, SPI_MODE0));   digitalWrite (chipSelect, LOW);   delayMicroseconds(1);   result = SPI.transfer16(adcData);   digitalWrite (chipSelect, HIGH);   SPI.endTransaction();//opreste SPI pentru a fi folosit de alte device-uri   result = (result >> 1) & 0x0FFF;   return result;}
Cu varinata asta, daca mai adaugi adc-uri doar apelezi functia cu noul chip select. Editat de Liviu M
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări