Sari la conținut
ELFORUM - Forumul electronistilor

Recomandare PIC pentru modulare pwm sinus


moro

Postări Recomandate

Am o intrebare :ras: cum fac acele "trenuri" de pwm, am stors google in ultimele 48 de ore despre modularea pwm a semnalului sinusoidal si din ce am gasit majoritatea vorbesc de "impartirea" unei sinusoide pe o scala 0-255 pe 8 biti, impartita cumva in doua 0->127->0, am vazut ca ar fi vorba despre un tablem cu acele valori de la 0 pana la 255 folosind intreruperi (interrupts), poate cineva sa explice putin cum sa fac tabelul cu acele valori si sa folosesc valorile pentru generarea intreruperilor ca sa am trenul de impulsuri dorite?

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

Top autori în acest subiect

  • moro

    17

  • 10vid

    9

  • Liviu M

    3

  • MatyC

    2

Top autori în acest subiect

Va trebui sa activezi intreruperile generate de acest modul PWM (bitul PTIE=1 in registrul PIE3).

In modul 'free running' pe care am vazut ca l-ai selectat, o intrerupere se produce la terminarea fiecarei perioade PWM, adica cand numaratorul PTMR a numarat pana la valoarea inscrisa in PTPER.

In rutina de servire a acestei intreruperi, vei incarca o noua valoare de umplere pentru PDCx, din tabelul cu valori sinus.

Aceste valori sinus au o marime cuprinsa intre 0 si PTPER (valoarea de umplere maxima 100% e atunci cand PDCx = PTPER).

Uite aici un link spre un automat de generare a acestui tip de tabel:

http://stereoping.com/sineValues2.swf

Link spre comentariu

In rutina de servire a acestei intreruperi, vei incarca o noua valoare de umplere pentru PDCx, din tabelul cu valori sinus.

Aici m-am impotmolit cu aceea rutina, cum introduc valorile din tabel in rutina? Sau mai exact cum creez rutina aceea?
Link spre comentariu

Imi pare rau, dar nu pot sa te ajut in aceasta chestiune, pentru ca nu cunosc C. Nu mi-a placut niciodata. :sparge: A fi hobbist inseamna a avea privilegiul de a face doar ceea ce-ti place, cand iti place. Dar sunt convins ca o sa raspunda un coleg care stie. Sunt destui pe aici.Am vrut sa testez in simulator cele spuse mai sus si am bagat doua valori, 500 pentru PTPER si 250 pentru PDCx. M-am asteptat sa vad un semnal dreptunghiular cu umplere 50%. Dar nu, umplerea era mult mai mica. Dupa o inspectare mai atenta a datasheetului a reiesit ca bitii 0 si 1 din PDCx sunt de fapt biti fractionari, adica de dupa virgula. Mai mult, cand un prescaler este selectat, acesti biti sunt morti, ignorati. Deci va trebui sa ii ocolesti la incarcarea registrului PDCx.Astfel, valoarea corecta pentru PDCx era 250<<2, adica 1000. ----- Microchip ----> :bataie Astfel, ca o rectificare, valorile din acel tabel SIN vor fi cuprinse intre 0 si PTPER x 4.

Link spre comentariu

Pana acum codul arata cam asa

const unsigned char sine[255]={64,66,67,69,70,72,73,75,76,78,80,81,83,84,86,87,88,90,91,93,94,96,97,98,100,101,102,103,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,120,121,122,122,123,123,124,124,125,125,126,126,126,127,127,127,127,127,127,127,127,127,127,127,127,127,127,126,126,126,125,125,124,124,123,123,122,122,121,120,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,103,102,101,100,98,97,96,94,93,91,90,88,87,86,84,83,81,80,78,76,75,73,72,70,69,67,66,64,62,61,59,58,56,55,53,52,50,48,47,45,44,42,41,40,38,37,35,34,32,31,30,28,27,26,25,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,8,7,6,6,5,5,4,4,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,4,4,5,5,6,6,7,8,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,34,35,37,38,40,41,42,44,45,47,48,50,52,53,55,56,58,59,61,62,64};void main() {PTCON0=0x00;  // 1:1 postscale, Fosc/4 1:1 Prescale, Free-runing ModePTCON1=0x80;  // PWM TIMEBASE ON, Counts UPPWMCON0=0x30; // PWM Outputs 0-1, 2-3 in complementary mode/*====== PTPER Config Registers ======================== */PTPERL=0xFF; // 8 lower bits  24.4 khz pwm freq @ 10 bits pwm resolutionPTPERH=0x00; // 4 upper bits/* ===== End of PTPER Config ============================*/DTCON=0xC1; // Deadtime Fosc/16 - 640 ns deadtime   PDC0L =0x99; //148<<2;  PDC0H =0x01; //148>>6;  //PIE3=0x10;}
Mai trebuie sa vad cum reusesc sa fac intreruperea dupa tabelul cu valorile sinusoidei....
Link spre comentariu

Daca am inteles eu bine (ca n-am folosit niciodata asa ceva), imparti o perioada de-a sinusoidei in 255 de bucati si folosesti un timer sa genereze intreruperi cand trece cate o bucatica.Cand iti vine cate o intrerupere de-asta, nu-ti ramane decat sa reprogramezi modului PWM cu valoarea corespunzatoare din tabel. Cand ai terminat toate cele 255 de bucatele o iei de la capat.PS Daca mai merge, editeaza si tu array-ul ala, pune-l pe mai multe randuri, ca iese din pagina.

Link spre comentariu

Mama chiar ca iese din pagina de m-am speriat acum cand sa raspund :speriat @moro: te-ai hotarat cum va fi logica de comanda a celor 4 tranzistoare din puntea H? Ca am studiat putin problema si nu prea pica bine.

Link spre comentariu
Vizitator flopir

Am si eu o curiozitate...Nu am stat sa descifrez codul postat de tine si nici nu cunosc uC-ul asta, dar daca am inteles bine, vrei sa generezi o perioada SIN in255 de pasi folosind semnal PWM. Daca imparti o perioada de 20ms in 255 ar rezulta un semnal de 12,75Khz... Ce frecventa are semnalul PWM (ar fi ideal sa fie de forma k*12,75Khz)??

Link spre comentariu

Mama chiar ca iese din pagina de m-am speriat acum cand sa raspund :speriat @moro: te-ai hotarat cum va fi logica de comanda a celor 4 tranzistoare din puntea H? Ca am studiat putin problema si nu prea pica bine.

Salut, voi folosi cele 4 iesiri PWM0-1 si PWM2-3 cu buffere care sa-mi atace niste transformatoare drviver, momentan nu m-am ocupat foarte mult de partea hardware... vreau sa fac softul sa mearga

Am si eu o curiozitate...Nu am stat sa descifrez codul postat de tine si nici nu cunosc uC-ul asta, dar daca am inteles bine, vrei sa generezi o perioada SIN in255 de pasi folosind semnal PWM. Daca imparti o perioada de 20ms in 255 ar rezulta un semnal de 12,75Khz... Ce frecventa are semnalul PWM (ar fi ideal sa fie de forma k*12,75Khz)??

Asa mi-a dat si mie (12.75khz), valoarea din cod e 24.4khz, am folosit niste valori din datasheet doar cu scop demonstrativ... se poate modifica ulterior aceea valoare la 12.7khzEu momentan m-am impotmolit la realizarea interuperilor, nu ma descurc cu realizarea interuperilor dupa valorile din acel array...
Link spre comentariu
Vizitator flopir

In primul rand cred ca trebuie sa "sapi" putin prin help-ul compilatorului ala de C pe care il folosesti pentru a vedea cum se defineste o subrutina de tratare a intreruperii. Eu personal la uC PIC nu am folosit pana acum compilator C. La ATMEL, compilatorul meu are un fel de generator de cod initial care defineste si tratarea intreruperilor ("interrupt service routine") - sub forma de functii, de exemplu: interrupt [TIM1_OVF] void timer1_ovf_isr(void), dupa care poti adauga si codul propriu prin care citesti o valoare din tabel si actualizezi cu ea registrii responsabili de PWM. Problema cea mare, pentru tipul asta de aplicatie, e ca durata efectiva a executarii anumitelor secvente de cod e critica - lucru destul de greu de controlat in C.

Eu in locul tau as incerca mai intai sa impart perioada aia in mult mai putine bucati (de ex 10-20) si sa incerc.

Link spre comentariu

Eu compilator folosesc mikroC, intial asa vreau sa fac, sa micsorez pasii pentru sinusoida sa vad ce obtin... Oricum la noapte o sa am destul timp cat sa caut cum fac rutina de intrerupere

Link spre comentariu

Ok, pana una alta, am scris codul in asm.Dead-time l-am pus 1us.Cristal = 8MHz (prin PLL ajunge intern la 32MHz).Iesiri am pus doar doua PWM0 si PWM1, n-am inteles de ce iti trebuiau patru (poate explici).Eu asa stiam ca sunt doi condensatori mari legati in serie cu trei fire scoase: 300v, 0v, -300v, apoi doi Mosfeti "baga" + si - de pe capete intr-un al patrulea fir, motorul fiind legat intre 0v si acel fir.

PIC18F4431_PWM_SIN_v1.zip

Link spre comentariu

Eu vruiam sa fac o punte formata din 4 mosfeti (2 pe Highside si 2 pe Low side) din iesirea unui convertizor care scoate 320V de la 12V facut cu un controler pwm dedicat (SG3525) si un traf de ferita, si vruiam sa folosesc cate doua iesiri complementare pentru cele 4 tranzistoare,dar asta este discutabil. Am incarcat hex-ul de la tine in ISIS si merge ok, insa eu vreau sa pricep si sa-l fac in C, singura chestie care ma tine in loc acum este cum sa construiesc o rutina de intrerupere cu valorile sinus din tabel... In momentele astea imi pare rau ca nu m-a atras limbajul de programare...

Link spre comentariu

Buna dimineata, referitor la cele 4 iesiri, stiu la ce va referiti, doar ca asta ar implica folosirea unui traf driver cu 4 secundare + 1 prrimar, eu am 4 buc de traf driver cu 2 secundare...ceva de la coilcraft si nu vruiam sa folosesc ir2110 + ca vruiam izolare gavalnica intre controler si etajele de putere

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