Sari la conținut
ELFORUM - Forumul electronistilor

MAX531 cu Arduino


Vlad Mihai

Postări Recomandate

Am   modificat pinii, dar    ce nu inteleg e ca atunci cand ii dau  sa imi faca 0v imi  tine 95mV si cand ii dau sa imi faca maxim adica  2.048 imi    tine  1.95V ce masa sa aiba? hardware  e ok.

Link spre comentariu
  • Răspunsuri 35
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Vlad Mihai

    18

  • Liviu M

    14

  • Mircea

    3

  • nico_2010

    1

Top autori în acest subiect

Imagini postate

Acum am 1.92 la iesire.  Atat trebuia sa am?

Pai depinde de configuratie si de ce date ai trimis la DAC. Cu configuratia din postul 4 si cu data = 0xFFF, ar trebui sa ai valoarea maxima - VREFIN * 4095 / 4096.

Din foaia de catalog si tinand cont ca VREFIN si VREFOUT sunt conectate impreuna, ai un VREFIN minim de 2.017V. Dupa socotala de mai sus, VOUT = 2.017V.

Link spre comentariu

Da, VREFIN  e 2.048V. dar mai caut sa vad cum sa rezolv. Ai o idee cum pot face o incrementare a valoarii pornind de la zero utilizand un push buton? nu imi iese cum am incercat eu...

Link spre comentariu

Eu idei am multe :rade:, da' mai bine posteaza ce ai facut tu si incercam sa "reparam".

clrPin a ramas ca in ultimul cod, adica HIGH, da?

Iesirea e in aer, sau ai vreo sarcina?

Link spre comentariu

Iesire Dac-ului e   legata la intrarea la un comparator, deci nu e in aer.

Asta e codul pe care l-am testat ultima data:

// inslude the SPI library:#include <SPI.h>const int slaveSelectPin = 8;  // set pin 10 as the slave selectconst int clrPin=9;          //set pin 9   for  clear DAC >> optionalint max_value=4095;             // max  value   for DACint min_value=0;                //min value dor DACint value;int AByte = 0;int data = 0b111111111111; //  desired DAC output -2.048Vvoid setup() {  Serial.begin(9600);// set the slaveSelectPin as an output:  pinMode (slaveSelectPin, OUTPUT);   digitalWrite (slaveSelectPin, HIGH);    pinMode (clrPin,OUTPUT);  digitalWrite (clrPin, HIGH);      // clear DAC  // initialize SPI:  SPI.begin();   SPI.setBitOrder(MSBFIRST);}void loop() {  AByte = Serial.read();  if ((AByte == 'W' )&& data<max_value ) {     //incrementare DAC    data++;}       uint8_t dataLow = data&0xFF;  uint8_t dataHigh = (data >> 8) & 0x0F;  setDac(dataHigh, dataLow);   delay(8000);}// Function to send 2 bytes to the dacvoid setDac(uint8_t highData, uint8_t lowData) {  digitalWrite(slaveSelectPin,LOW); // take the Chip Select pin low to select the DAC:  SPI.transfer(highData); //  send in the Primary Byte:  SPI.transfer(lowData);// send in the Secondary Byte  digitalWrite(slaveSelectPin,HIGH);// take the Chip Select pin high to de-select the DAC:}
Link spre comentariu

Ce se intampla daca incerci sa trimiti de doua ori 0xFF ?Adica in loc de

    uint8_t dataLow = data&0xFF;  uint8_t dataHigh = (data >> 8) & 0x0F;
sa faci
    uint8_t dataLow =0xFF;  uint8_t dataHigh = 0xFF;
Daca e cumva vreo problema cu ordinea bitilor, trimitand 16 de 1 ar trebui sa obtii "cap de scala".Inca o idee inainte sa plec acasa. Cu iesirea in gol l-ai masurat?
Link spre comentariu

Sa recapitulam:

- cand scrii 0 ai ~95 mV

- cand scrii 0xFFF ai 1.92V

Concluzia - comunicatia pare sa functioneze.

Mai ramane de vazut de ce nu merge pana la capete de scala.

Pana la urma ai reusit sa masori fara sarcina?

Link spre comentariu

Deci am taiat traseul si cu codul de mai jos cu iesirea in aer am  1.82V:

// inslude the SPI library:#include <SPI.h>const int slaveSelectPin = 8;  // set pin 10 as the slave selectconst int clrPin=9;          //set pin 9   for  clear DAC >> optionalint max_value=4095;             // max  value   for DACint min_value=0;                //min value dor DACint value;int AByte = 0;//int data = 0b000000000000; //  desired DAC output -2.048Vvoid setup() {  Serial.begin(9600);// set the slaveSelectPin as an output:  pinMode (slaveSelectPin, OUTPUT);   digitalWrite (slaveSelectPin, HIGH);    pinMode (clrPin,OUTPUT);  digitalWrite (clrPin, HIGH);      // clear DAC  // initialize SPI:  SPI.begin();   SPI.setBitOrder(MSBFIRST);}void loop() {        uint8_t dataLow = 0x0F;  uint8_t dataHigh = 0x0F;  setDac(dataHigh, dataLow);   delay(80);}// Function to send 2 bytes to the dacvoid setDac(uint8_t highData, uint8_t lowData) {  digitalWrite(slaveSelectPin,LOW); // take the Chip Select pin low to select the DAC:  SPI.transfer(highData); //  send in the Primary Byte:  SPI.transfer(lowData);// send in the Secondary Byte  digitalWrite(slaveSelectPin,HIGH);// take the Chip Select pin high to de-select the DAC:}

iar daca inlocuiesc 

uint8_t dataLow = 0x0F;uint8_t dataHigh = 0x0F;

cu

uint8_t dataLow = 0xFF;uint8_t dataHigh = 0xFF;

am  1.91V

 

dar daca inlocuiesc  cu:

uint8_t dataLow = 0x00;  uint8_t dataHigh = 0x00;

am 0..5mV. teoretic e bine...

Editat de Vlad Mihai
Link spre comentariu

Pai baga-l intr-o bucla si vezi cand nu mai creste liniar. Intr-o prima faza poti folosi un increment mai mare, nu chiar 1.

void loop() {  AByte = Serial.read();  if ((AByte == 'W' )&& data<max_value ) {     //incrementare DAC     data+=50;     uint8_t dataLow = data&0xFF;     uint8_t dataHigh = (data >> 8) & 0x0F;     setDac(dataHigh, dataLow);     delay(100);  }}
Editat de Liviu M
Link spre comentariu

Neata, am incercat cu(virgula) codul de mai jos: dar  nu face nimic, am 0.5mV la iesire  tot timpul:

// inslude the SPI library:#include <SPI.h>const int slaveSelectPin = 8;  // set pin 10 as the slave selectconst int clrPin=9;          //set pin 9   for  clear DAC >> optionalint max_value=4095;             // max  value   for DACint min_value=0;                //min value dor DACint value;int AByte = 0;int data = 0b111111111111; //  desired DAC output -2.048Vvoid setup() {  Serial.begin(9600);// set the slaveSelectPin as an output:  pinMode (slaveSelectPin, OUTPUT);   digitalWrite (slaveSelectPin, HIGH);    pinMode (clrPin,OUTPUT);  digitalWrite (clrPin, HIGH);      // clear DAC  // initialize SPI:  SPI.begin();   SPI.setBitOrder(MSBFIRST);}void loop() {      AByte = Serial.read();  if ((AByte == 'W' )&& data<max_value ) {     //incrementare DAC     data+=50;     uint8_t dataLow = data&0xFF;     uint8_t dataHigh = (data >> 8) & 0x0F;     setDac(dataHigh, dataLow);     delay(100);  }}// Function to send 2 bytes to the dacvoid setDac(uint8_t highData, uint8_t lowData) {  digitalWrite(slaveSelectPin,LOW); // take the Chip Select pin low to select the DAC:  SPI.transfer(highData); //  send in the Primary Byte:  SPI.transfer(lowData);// send in the Secondary Byte  digitalWrite(slaveSelectPin,HIGH);// take the Chip Select pin high to de-select the DAC:}
Editat de Vlad Mihai
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