Sari la conținut
ELFORUM - Forumul electronistilor

Viteza maxima de achizitie ADC PIC18F2550,PIC18F4550


Postări Recomandate

Multumesc pentru idei, nCicle este o variabila care schimba frecventa de esantionare. Ea este setata din baza de timp

de pe PC si este transmisa PIC-ului in felul urmator:

 

while TRUE ' USB servicing is done inside the while loop

USB_Polling_Proc() ' Call this routine periodically

nCicle = 6 '6 cicluri da cam ca 10uS intirziere Fes=75KHz

'78 cicluri da Fes=7,5KHz si se poate vizualiza 100Hz

ida = HID_Read()

if (ida <> 0) then

if readbuff[0] = ("F") then

readbuff[0] = 48 ' se aduce la zero

if readbuff[1] = 1 then ' 6 cicluri echivaleaza cu 10uS =>75KHz

nCicle = 6

end if

if readbuff[1] = 2 then

nCicle = 78 ' 78 cicluri echivaleaza cu 100uS => 7,5KHz

end if

if readbuff[1] = 3 then

nCicle = 680 ' 680 cicluri echivaleaza cu 1mS

end if

if readbuff[2] = 1 then 'amplificare globala cu 10

TRISB.RB0 = 1

end if

if readbuff[2] = 0 then 'amplificare globala cu 1

TRISB.RB0 = 0

end if

if readbuff[3] = 1 then 'AC

TRISB.RB1 = 1

end if

if readbuff[3] = 0 then 'DC

TRISB.RB1 = 0

end if

if readbuff[4] = 0 then ' amplificare x1

TRISB.RB2 = 0

end if

if readbuff[4] = 1 then ' amplificare x10

TRISB.RB2 = 1

end if

end if

'***********'adread = (ADC_get_sample(0)/4) '(ADC_Read(0)/4 )****

Codul in continuare este postat anterior.

Nu am gasit o alta idee mai buna pentru schimbarea freventei de achizitie. Micsorarea acestei frecvente determina

un timp mai mare si se pot vizualiza si frecvente mai joase.

 

@gsabac

 

Cred ca ai putea sa mai reduci din instructiuni cam asa:

uint16_t arr[3]={6,78,680};

 

nCicle=arr[readbuff[1]-1];

TRISB.RB0=readbuff[2];

TRISB.RB1=readbuff[3];

TRISB.RB2=readbuff[4];

 

Link spre comentariu

Imbunatatirea structurii codului este evidenta si tradusa in mikroBasic arata in felul urmator:

 

const setTime as word[10] = (6,11,30,76,144,360,720,1440,2880,5760)

nCicle = setTime [readbuff[1]-1] ' baza este tot zero

 

La unele setari alocarea directa merge perfect, variabilele s-au inmultit si atunci codul arata asa sau mai complicat:

if readbuff[2] = 1 then 'atenuare globala cu 1
TRISB.RB0 = 1
sincroAmplif=1
end if
if readbuff[2] = 0 then 'atenuare globala cu 10
TRISB.RB0 = 0
sincroAmplif=10
end if

 

@gsabac

Editat de gsabac
Link spre comentariu
  • 2 săptămâni mai târziu...

Am incercat transformarea osciloscopului simplu cu PIC18F2550 in osciloscop cu 2 canale.

Desi am pus toate combinatiile posibile de setari, codul nu vroia sa comute intrarea ADC-ului pe intrarea RA1.

Setarile le-am facut inainte de functia de citire periodica a starilor, cu comenzile in diverse feluri :

ADCON0 = %000101 ' s-ar deschide ADC-ul pe canalul RA1 si se initializeaza

while TRUE ' USB servicing is done inside the while loop
USB_Polling_Proc() ' Call this routine periodically

..........................................................................................................................

post-238209-0-77659600-1498557268_thumb.png

Instructiunea incercuita cu rosu, se face citirea canalului (0) pentru sincronizare, dar surpriza, trecerea este

permanenta pe canalul zero si degeaba am setat initial canalul RA1, caci este sters automat.

Rezolvarea a venit prin introducerea de comenzi pentru setarea canalului in interiorul buclei si in

pozitia de dinainte a fiecarui canal.

Pentru ca semnalele vizualizate ale canalelor sa fie in faza si sa se poata citi defazajul, inceperea

inregistrarii si transmisiei spre PC am facut-o dupa o noua secventa de sincronizare pe canalul RA0.

Toate acestea datorita achizitionarii datelor cu un singur PIC care are un singur ADC pe care il comuta

pe diverse intrari

 

@gsabac

 

 

 

 

Link spre comentariu

 

Ar fi utila o extensie de memorie de vreo 32K x 8 in care sa scriu datele provenite din ADC-ul intern si apoi

trimiterea lor prin USB spre PC.

ar merge cu un chip de ram? ca alea înşirate pe modulele de memorie de la pc-uri/leptoace/etc...

iar dacă picul mai are suficientă putere, eventual unul mai mărişor, paginat la iniţializare, şi folosit ca buffer...

Link spre comentariu

ar merge cu un chip de ram? ca alea înşirate pe modulele de memorie de la pc-uri/leptoace/etc...

iar dacă picul mai are suficientă putere, eventual unul mai mărişor, paginat la iniţializare, şi folosit ca buffer...

 

Nu, nu se poate folosi RAM-ul din modulele de memorie PC pentru ca acelea sunt RAM dinamic ceea ce presupune existenta unui controller extern. Posibil sa fie unele PIC-uri care au controler DRAM dar in nici-un caz cele pe 8bit (poate PIC32).

Ce se poate folosi este o memorie tip SRAM sau FRAM.

 

Nu stiu ce sa inteleg prin paginat (in acest caz) dar compilatoarele nu pot extinde SRAM-ul standard al unui PIC cu un SRAM extern. Singura modalitate de a utiliza RAM extern este cu alocare si dealocare memorie prin functii create de dvs.

malloc() si free() nu sunt suportate de XC8 pentru uC-urile pe 8bit, puteti crea ceva analog folosindu-va de pointeri.

 

Tineti cont ca in mod curent memoriile acestea externe se conecteaza pe I2C sau SPI (I2C este foarte lent asa ca probabil este preferabil sa folositi SPI) ceea ce limiteaza viteza de lucru a acestor memorii.

Link spre comentariu

Proiectul de esantionare cu PIC18F2550 a avansat la 2 canale si o finisare frumusica. Am adaugat o sincronizare mai eficienta

si transmisia a doua streaming-uri de 1024 cuvinte de 8 biti in total cite 512 esantioane de 10 biti pe canal, la o singura achizitie.

Pe un PC proiectul de osciloscop arata ca mai jos:

Click pentru marire.

post-238209-0-22679200-1499452268_thumb.png

Am introdus suplimentar, o memorie fosfor-digitala (phosphor digital memory) prin puterea de calcul a PC-ului

si versalitatea programului Visual Basic.

Poze cu diverse frecvente la intrare.

post-238209-0-31816400-1499452282_thumb.png

Asta este ce se poate obtine cu acest PIC, se poate imbunatati forma afisata, cu functii de reconstructie sinC.

Intrucit introducerea unei memorii externe introduce intirzieri si astfel viteza de esantionare scade dramatic, idea este aplicabila

doar pentru frecvente joase de pina la 2KHz (cardiograf, citirea temperaturii, presiunii, etc).

In continuare incerc sa adaptez un ADC extern si o memorie FIFO CMOS de 128Kx8 la acest PIC, tot cu structura de comanda din PC.

Am vazut alte proiecte homemade, care merg chiar la o frecventa de esantionare de 60MHz prin utilizarea acestui procedeu.

 

@gsabac

Editat de gsabac
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