Sari la conținut
ELFORUM - Forumul electronistilor

Implementare software pentru PLL ( SPLL ) cu dsPIC


mircang9

Postări Recomandate

Am incercat in fel si chip. Am ajuns la 2048 esantioane.Problema este urmatoarea. Fiindca mi-a expirat perioadade evaluare la MPLAB C30 din aceasta cauza debugger-ulnu mai face treaba cum trebuie ( cum o facea cu o lunain urma ) si deci nu pot sa scot esantioanele. Nu prea merge sa-l pacalesc cu schimbarea datei. Imi spuneca ruleaza pe o platforma release si ca este "out of date"iar despre target data memory spune ca este "out of data"si la adcBuffer in loc sa arate frumos toate esantioaneleimi arata doar adresa de unde incepe alocarea in RAMa vectorului adcBuffer de 2048 esantioane si anume adresa de inceput la .xdata ( 0x0800 ) din RAM.Ce este bine totusi este ca pot sa programez desepelulsi sa bilduiesc proiectul.

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

Top autori în acest subiect

  • mircang9

    23

  • cirip

    8

  • Traxxx

    1

Top autori în acest subiect

Imagini postate

Cum adica sa scurtcircuitez ? sa fac scurt intre canalul Left Right si masa ? Nu se strica ?
Scurt la masa, nu intre canale. Asta ca sa te asiguri ca tensiunea alternativa de intrare este zero si se vede numai zgomotul de conversie. Nu se intampla nimic daca pui o intrare la masa.

 

Nu stiu ce are Debugeru asta. Cand renunt la DMA si pun 3000

de esantioane mi le face toate zero si doar primul esantion din buffer

are valoare.

Trebuie sa declansezi o noua conversie prin setarea bitului SAMP. Rezultatul conversiei il iei din registrul ADCului si il muti in buffer la adresa indicata de un pointer pe care il incrementezi dupa fiecare conversie. Faci totul in soft, nu te bazezi pe DMA. Cand a ajuns la sfarsitul buferului, il opresti cu on breakpoint, astepti sa se updateze fereastra watch si extragi esantioanele. Configureaza ADCul sa dea rezultatul unsigned fractional; FORM=3.

 

Daca pun mai mult de 3000 imi da eroare la compilator

ca nu poate aloca memoria.

Nu aloca explicit in X sau in Y. Fa alocarea ca mai jos si ai grija sa-i spui sa foloseasca pointer far.

 

#define BLOCK_LENGTH 7500

fractional input_buffer [bLOCK_LENGTH] __attribute__ ((far));

 

Fiindca mi-a expirat perioada

de evaluare la MPLAB C30 din aceasta cauza debugger-ul

nu mai face treaba cum trebuie ( cum o facea cu o luna

in urma ) si deci nu pot sa scot esantioanele.

Nu este adevarat. Expirarea nu face decat sa nu mai mearga optimizarea. Atat. Nu mai umbla la data computerului. C30-ul meu e expirat de 3 ani si imi fac treaba cu el.

 

Nu prea merge sa-l pacalesc cu schimbarea datei. Imi spune

ca ruleaza pe o platforma release si ca este "out of date"

Out of date inseamna ca nu l-ai compilat dupa ce ai facut schimbari in program. N-are legatura cu expirarea. Da-i un build All si n-o sa se mai planga de out of date. De asemenea, compileaza debug, nu release, ca sa includa informatia de debug.
Link spre comentariu

Am citit in fuga ce ai spus sus. O sa fac intocmai. Mai sus am vrut sa spun ca programul functioneaza bine ( adica scoate cele 2048 ) esantioane si reda muzica DAR la debug nu-mi afisa esantioanele si chiar dupa ce-i dadeam Build Allma intreba inainte de debug sau scriere program in memoriadsPICului daca il builduiesc din nou. Am gasit in alt document mai exact cat trebuie sa fie acea intarziere k, tot un proiect facut cu DSP de la Texas Instruments.k trebuie sa fie multiplul ( numar intreg ) frecventei de esantionare darmai mic decat numarul de perioade de esantionare cuprinse in lungimea unui bit. De exemplu daca bitul cuprinde 8 esantioane atunci k trebuie alesastfel: Te = perioada de esantionare.Tbit = 8 x Te. k * Te < 8 * Te => k < ( 8 * Te ) / Te.Problema la metoda asta este ca nu permite sa fiesetata in soft o frecventa centrala ca in cazul PLLcu acel DCO care lipseste la aceasta metoda.Iar Fs = 1/Te > 2 * F2 ( frecventa pentru 1 logic )conform criteriului Niquist. Cred ca, k trebuie alescam la jumate adica k = 4 * Te = Tbit / 2 = ( 8 * Te ) / 2.O sa revin cat mai curand.

Link spre comentariu

Iar Fcut la FTJ este frecventa de transmisie a datelor sau viteza.De exemplu daca este 1200 bauzi sau biti/secunda atunciFcut = 1200 Hz. Daca este 50 bauzi atunci Fcut = 50 Hz.Iesirea din FTJ este un vector de marime N care este transmisserial printr-un pin output compare PWM. Extern esteun comparator de tensiune cu amplificator operational adica mai exact un circuit cross-over adica de trecereprin zero. La iesirea din comparator este semnalul digital ( datele ) reconstituit din semnalul modulat FSKaplicat la o intrare ADC din demodulatorul digital cuDSP adica dsPIC.Intrebare catre Cirip: daca nu aplic nimic la intrare adica canalele Left Right le las "in aer"nu e cam acelasi lucru ? pentru a detecta zgomotul de conversie ( cuantizare ) ?

Link spre comentariu

Intrebare catre Cirip: daca nu aplic nimic la intrare adica canalele Left Right le las "in aer"nu e cam acelasi lucru ? pentru a detecta zgomotul de conversie ( cuantizare ) ?

Corect, este "cam" acelasi lucru, dar ca sa fii sigur ca nu prinzi nimic din aer, este mai potrivit sa scurtcircuitezi intrarea masurata la masa.Oricum, sa stii ca am afisat esantioanele postate de tine in "Esantioane.TXT" si zgomotul, spre surprinderea mea, este mult mai mare decat la mine. O sa postez o poza comparativa. Nu imi dau seama daca e o problema de masura sau altceva, dar asta e rezultatul.Daca repeti extragerea de esantioane, te rog sa extragi in cele 4 moduri de conversie: signed/unsigned, integer/fractional, atat in modul 10 biti cat si 12 biti. E ceva munca, dar in felul asta o sa avem o imagine completa. Denumeste fisierele ceva de genul unsig_int_12b.txt samd. Si incearca sa folosesti tot RAMul, ca sa avem multe esantioane. RAMul e de 16KB, deci daca buferul e de intregi, ar trebui sa poti aloca 8KWords. In realitate vreo 7900, ca sa mai lasi RAM ptr diverse variabile.Ce referinta folosesti la ADC? Ce valoare? Tensiunea de alimentare (3.3V) sau ai referinta separata. Te intreb ca sa calculez zgomotul in Vrms. Multumesc pentru colaborare,Cirip
Link spre comentariu

Am postat tot programul cu pricina. "The project is out of date.Would you like to built it now ?" si "Target memory is not upto date. Do you want to continue ?" apar mereu chiar daca i-am dat Build All pe Debug ( nu cu Release ). Optiunea Rebuild All nu exista. Vorbesc de meniul Debugger ( Numeniul Programmer ). I-am dat si Programin meniul Debugger si aceleasi probleme.Bitul ASAM este setat la 1, asa ca bitul SAMP se seteaza automat prin hardware.Nu stiu ce sa-i mai fac. N-am pus FORM = 3. O sa-l pun sipe acela.Nu stiu care este cauza. Inainte cu o luna nu aveamprobleme cu Debuggerrul si-mi afisa esantioanele.Poate vezi tu, Cirip unde e hiba. Pana imi raspunzi fac ce mi-ai zis ( toate variantele ).Timer 3 il folosesc pe post de trigger pentru conversii la ADC si setarea perioadei de esantionare. Iar variabilathisADCChannel->inverse_index_buffer o folosescpentru a "iesi" din conversiile celor 7500 esantioane cand aceasta variabila ajunge la zero in timp ce variabila thisADCChannel->index_buffer se incrementeazapentru plasarea in adcBuffer a celor 7500 esantioane.Lucrez cu "MPLAB IDE Starter Kit 1 for dsPIC".Programul se compileaza cu succes fara erori sauavertismente.

Link spre comentariu

Salut,Am compilat si simulat programul si nu are nicio problema de compile time. Fa secventa asa cum ti-am spus pe mp si nu ar trebui sa mai ai mesaje de eroare. Am simulat ptr ca pe placa mea e alt procesor si oricum, sunt probleme de logica; nu scriu un procesor cu un program care nu merge in simulare, ca sa nu uzez FLASHul.1) Timerul merge la 8KHz, nu la 20KHz. Sa zicem ca asta nu e un capat de tara pentru masurarea zgomotului.2) Intri in ADCChannelRead la fiecare aproximatov 0.5us si acolo nu faci decat sa setezi valoarea lui inverse_index_buffer. Nu inteleg de ce.3) Cel mai important este ca in rutina de intrerupere a lui T3, index_buffer este out of scope, deci nu ai cum sa-l incrementezi. De aia nu se umple bufferul.Aici esti "In Scope", dar nu operezi cu pointerul la buffer.post-879-139829366757_thumb.pngAici, unde vrei sa incrementezi pointerul, esti "Out of Scope"post-879-139829366762_thumb.pngOricum, mi se pare foarte complicat scris si nu am rabdare sa re-scriu de la inceput, dar cam asta e ce am vazut la o prima evaluare. :)As mai avea sugestia de a folosi intens simulatorul. Cu el poti vedea exact ce face si pe unde merge procesorul. Uite si cum arata zgomotul din fisierul postat de tine, fata de capturile mele pe 10 si pe 12 biti. Cred ca ceva e in neregula la tine. Nu se poate sa ai zgomot asa de mare.post-879-139829366766_thumb.pngSper sa o scoti la capat pana la urma. Eu sap in continuare la zgomotul de pe placuta mea.

Link spre comentariu

Am modificat un program demo ( am scos si am bagat ) - rutinele sunt la fel.N-am bagat nici o rutina in plus. De scos am scos.Programul demo original are si el acest zgomot - melodia inregistrata redata este de proasta calitate( se percepe zgomotul ). Am bagat adaptari in locul liniilor de lucru cu DMA.Vreau sa spun ca si cu DMA se percepe acel zgomot.Ai dreptate, Cirip, eu builduiam si programam in meniul Programmerapoi ma mutam in meniul Debugger si-mi cerea sa programez din nou. Cu succesiunea aratata de tine nu-mi mai da acelemesaje si ruleaza bine Debuggerul. Multumesc * :aplauze Acum urmeaza sa vad ce modific ca sa incrementeze acel index.Ciudat ca la rulare normala ( nu in Debugger ) adaugandpartea de PWM imi scoate melodia asta insemnand ca se incrementeaza acel index la esantioane mai putine dar se incrementeaza ca daca nu s-ar fi incrementat nu-mi reda melodia, nu ? chiar daca este cu zgomot. Cu toate astea evident ca debugger-ul spune totul daca e bine sau nusi simularea. Cu ce program fac simularea ??? N-am lucrat pana acum cu asa ceva.Mai desepesc.Ce esantioane ai bagat in poza de arata acel zgomot mare ? Daca ai bagatesantioanele din fisierul txt e clar - sunt din melodie nu cu intrarea in aer. :freaza:

Link spre comentariu
Ai dreptate, Cirip, eu builduiam si programam in meniul Programmer

apoi ma mutam in meniul Debugger si-mi cerea sa programez

din nou. Cu succesiunea aratata de tine nu-mi mai da acele

mesaje si ruleaza bine Debuggerul. Multumesc * :aplauze

Pai da! Programarea ptr debug trebuie musai facuta din meniul debugger pentru ca in felul asta mai baga el un paduche, care asigura comunicarea cu PCul in timpul rularii

 

Cu ce program fac simularea ??? N-am lucrat pana acum cu asa ceva.
Tot cu MPLAB IDE. La debugger selectezi "MPLAB SIM". Atentie sa setezi frecventa corecta in debugger->options.

 

Ce esantioane ai bagat in poza de arata acel zgomot mare ? Daca ai bagat

esantioanele din fisierul txt e clar - sunt din melodie nu cu intrarea in aer.

Pai una vorbim, basca ne intelegem? Nu am zis sa incarci RAMul cu esantioane cand intrarea e in scurt? Merge si in gol, dar o sa ai zgomot mai mare. Ma si miram de unde atata balamuc acolo.
Link spre comentariu

Balamucul a aparut de la faptul ca in Debug bufferul era gol indexul ramanea lazero si inca ramane ( pana il desepesc "calumea" - cred ca azi ii dau de cap ) si cu intrarea in aer. Credeam ca nebagand nimic la intrare de aceea era bufferul gol si am zis "sa-i cant la melodie""in struna" :rade: SCUZE Cirip, dar cand o sa rezolv cu programul o sa-ti trimit "ca lumea" cu 7900 esantioane si nu alte bazagonii si la Fs = 20 KHz si cu o intrare la masa cum ai cerut. :rade:

Link spre comentariu

Nu stiu ce are. Ii setez AD1CON3bits.ADCS = 63 deci Tad = 1.6 us si

in simulator ma avertizeaza ca Tad = 25 ns < Tad = 75 ns ( care e minim ).

Ii setez 80 MHz frecventa dsPIC33FJ256GP506. Orice valoare pun la

AD1CON3bits.ADCS acelasi avertizment imi da. Intr-adevar dsPICu ruleaza

la 80 MHz. M-am uitat bine in datasheet si in program.

Indexul se incrementeaza. Cand timer3 ajunge la time-out ( 8 KHz

"rata de esantionare ?!" ) se termina Tsample si se declanseaza conversia.

ASAM fiind 1, la sfarsitul conversiei SAMP se face automat 1 si porneste

Tsamp care este terminat fortat de time-out la timer3 si asa mai departe.

Atasez aici sursa.

 

In sursa actuala AD1CON3bits.ADCS = 0 adica

Tad = 1*Tcy. In sursa originala era AD1CON3bits.ADCS = 63.

dar chiar si asa apare acest avertisment.

Nu stiu ce sa-i fac.

 

Valoarea setata in PR3 de la Timer3 defineste

rata de esantionare ? Mi se pare cam ilogic daca ar

fi asa deoarece PR3 este Tsamp si nu

Tsamp+Tconversie=Ttotal. Rata de esantionare

ar trebui sa fie Ttotal adica Ftotal = 1/Ttotal=

1/(Tsamp ( = time-out la timer 3 ) + 12 * Tad )

pentru rezolutia de 10 biti. Iar la

rezolutia de 12 biti adica AD1CON1bits.AD12B = 1

Tconversie = 14 * Tad.

 

Cum editez un fisier de stimuli pentru simulator

care sa cuprinda niste valori analogice ca sa le dau

ca intrari in convertorul ADC virtual din simulatorul

din MPLAB ?

 

Saptamana asta n-am prea avut timp sa ma ocup

de ce mi-ai cerut Cirip dar sper ca in weekend-ul asta sa-mi pot face timp.

 

Sursa pe care am atasat-o este varianta modificata de mine dupa exemplul postat "CE121_ADC_Chscan_noDMA_14aug09"

de la http://www.microchip.com/CodeExamplesByFunc.aspx

pentru ADC la dsPIC33Fxxxxx.

 

Acolo sunt monitorizate 4 canale deodata fara utilizarea DMA.

 

:cry:

Link spre comentariu
Nu stiu ce are. Ii setez AD1CON3bits.ADCS = 63 deci Tad = 1.6 us si

in simulator ma avertizeaza ca Tad = 25 ns < Tad = 75 ns ( care e minim ).

Ruleaza pas cu pas si vezi exact la ce instructiune apare warningul. Am avut si eu problema asta si mi se pare ca am rezolvat-o pornind modulul ADC dupa ce am setat valorile registrelor.

 

Valoarea setata in PR3 de la Timer3 defineste

rata de esantionare ? Mi se pare cam ilogic daca ar

fi asa deoarece PR3 este Tsamp si nu

Tsamp+Tconversie=Ttotal.

Nu e ilogic deloc. Timerul ala nu freaca duda in timp ce are loc conversia. Timerul avanseaza si el, deci intreruperea o ai strict la expirarea timerului. Nu se mai adauga timpul de conversie ca sa il afli pe cel total, ptr ca ADCul si timerul merg in paralel.

 

Cum editez un fisier de stimuli pentru simulator

care sa cuprinda niste valori analogice ca sa le dau

ca intrari in convertorul ADC virtual din simulatorul

din MPLAB ?

Scrii valorile hex sau zecimale intr-un fisier text, la care pointezi stimulul ptr. register injection.

 

Saptamana asta n-am prea avut timp sa ma ocup

de ce mi-ai cerut Cirip dar sper ca in weekend-ul asta sa-mi pot face timp.

Nicio problema. Nu te mai scuza. E hobi. Faci cand ai timp si dispozitie.
Link spre comentariu

Problema era si la ordinea setarii registrilor la ADC. Mai exact trebuie setat mai intai Tad din bitii ADCSsi apoi ADRC ( clockul pentru ADC - de la RC sau Fcy ).Acum este bine. Iata si ce mi-ai cerut: Fsample = 20KHz, o intrare la masa si 7900 esantioanepreluate odata. La rezolutia de 10 biti am pus doar pentru tipul fractional. Daca vrei neaparat ti le postezsi pe celelalte pentru 10 bit. In numele fisierului am scris sugestiv ce contine. Difera intre ele ca zgomotla o prima privire. O sa le pun in Excel sa le fac un grafic scatter ( plot ) ca sa vad care are mai putin zgomot dintre integer, signed integer, fractional, signed fractional ( setate din bitii FORM ).O prelucrare mai buna a semnalelor se face cu tipul care are cel mai mic zgomot la esantionare.E chiar tare chestia asta !!!! N-am stiut.Cred ca SignedFractional si SignedInteger ( cele cu semn ) au cel mai mic zgomot; deci asigura o prelucrare mai buna a semnalelor. Au valori si cu 0x0000 pe cand cele fara semn nu au valori de 0x0000. Cand am dat FORM pentru integer n-am schimbatint ain0Buff[7900] __atribute((far));ci a ramas lafractional ain0Buff[7900] __atribute((far)).Am uitat. Sper sa nu schimbe datele.O sa fac si asta.Referinta este Vdd si Vss. :da :dans:

Link spre comentariu

Bun! Multumesc pentru osteneala.

 

Se pare ca suntem amandoi p-acolo.

Intai putina teorie.

Valoarea tipica a zgomotului de cuantizare este de +/-1 LSB. In cazul nostru, 1 LSB=Vref/(2^N)=3.3V/(2^12)=0.8mV, deci zgomotul varf la varf ar fi cam dublu, adica 1.6mV. Zgomot mai mic decat asta nu scoti indiferent ce ai face.

 

Nu m-am mai manjit cu 10 biti, ca e clar ca zgomotul e mai mare, asa ca le lasam deoparte. Asa am facut si cu experimentele mele. Nu ma mai intereseaza 10 biti.

 

Prelucrarea datelor

Asa arata tot blocul de esantioane signed fractional:

post-879-139829369614_thumb.png

 

Asa arata un zoom-in la o zona unde regimul tranzitoriu s-a stabilizat:

post-879-139829369618_thumb.png

 

Iar tensiunea varf la varf rezultata din analiza datelor este de 1.568mV, ceea ce e cam in acord cu cei 1.6mV calculati teoretic. Rezultatele mele sunt asemanatoare, asa ca as zice ca suntem pe calea cea buna.

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