mars01 Postat Septembrie 30, 2015 Partajează Postat Septembrie 30, 2015 (editat) @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 Septembrie 30, 2015 de mars01 Link spre comentariu
Liviu M Postat Septembrie 30, 2015 Partajează Postat Septembrie 30, 2015 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
nico_2010 Postat Septembrie 30, 2015 Partajează Postat Septembrie 30, 2015 Cred ca poate sa inlocuiasca parametrul int dataADC cu byte dataADC. Nu eram sigur ca Aruino accepta byte Link spre comentariu
Vlad Mihai Postat Septembrie 30, 2015 Autor Partajează Postat Septembrie 30, 2015 (editat) @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 Septembrie 30, 2015 de Vlad Mihai Link spre comentariu
Liviu M Postat Septembrie 30, 2015 Partajează Postat Septembrie 30, 2015 As putea testa daca genereaza macar un warning. Da, nu genereaza... am inlocuit int cu byte dataADC si s-a compilat. Bineinteles ca s-a compilat... Link spre comentariu
nico_2010 Postat Septembrie 30, 2015 Partajează Postat Septembrie 30, 2015 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
Vlad Mihai Postat Octombrie 1, 2015 Autor Partajează Postat Octombrie 1, 2015 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. Link spre comentariu
Liviu M Postat Octombrie 1, 2015 Partajează Postat Octombrie 1, 2015 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
nico_2010 Postat Octombrie 1, 2015 Partajează Postat Octombrie 1, 2015 Incearca sa micsorezi frecventa de ceas a busului SPI (incepi de la 400kHz). Link spre comentariu
Vlad Mihai Postat Octombrie 1, 2015 Autor Partajează Postat Octombrie 1, 2015 (editat) 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 Octombrie 1, 2015 de Vlad Mihai Link spre comentariu
Liviu M Postat Octombrie 1, 2015 Partajează Postat Octombrie 1, 2015 Da, joaca cu CS ar trebui sa fie suficienta. Link spre comentariu
Vlad Mihai Postat Octombrie 1, 2015 Autor Partajează Postat Octombrie 1, 2015 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
Liviu M Postat Octombrie 1, 2015 Partajează Postat Octombrie 1, 2015 (editat) 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 Octombrie 1, 2015 de Liviu M Link spre comentariu
Vlad Mihai Postat Octombrie 1, 2015 Autor Partajează Postat Octombrie 1, 2015 Multumesc Liviu, maine sau sambata o sa fac un cablaj cu 4 max-uri si revin cu rezultate. Link spre comentariu
Vlad Mihai Postat Octombrie 2, 2015 Autor Partajează Postat Octombrie 2, 2015 Liviu, tocmai ce am testat pe 2 max-uri. se misca minunat (interfatat direct cu Labview). Inca o data multumesc! Sper sa ma revansez candva. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum