Jump to content
ionutz992

Ltc 2418 si arduinoMega

Recommended Posts

 

Buna ziua,

Am achizitionat de curand un convertor analog numeric si anume LTC2418 si o referinta de tensiune LT1236.

As dori sa il folosesc impreuna cu o placa de dezvoltare arduino mega cu care m-am mai jucat pana acum dar am facut doar aplicatii simple.

Am ales acest ADC deoarece are rezolutie mare (24 biti) si am gasit ceva documentatie pentru el plus ceva cod pentru arduino dar care 

nu functioneaza si pe care nu il inteleg.

Acum sa o luam cu inceputul (cu cateva specificatii):

-Tensiune de alimentare (2.7v-5.5v) eu il alimentez la 5v

-Are un oscilator intern dar se poate folosi si unul extern (eu aleg sa folosesc clock-ul furnizat de acesta)

Note 7: FO = 0V (internal oscillator) or fEOSC = 153600Hz ?2% (external oscillator).
Note 8: FO = VCC (internal oscillator) or fEOSC = 128000Hz ?2% (external oscillator).

-Poate matura in intervalul (-vref/2 - +vref/2) in cazul meu -2.5v si 2.5v deoare ce am ales o referinta de 5v

Mai jos am atasat diagrama de timming :

289y1yv.png

 

Tot ce am facut pana acum sunt urmatoarele .

Am alimentat circuitul si am atasat referinta de tensiune, am pus in 0 pinul FO si am observat ca daca trec simultan si pinul cs in low am o secventa de clock pe pinul SCK de 32 de biti conform diagramei de mai sus. 

Eu trebuie sa ma sincronizez cu acest clock generat de adc si trebuie sa ii dau urmatoarele secvente de biti :

  a26xcg.png

Pn mine nu ma intereseaza deocamdata sa citesc tensiuni flotante. Ma intereseaza sa citesc tensiuni fata de pinul com asa ca mai jos am pus secventele de biti pt toate cele 16 canale in parte (valorile sunt duplicate deoare ce trebuie sa dureze o perioada de clock e o prostie de a mea) :

 

int    ch0[]={1,1, 0,0, 1,1, 1,1, 0,0, 0,0, 0,0, 0,0,     };
int    ch1[]={1,1, 0,0, 1,1, 1,1, 1,1, 0,0, 0,0, 0,0,     };
int    ch2[]={1,1, 0,0, 1,1, 1,1, 0,0, 0,0, 0,0, 1,1,     };
int    ch3[]={1,1, 0,0, 1,1, 1,1, 1,1, 0,0, 0,0, 1,1,     };
int    ch4[]={1,1, 0,0, 1,1, 1,1, 0,0, 0,0, 1,1, 0,0,     };
int    ch5[]={1,1, 0,0, 1,1, 1,1, 1,1, 0,0, 1,1, 0,0,     };
int    ch6[]={1,1, 0,0, 1,1, 1,1, 0,0, 0,0, 1,1, 1,1,     };
int    ch7[]={1,1, 0,0, 1,1, 1,1, 1,1, 0,0, 1,1, 1,1,     };
int    ch8[]={1,1, 0,0, 1,1, 1,1, 0,0, 1,1, 0,0, 0,0,     };
int    ch9[]={1,1, 0,0, 1,1, 1,1, 1,1, 1,1, 0,0, 0,0,     };
int   ch10[]={1,1, 0,0, 1,1, 1,1, 0,0, 1,1, 0,0, 1,1,    };
int   ch11[]={1,1, 0,0, 1,1, 1,1, 1,1, 1,1, 0,0, 1,1,    };
int   ch12[]={1,1, 0,0, 1,1, 1,1, 0,0, 1,1, 1,1, 0,0,    };
int   ch13[]={1,1, 0,0, 1,1, 1,1, 1,1, 1,1, 1,1, 0,0,    };
int   ch14[]={1,1, 0,0, 1,1, 1,1, 0,0, 1,1, 1,1, 1,1,    };
int   ch15[]={1,1, 0,0, 1,1, 1,1, 1,1, 1,1, 1,1, 1,1,    };
 
Acum trebuie sa sransmit prin SPI si sa citesc totodata sincronizat cu clockul ei. Nu am folosit pana acum aceasta comunicatie si am nevoie de ajutor.
Bine inteles ca am citit pe internet tot felul de exemple dar in cazul meu ADC este master si arduino ar trebui sa fie Slave.

Am atasat mai jos linkul cu librariile gasite dar pe care nu stiu sa le folosesc.

https://github.com/JQIamo/LTC2418-arduino

 

 

 

Edited by ionutz992

Share this post


Link to post
Share on other sites

Ionut,

 

LTC2414 poate functiona ca master pe busul SPI sau ca slave. Dupa cele descrise de tine mai sus il folosesti in modul master (adica LTC2414 genereaza SCK si ATmega328 il receptioneaza) - in cazul asta ATmega328 trebuie programat ca slave la portul SPI.

In modul SPI master al LTC2414 ai doua cazuri cand tu initiezi conversia sau te bazezi pe LTC2414 sa faca conversii continue iar ATmega328 va receptiona conversia si va genera o intrerupere cand un nou octet a fost receptionat. (evident necesita programarea sistemului de intreruperi al SPI daca folosesti modul slave ald ATmega328)

La pagina 19 in datasheet este un tabel care descrie modurile http://cds.linear.com/docs/en/datasheet/241418fb.pdf

 

Eu iti recomand sa folosesti LTC2414 in modul slave si sa controlezi tu busul de SPI din ATmega328 (pentru ca e mai simplu) - pentru a forta LTC2414 in modul slave trebuie sa tii SCK low cand CS face tranzitia din HIGH in LOW (asta e si modul default la Arduino) - starea pinului F0 conteaza numai la filtrele digitale de rejectie a modului comun pentru 60 respectiv 50Hz - in cazul tau tine-l la Vcc (pentru 50Hz)

 

In modul slave trebuie sa te asiguri ca s-a terminat conversia inainte sa citesti rezultatul si asta o faci coborand CS in LOW si cititind starea lui SDO (daca SDO e low atunci conversia e terminata si poti citi rezultatul)

 

 

Legat de tipul de intrari ca sa citesti tensiuni pozitive fata de com - conecteraza Ref- (referinta negativa) la GND. si intrarile analogice negative la fel. (din pacate irosesti bitul de semn si obtii rezolutie de 23 de biti (probabil suficienta)

 

PS - acum am realizat ca ai ArduinoMega - dar la nivel de port SPI cele doua sunt la fel - deci tot ce ma scris mai sus e valabil si pentru Mega.

Spor la treaba,

RR

Edited by roadrunner

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

We use cookies and related technologies to improve your experience on this website to give you personalized content and ads, and to analyze the traffic and audience of your website. Before continuing to browse www.tehnium-azi.ro, please agree to: Terms of Use.