Friday, October 17, 2014

PIC32 DMA+SPI+DAC : Analog output synthesis with zero CPU overhead

I have previously shown how to use the PIC32 SPI module to use the 12-bit DAC MCP4822: http://tahmidmc.blogspot.com/2014/10/pic32-spi-using-mcp4822-12-bit-serial.html. While that does allow you to generate analog outputs as desired, it requires you to use CPU cycles to process the timer interrupt and accordingly drive the SPI module.

Since the PIC32 contains DMA channels, the process can be completely offloaded from the CPU. For an idea of the PIC32 DMA module, refer to my previously written article: http://tahmidmc.blogspot.com/2014/05/simple-pic32-dma-example.html

Fig. 1 - The generated sine wave at fpwm = 400kHz and 32 elements in the sine table

So, the simple way of offloading the SPI update to the DMA module would be to let the DMA channel transfer data to the SPI buffer. The SPI module is configured for 16-bit data transfer (since the MCP4822 write command requires 2 bytes). This means that the cell size for the DMA channel has been set to 2 (2 bytes to transfer once triggered). The DMA transfer is triggered by a timer interrupt. Unlike the previous example where I used Timer 1 and its interrupt for the SPI transfer, here I use Timer 2. The reason for this is that, if I want the entire process to be offloaded from the CPU, the SS (Slave Select) or CS (Chip Select) also has to be done entirely in hardware. For that I used the Output Compare 1 module. To use the OC1 module, either Timer 2 or Timer 3 (or the combined 32-bit timer) has to be used. So, I just went with Timer 2.

Configuring the DMA module for transferring data to the SPI buffer was the simple part. I found the configuration of the SS/CS pin the more challenging part. The idea here was to use the OC module in "dual compare mode continuous output pulses" mode. The OC module in this mode generates continuous pulses - the output pin OC1 - which I used as CS/SS - is set high one PBCLK (peripheral bus clock) after the Timer value reaches OC1R; the OC1 pin is cleared one PBCLK after the Timer value reaches OC1RS. Since SS/CS is active low, I set ( (period register) - 4) to be OC1RS and a variable CSlength to be OC1R. CSlength was chosen to be 80% of the period register. What this meant was that. One PBCLK after the Timer reached the (period register - 4), the OC1 pin went low (CS/SS went low) "selecting" the DAC. After about 0.80*(period register) from there, the OC1 pin went high. This means that the CS pin is low for 80% of the period - it goes low a small time right before the DMA transfer happens and is raised high late enough, after the DMA transfer occurs. I determined that 80% the period was enough time since that is higher than the time required to shift out 16 bits of data at 20MHz SPI clock. See Fig. 2 below for an illustration of the operation of the output compare module in the "dual compare mode continuous output pulses" mode:

 Fig. 2 - Output Compare module in Dual Compare Mode: Continuous Output Pulse mode (taken from PIC32 reference manual, figure 16-16)

Beyond that, the idea is simple. There is a sine table that is the DMA source. The key thing to remember here is that the 12-bit data must be OR-ed with 0x3000 since that is required for the DAC (to set gain=1, shutdown = 0 and channel = A):

void generateTables(void){
    uint8_t i;
    for (i = 0; i<TABLE_SIZE; i++){
        sineTable[i] = (short) (2047.0 * sin(6.2832*((float)i)/(float)TABLE_SIZE));
        sineTable[i] = sineTable[i] + 2047;

        sineTable[i] = 0x3000 | sineTable[i];
    }
}

Since the entries in the sine table are of "short" data type (each element occupies two bytes), the source size (in bytes) is twice the number of elements. The destination source size is two bytes since I'm transferring two bytes to the SPI buffer register. The cell size is two bytes since the DMA channel has to transfer two bytes (16 bits) at a time to the SPI buffer register. The DMA configuration is:

    DmaChnOpen(0, 3, DMA_OPEN_AUTO);
    // (ch, ch priority, mode)
    DmaChnSetTxfer(0, sineTable, &SPI1BUF, TABLE_SIZE*2, 2, 2);
    // (ch, start virtual addr, dest virtual addr, source size, dest size, cell size)
    DmaChnSetEventControl(0, DMA_EV_START_IRQ(_TIMER_2_IRQ));
    // (ch, trigger irq)
    DmaChnEnable(0);

A point of note is that, the DmaChnSetTxfer( ) takes in the virtual addresses of the source and destination, not the physical addresses. The virtual-to-physical address conversion is done by the function itself as opposed to it being required manually when doing register level operations (as done in my previous DMA example article).

To demonstrate that the DAC control is done with no CPU overhead, in the main( ) function, I have an infinite loop that is just toggling RA0. The output is checked on an oscilloscope:

Fig. 3 - RA0 toggle being demonstrated

Observe that the frequency of the square wave is 4.0MHz - the same that would be observed if all the PIC was doing was the pin toggling.

This also gave better performance than my previous experiment where I did not use DMA. The output sine wave has a higher frequency than observed before and this matches exactly as expected: 400kHz/32 = 12.5kHz as seen (see Fig. 1).

The rest should be very easy to understand and self-explanatory. If you have any questions or suggestions, feel free to comment!

Here are the source and header files:
config.h: https://drive.google.com/file/d/0B4SoPFPRNziHcmlxMmg2Si0zWjQ/view?usp=sharing
main.c: https://drive.google.com/file/d/0B4SoPFPRNziHcmlxMmg2Si0zWjQ/view?usp=sharing

25 comments:

  1. ভাইয়া আমি আপনার সাথে যোগাযোগ করতে চাই। আমি আপনার ফেসবুকে মেসেজ করেছি। দয়া করে রিপ্লাই দিন। zinankb@gmail.com এই ঠিকানাতেও রিপ্লাই দিতে পারেন। ধন্যবাদ

    ReplyDelete
  2. The main.c link is not active, could you please repost it?

    ReplyDelete
    Replies
    1. Should be good now. Let me know if there are any issues.

      Delete
    2. The links are not active, Thank You.

      Delete
    3. Seems to be working for me.

      Delete
    4. I confirm both links are the same "main.c"
      Where is the "config.h"?

      Delete
  3. Assalam O Alaikum Sir ! Can i please get the flow chart of that sine code? i need to get idea for my final year project code for sine wave.

    ReplyDelete
  4. Hi, Tahmid! Thank you for the great example of fast generator on my favorite MCU. Do you know if it is possible to use any interrupt on PIC32 to pause the generator at any moment, so that the output voltage would be exatly where generator was interrupted? (I want to avoid signal going down to zero, but keep the last analog voltage value after being interrupted)

    ReplyDelete
  5. Your 2 links above point to the same file "main.c", but I do not see the "config.h"

    ReplyDelete
  6. nice article.
    Your 2 links above point to the same file "main.c", but I do not see the "config.h"

    ReplyDelete
  7. Buna ziua, eu sunt Allison Howarts Dupa ce am fost în rela?ie cu Anderson ani de zile, s-a despar?it de mine, am facut tot posibilul sa-l aduc înapoi, dar totul a fost în zadar, l-am dorit atât de mult din cauza iubirii pe care o am pentru el, L-am implorat cu tot, am facut promisiuni, dar el a refuzat. I-am explicat problema mea prietenului meu ?i ea mi-a sugerat ca ar trebui sa contactez mai degraba o caseta de vraja care m-ar putea ajuta sa arunc o vraja pentru a-l readuce, dar eu sunt tipul care nu a crezut niciodata în vraja, nu am avut de ales decât sa-l încerc, eu i-a trimis caseta vraja ?i mi-a spus ca nu este nicio problema ca totul va fi bine înainte de trei zile, ca fostul meu se va întoarce la mine înainte de trei zile, a aruncat vraja ?i surprinzator în a doua zi, era în jurul orei 16.00. Fostul meu m-a sunat, am fost atât de surprins, am raspuns la apel ?i tot ce a spus a fost ca îi pare atât de rau pentru tot ce s-a întâmplat, încât a vrut sa ma întorc la el, încât ma iube?te atât de mult. Eram atât de fericit ?i m-am dus la el încât a?a am început sa traim din nou ferici?i împreuna. De atunci, mi-am facut promisiune ca oricine ?tiu ca are o problema de rela?ie, a? fi de ajutor unei astfel de persoane, referindu-l la ea singura casa de vraji reala ?i puternica care m-a ajutat cu propria mea problema. e-mail: ogagakunta@gmail.com pute?i sa-i trimite?i un e-mail daca ave?i nevoie de asisten?a sa în rela?ia dvs. sau în orice alt caz sau WhatsApp, la +2348069032895
    1) Vraji de dragoste
    2) Vraji de dragoste pierdute
    3) Vraji de divor?
    4) Vraji de casatorie
    5) Vraja de legare.
    6) Vraji de rupere
    7) Alunga un iubit trecut
    8.) Dori?i sa va promova?i în vraja dvs. de birou / Loterie
    9) dori?i sa va satisface?i iubitul
    Contacta?i acest om grozav daca ave?i vreo problema pentru o solu?ie de durata
    ogagakunta@gmail.com

    ReplyDelete
  8. Mulțumesc domnule pentru vrăjile tale reale. Numele meu este Zara Matteo. Acest lucru este cu adevărat incredibil și nu am experimentat niciodată așa ceva în viața mea. Înainte de a vă cunoaște, domnule, am încercat toate mijloacele probabile pe care le-am putut pentru a-mi aduce soțul înapoi, dar am realizat că nimic nu funcționează pentru mine și că soțul meu mi-a dezvoltat multă ură. Am crezut că nu există nicio speranță de a mă reîntâlni cu fostul meu soț. Dar când am citit recenzii bune despre modul în care DR WHITE îi ajută pe ceilalți, am decis să-i trimit un mesaj prin WhatsApp: +17168691327. să încerc și am făcut tot ce mi-a instruit și am avut încredere în el și i-am urmat instrucțiunile, întrucât el m-a garantat în 48 de ore și tocmai atunci fostul meu m-a sunat. Domnule, acum suntem mai fericiți ca niciodată. Totul arată perfect și atât de natural! Vă mulțumesc foarte mult domnule pentru vrăjile dvs. autentice și incontestabile. aici din nou e-mailul său:

    wightmagicmaster@gmail.com

    .com Îl poți și Whatsapp:
    +17168691327

    ReplyDelete
  9. So many people told me there was no profile in trading binary. Mr Chris has helped me prove them wrong cause I have made 2500 USD with an investment of 250USD in just 3days of trading with Mr Chris and am so happy that am part if this. Thanks again Mr Chris for being real you can DM him if you intend investing with him on email, Bitcointtade965@gmail.com

    ReplyDelete
  10. Vreau să-l apreciez pe Dr. WHITE pentru restaurarea căsătoriei mele cu vrajă, după 1 an de separare cu soția mea, cu ajutorul marelui jucător de vrajă Dr.
    WHITE soția mea se întoarce acasă și acum suntem fericiți împreună pentru totdeauna, încă o dată datorită doctorului WHITE El vindecă tot felul de boli și, de exemplu,
    1 VRAIE DE IUBIRE
    2 CÂȘTIGĂ EX ÎNAPOI
    3 FROTUL MIEREI
    4 VRAJA DE PROMOVARE
    5 VRAJA DE PROTECȚIE
    6 VRAIA DE AFACERI
    7 VRAJA MUNCĂ BUNĂ
    8 HIV SIDA
    VRAJIA LOTERIEI ȘI VRAJEA CAUZEI CURȚII Contactați-l pentru ajutor prin:
    E-mail: wightmagicmaster@gmail.com

    WhatsApp: +17168691327

    ReplyDelete
  11. My husband left me and my children for over 6 months, all hope was lost. I thought I would never meet my husband again because he blocked me on all the social networks I could use to reach him. This left me sad and heartbroken until I met Dr. Dawn. Now, I explained everything to her and she promised me that everything would be fine in 3 days, to my surprise, my husband called and started begging 3 days after the spell, now my husband is back home and he treat's me very well and we live happily together now, contact her for help:
    *if you want to your loved ones.
    *if you want to get pregnant.
    *if you want to cure any sickness.
    *if you want a spiritual power.
    *If you want to stop miscarriage.
    Email: dawnacuna314@gmail.com {+2348032246310}

    ReplyDelete
  12. Salutare tuturor celor de pe acest blog, vreau să-mi mulțumesc Dr. Jasper. doctorjaspermagic@gmail.com marele vrăjitor care mă ajută să-mi recuperez fostul după ce am fost înșelat de patru vrăjitori care pretind că sunt adevărați și autentici, am contactat acest mare vrăjitor în punctul în care îmi pierd speranța că nu pot obține omul meu înapoi din nou, am făcut exact ce mi-a cerut acest om să fac și spre cea mai mare surpriză a mea totul se întâmplă așa cum acest mare vrăjitor mi-a spus că se va întâmpla. Omul meu, care nu m-a sunat în ultima lună, m-a sunat după ce Dr. Jasper Malo i-a făcut vraja asupra lui și chiar sunt surprins că există încă un vrăjitor grozav precum Dr. Jasper Malo, care este atât de puternic. Sunt foarte fericit astăzi că-mi văd bărbatul înapoi la mine și chiar mă iubesc mai mult decât oricând înainte de a-l întâlni. Nu mă voi ierta dacă părăsesc acest blog fără a lăsa adresa de e-mail a acestui mare vrăjitor pentru cei dintre voi care ar putea avea nevoie de ajutorul lui pentru a-l contacta. deci iată adresa de e-mail a acestui mare vrăjitor: doctorjaspermagic@gmail.com contactează-o acum și toate problemele tale vor dispărea pentru totdeauna

    ReplyDelete
  13. Unë po e ndaj këtë dëshmi për partnerët që vuajnë në marrëdhëniet e tyre, sepse ka një zgjidhje të qëndrueshme. Burri im më la mua dhe 2 fëmijët tanë për një grua tjetër për 3 vjet. U përpoqa të jem e fortë vetëm për fëmijët e mi, por nuk munda t'i kontrolloja dhimbjet që më mundonin zemrën. Isha i lënduar dhe i hutuar. Unë kisha nevojë për një ndihmë, kështu që bëra një kërkim në internet dhe hasa në një faqe ku pashë Dr.Fady një magjistar, që mund të ndihmojë të kthehen të dashuruarit. E kontaktova dhe ai bëri një lutje dhe magji të veçanta për mua. Për çudinë time, pas disa ditësh, burri im u kthye në shtëpi. Kështu u ribashkuam përsëri dhe kishte shumë dashuri, gëzim dhe paqe në familje. Ju gjithashtu mund të kontaktoni Dr.Fady, një magjistar i fuqishëm për zgjidhjet e kontaktit të tij
    drfady720@gmail.com ose mund ta shtoni në Whatsapp +2349039422406

    ReplyDelete
  14. Bună ziua, sunteți bineveniți să citiți întâlnirea mea cu Dr. Ajayi, un om spiritual puternic binecuvântat de strămoșii săi pentru a vindeca bolile cu ierburi și, de asemenea, pentru a restabili casa ruptă. L-am cunoscut pe Dr. Ajayi pentru că iubita mea soție vrea să divorțăm și asta după 12 ani de căsătorie binecuvântată cu doi copii drăguți, un băiat de 5 ani și o fată de 2 ani, ne-a scos fiica din casă și a rămas cu mama ei și o implor să se întoarcă acasă, dar ea a refuzat, am fost foarte confuză așa că am căutat ajutor, adică Când am citit despre Dr. Ajayi cum a ajutat o femeie să-și facă propriul copil după ce a fost căsătorită timp de 8 ani fără copil, l-am contactat pe Dr. Ajayi i-a explicat situația mea, el a cerut câteva informații despre mine pe care i le-am dat, după O consultație mi-a spus ce trebuie făcut și am făcut conform instrucțiunilor, în timp ce scriu asta, soția mea își tricotează în sufragerie. Dacă aveți nevoie de ajutorul unui om spiritual autentic, Dr Ajayi este ultima ta oprire, contactați-l pe Whatsapp / Viber: +2347084887094 sau E-mail: drajayi1990@gmail.com

    ReplyDelete
  15. Soțul meu a cerut divorțul, dar cu ajutorul Dr. Dawn Acuna, eu și soțul meu trăim în pace, cu bucurie și fericire, Dr, Dawn acuna a ajutat-o ​​cu o vrajă de dragoste puternică care l-a făcut pe soțul meu să realizeze cât de specială sunt și acum mă tratează ca pe o regină și mă îmbrățișează toată noaptea, asta este ceea ce mi-am dorit vreodată de la soțul meu, datorită Dr. Dawn acuna, contact pe Whatsapp:{ +2348032246310 }
    *Dacă vrei să te împaci cu iubitul tău.
    *Dacă doriți ca plante medicinale să conceapă.
    *Dacă vrei un inel magic.
    *Dacă vrei să vindeci orice fel de boală.
    *Dacă vrei să devii celebru în afacerea ta.
    Si altii,
    Îți promit 💯 la sută rezultat pozitiv, e sinceră, se ține mereu de cuvintele ei.

    ReplyDelete
  16. VÝKONNÝ KOULEL, KTERÝ VRÁTIL MÉHO MANŽELA ZPĚT DO ŽIVOTA, POTOM MĚ Opustil DR WALE WHATSAPP/VIBER : +2347054019402 NEBO PROSTŘEDNICTVÍM E-MAILU DRWALESPELLHOME@GMAIL.COM
    Dobrý den, přátelé, chci tímto médiem poděkovat DR WALE, protože přivedl zpět mého manžela. můj manžel mě opustil kvůli své bývalé přítelkyni, kterou měl předtím, než si mě vzal, je to pro mě těžká situace Volal jsem a prosil ho, aby se vrátil odmítl řekl, že už mě nemiluje Zkoušel jsem všechny možné způsoby, jak ho dostat zpět, všechno bylo Marně jsem o tom řekl své přítelkyni a ona mi dala kontakt na DR WALE a já jsem mu WhatsApp řekl a řekl mu svůj problém a on mi řekl, co mám dělat a já to udělal a on seslal kouzlo lásky, které během týdnů přivedlo zpět manžela. Pokud potřebujete pomoc při opětovném spojení se svým bývalým, chatujte s DR WALE přes WhatsApp/Viber: +2347054019402 nebo drwalespellhome@gmail.com

    ReplyDelete
  17. Çdo problem ka një zgjidhje kur takoni personin e duhur! Mos kini frikë se ekziston një magjistar i shkëlqyer dhe zgjidhës shpirtëror i problemeve që është në gjendje t'i japë fund problemit tuaj. Dua te vleresoj Dr Fady qe me riktheu martesen time me magjine e saj, Pas 1 viti ndarje me burrin tim, me ndihmen e magjistares se mrekullueshme Dr Fady burri im erdhi ne shtepi dhe tani jemi te lumtur bashke per mire, edhe nje here faleminderit per Dr Fady gjithashtu shëroi të gjitha llojet e sëmundjeve si p.sh.

    1 DEKLARATË DASHURI
    2 WIN S EX KTHIMI
    3 FRUTA GOMS
    4 NJOFTIM PËR PROMOCION
    5 DEKLARATA E MBROJTJES.
    6 MAGJIA E BIZNESIT.
    7 DEKLARATË E MIRË PUNËS.
    8 HIV SIDA.
    9 NDALO MISKARRIMIN.
    10 MIROOD NJOFTIM SHPALLJE.
    11 SHKAK I TELEKINEZËS.
    DREJTSHKRIMI I LOTARIVE DHE ÇËSHTJA GJYQËSORE Kontakt Kontaktoni atë për ndihmën tuaj nëpërmjet: drfady720@gmail.com
    WHATSAPP:+2349039422406

    ReplyDelete
  18. În această viață, cu toții merităm să fim fericiți în căsnicia noastră. căsătoria este pentru timp mai bun și pentru cel mai rău timp, căsătoria este pentru ca ambii părinți să devină puternici și să crească împreună copiii. acest lucru de care toate căsătoriile au nevoie. Sunt recunoscător pentru ajutorul acordat de DR WALE mie și soțului meu, căsnicia noastră a fost în pragul colapsului, soțul meu nu a mai contribuit la lucrurile pe care le facem în casă, el aduce mereu tot felul de scuze, nici măcar nu-i pasă mai despre a copiilor noștri. Pe măsură ce am început să-i observ comportamentul amuzant, am fost rapid să-i spun unui prieten care mi-a făcut cunoștință cu DR WALE, apoi i-am spus lui DR WALE despre problemele mele cu care mă confrunt în căsnicia mea. De acolo, DR WALE mi-a spus tot ce trebuie făcut. Am făcut tot ce mi-a cerut el, am plătit și pentru articolele pentru care mi-a cerut. în timp ce scriu această mărturie, acum fericirea mea a fost restabilită și eu și soțul meu suntem acum fericiți împreună. În cazul în care sunteți în DR WALE, ajutați-l să-l contactați pe WhatsApp/Viber: +2347054019402 sau e-mail: drwalespellhome@gmail.com

    ReplyDelete
  19. M-am căsătorit cu dragul meu soț în ultimii 12 ani fără să rămân însărcinată, iar fibromul a fost problema. Am luat diferite medicamente prescrise, dar nu am putut să le vindec, dar soțul meu era atât de încrezător în mine și mă tot încuraja că într-o zi cineva mă va numi mamă. nu s-a odihnit căutând o soluție de la diferiți medici, tot ce au putut vedea a fost o intervenție chirurgicală și mi-a fost frică de asta, o prietenă din cabinetul meu mi-a prezentat doctorul DAWN ACUNA, ea a spus că Dawn acuna a ajutat-o ​​când avea tubul blocat și a ajutat-o ​​și ea. multe dintre prietenele ei să conceapă,
    I-am scris imediat pe Whatsapp, mi-a promis ca ma ajuta dupa ce i-am explicat totul, mi-a dat niste instructiuni care am facut totul perfect conform instructiunilor, la 3 saptamani dupa tot am fost la spital si doctorul mi-a confirmat sarcina in 1 saptamana dar chiar acum am copilul meu frumos.
    *Dacă vrei să tratezi infertilitatea.
    *Daca vrei sa ramai insarcinata rapid.
    *Dacă vrei să-ți întorci iubitul.
    *Dacă vrei o căsătorie pașnică.
    *Dacă doriți să tratați boala canceroasă.
    Și mulți alții îl contactează pe Dr dawn acuna pe Whatsapp:+2348032246310
    E-mail: dawnacuna314@gmail.com

    ReplyDelete
  20. Vă mulțumesc pentru ceea ce ați făcut pentru mine { Dr dawn acuna }! Soțul meu a încetat să completeze actele de divorț după ce te-am contactat pentru a mă ajuta să opresc divorțul cu soțul meu și acum lucrurile merg mult mai bine acum. După cum ați spus, tot procesul privind divorțul a fost anulat și femeia rea ​​care provoacă problema în căsnicia mea a fost trimisă de soțul meu și acum suntem fericiți împreună, dacă aveți probleme în relație sau căsătorie sau orice alte probleme. , îi puteți e-mail la: ( dawnacuna314@gmail.com ) sau WhatsApp ei ( +2348032246310 ).

    S-a specializat pe următoarele vrăji:

    *Vrăji de dragoste
    *Vrăji de căsătorie
    *Vrăji de bani
    *Vrăji de frumusețe
    *Vrăji de bogăție
    *VÂRGILE DE ATRACȚIE SEXUALĂ
    *VRAJI DE VINDECA HIV
    *Vrăji de cazinou
    *ELIMINAȚI Vrăjile de blestem
    *Vrăji de protecție
    *Vrăji de loterie
    *Vrăji de noroc
    *VORGE DE FERTILITATE

    ReplyDelete