moro Postat Noiembrie 2, 2011 Autor Partajează Postat Noiembrie 2, 2011 Am o intrebare 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
10vid Postat Noiembrie 2, 2011 Partajează Postat Noiembrie 2, 2011 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
moro Postat Noiembrie 2, 2011 Autor Partajează Postat Noiembrie 2, 2011 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
10vid Postat Noiembrie 2, 2011 Partajează Postat Noiembrie 2, 2011 Imi pare rau, dar nu pot sa te ajut in aceasta chestiune, pentru ca nu cunosc C. Nu mi-a placut niciodata. 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 ----> Astfel, ca o rectificare, valorile din acel tabel SIN vor fi cuprinse intre 0 si PTPER x 4. Link spre comentariu
moro Postat Noiembrie 3, 2011 Autor Partajează Postat Noiembrie 3, 2011 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
Liviu M Postat Noiembrie 3, 2011 Partajează Postat Noiembrie 3, 2011 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
MatyC Postat Noiembrie 3, 2011 Partajează Postat Noiembrie 3, 2011 Mama chiar ca iese din pagina de m-am speriat acum cand sa raspund @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 Postat Noiembrie 3, 2011 Partajează Postat Noiembrie 3, 2011 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
moro Postat Noiembrie 3, 2011 Autor Partajează Postat Noiembrie 3, 2011 Mama chiar ca iese din pagina de m-am speriat acum cand sa raspund @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 meargaAm 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 Postat Noiembrie 3, 2011 Partajează Postat Noiembrie 3, 2011 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
moro Postat Noiembrie 3, 2011 Autor Partajează Postat Noiembrie 3, 2011 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
10vid Postat Noiembrie 3, 2011 Partajează Postat Noiembrie 3, 2011 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
moro Postat Noiembrie 3, 2011 Autor Partajează Postat Noiembrie 3, 2011 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
Vizitator flopir Postat Noiembrie 4, 2011 Partajează Postat Noiembrie 4, 2011 Si eu m-am intrebat la ce iti trebuie 4 iesiri. Un tranzistor high-side se comanda impreuna cu cel low-side din ramura opusa. Corecteaza-ma daca gresesc. Link spre comentariu
moro Postat Noiembrie 4, 2011 Autor Partajează Postat Noiembrie 4, 2011 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum