[ zivadin_despot @ 12.07.2011. 20:39 ] @
Pozdrav svima,
interesuje me kako isprogramirati U/f kontrolu AC motora na navedenom dsPIC-u? Konkretnu kako izgleda tabela sinusa, kako menjati vrednost amplitude izlaznog napona, kako menjati frekvenciju i kako racunati duty za PWM (kojom formulom)?
Ako moze za pocetak objasnjenje postupka rada programa pa cu pokusati sam nesto napisati...
Hvala unapred.
[ goran_68 @ 13.07.2011. 08:15 ] @
Nemoj sam, Microchip ima Application Notes. Pogledaj:
http://www.microchip.com/stell...deId=1824&appnote=en012129
http://www.microchip.com/stell...deId=1824&appnote=en022555
Pisani su za drugi MCU ali je princip isti.
[ zivadin_despot @ 17.07.2011. 18:20 ] @
Pregledao sam ovo i jos neke fajlove ali mi treba pomoc.... Video sam da postoji tabela sinusa ona se uporedjuje sa trougaonim signalom iz ptper-a i na osnovu toga se dobija vrednost duty-ja... Imam sledeca pitanja: kako izgleda tabela sinusa, koji su to brojevi, koliko tacaka definise sinus, kojom formulo se uporedjuje vrednost sinusa i trougla i dodeljuje PDC-u? Da li bih mogao sam napraviti tu tabelu?
Jel bi mogli da zapocnemo sa nekim programom, pa polako da dodjemo do resenja...?
Hvala unapred!
[ korak @ 19.07.2011. 02:00 ] @
Da li drajvuješ AC motor sa kaveznim rotorom ili BLDC motor? Kolika je snaga?

Ono što je u vezi sa sinusom je prosto, tu ima više drugih težih problema.

Prvo odredi koja će frekvencija PWM signala biti. U okvru svake periode treba da je Ton/T = sin(ugla). Obično AC motori sa kaveznim rotorom idu od par Hz do 50..60Hz AC napajanja. Često je frekvencija PWM par kHz, recimo 3kHz. Ako je najniža pobuda motora 3 Hz onda u tome imaš 1000 perioda PWM-a i treba ti toliko tabelarnih vrednosti za sin. Ali to svedeš samo na 45 stepeni, što je 1/8 dakle 125 vrednosti, a ostale dobijaš prostim trigonomertijskim transformacijama samo sa sabiranjem i ili oduzimanjem.

Ono što je važnije to je da se napon (struja) mora povećavati sa smanjenjem broja obrtaja motora. To povećanje je poznato, ali sada ne mogu da se setim zavisnosti od broja obrtaja.

Za svaku fazu ćeš imati potpuni most sa tranzistorima, moraš obeznediti da u PWM signalu postoji takozvano mrtvo vreme kada ni jedan tranzistor mosta ne provodi. Tranzistor koji ide u zasičenje ima kraće vreme uključenja nego isključenja, pa pri promeni stanja, ako nema pomenutog vremena, most kratkospaja na trenutak napajanje.

Ima još problema koji mogu da se ispreče, sve do nivoa smetnji koje će zračiti ceo regulator. Ako ti je PWM centralno podesiv nivo smetnji će biti niži.

Pozdrav.
[ goran_68 @ 19.07.2011. 10:06 ] @
Imas kompletan sors kod u asembleru na microchip sajtu. Na:
http://www.microchip.com/stell...29&page=wwwdevMotorControl
mozes naci Development Tool koji odgovara tvojoj aplikaciji. Date su i seme pa po njima mozes uraditi sopstveni razvojni alat. Jeftinije je, usput nesto naucis ali zahteva malo vremena.
Inace, Texsas Instruments, Freescale, ST ... imaju takodje razvojne alate za ove namene. Uporedi ih sa microchipom. Predlazem ti da napravis jednu plocu za napajanje, drugu na kojoj ce ti biti mcu i pratece okruzenje (optokapleri, potenciometri, tasteri i serijska veza ka PC) i na trecoj ploci drajver za motor. Lakse i brze ces raditi izmene a i popravke kad nesto ode (spremi vise tranzistora za drajver :)).
[ zivadin_despot @ 19.07.2011. 21:09 ] @
Upravljam kaveznim asinhronim motorom...Opseg frekvencije sam hteo da bude 10-50 Hz...
Da li mi mozes malo pojasniti deo koji se tice vrednosti PWM duty-ja i frekvencija? (ja probati da objasnim kako sam ja razumeo)
Sto si pomenuo odnos napona i broja obrtaja, mislim da bi se napon trebao smanjivati sa smanjivanjem frekvencije (U/f=const)
Predlog za izradu elektronike cu svakako primeniti, jer sam tako nesto i planirao.
A o mrtvom vremenu cemo kasnije dok ovo resimo.

Ako sam dobro razumeo, treba da imam tabelu sinusa definisanu odredjenim brojem tacaka n, a taj broj tacaka je definisan ovakvom formulom: n=fmin/fpmw; gde je fmin - minimalna frekvencija motora, a fpwm - frekvencija pwm modula. Interesuje me kolika je amplituda sinusa? Nakon toga trebao bi mi jedan tajmer koji ce mi definisati vreme odabiranja tacaka i dodeljivanje pwm signalu. Evo kao primer, recimo da mi je sinus definisan sa 20 tacaka, i da pogonim motor sa 50Hz, to znaci da bih trebao postaviti tajmer na 1 ms i na svaku ms vrednost duty-ja ce biti vrednost te tacke (Ton/T), jel? Naravno sa vise tacaka vrednost tajmera bi bila manja pa bi se korigovalo za druge frekvencije. Ovako sam razumeo za frekvenciju. Interesuje me sledece: ako zelim frekvenciju od recimo 25Hz, to znaci da bi vrednost napona na motoru trebala da bude upola manja, sto znaci da bi vrednost duty-ja trebala da se promeni u odnosu na malopre. Kako sada definisati sinus a da se mogu primeniti gornje formule?

Kada razjasnimo algoritam programa i ovu matematicku pozadinu, hteo bih da probamo konkretno i da napisemo program.

Gorane, hvala na linku pogledao sam, ali posto sam, moze se reci, pocetnik u programiranju imam poteskoce da tumacim kod u asm, ovako mi je lakse, a shvaticu bolje. Nadam se da ce i drugima ovo pomoci.

Hvala svima na pomoci.
[ zivadin_despot @ 23.07.2011. 20:46 ] @
Da li moze neko da prokomentarise nesto o ovome sto sam napisao, cisto da znam da li razmisljam u dobrom smeru.
Hvala unapred
[ veselinovic @ 24.07.2011. 12:03 ] @
Zivadine,
koliko vidim imas malo zbrke u glavi. Pomijesano ti je sve, jer unaprijed vodis racuna o mnogo faktora i dvije frekvencije i jos par amplituda.
Ajde ovako,
zaboravi na cas da ti treba sinus frekvencije npr 25Hz. Zamisli da ti u nekom trenutku vremena treba izlazni napon od npr 108V ( zamrzni taj trenutak u glavi). E sad imas izvor jednosmjernog napona od 300V, da bi dobio tih 108V treba da imas PWM sa signalom od 108/300. Pauza je dakle 1-108/300. Sve to skalirano na period PWM-a.
Sada si rijesio pola problema.
U iducem trenutku ti treba 127 V, opet matematika 127/300 i 1-127/300.
Napravis n tih tacaka ( sto vece n bolja aproksimacija sinusa), ali ne treba pretjerivati sa brojem tacaka, jer ces imati neki NF filter iza.


[ zivadin_despot @ 24.07.2011. 15:38 ] @
Evo ovako...Recimo da imam n tacaka za definisanje sinusa, imam izvor od 300VDC i recimo da je frekvencija motora takva da mi treba napon od 150V (amplituda). PWM modul je 8mo bitan (0-255). da bih dobio napon od 150V potreban duty (Ton/T) za PWM je 50%, priblizno 127. Da bih dobio sinus sa ovom amplitudom, potrebno je da su tacke definisane sa amplitudom 127, pa cu u vremenu vrednost duty-ja menjati tako sto cu racunati sinus sa ovom amplitudom, pa tako za 90 stepeni vrednost duty-ja ce biti 127 to, vracajuci se unazad, dobijam napon od 150V.

A frekvenciju bih podesava brzinom odabiranja tacaka.

Da li sam dobro shvatio deo oko podesavanja napona? Ako nisam dobro objasnio sta sam mislio, pokusacu ponovo...
Hvala na pomoci
[ veselinovic @ 24.07.2011. 20:42 ] @
Tako nekako.
Pri uglu od 90 stepeni PWM ce biti 127.
Na 0 stepeni ce biti 0, na 180 opet 0.
E sad trebas uzeti recimo 20 tacaka sinusa izmedju 0 i 90 stepeni i izracunati vrijednost za PWM.
Od 9- do 180 lako izracunas, i eto.
Narednu poluperiodu isto, samo palis drugu granu H mosta.
[ zivadin_despot @ 25.07.2011. 11:26 ] @
Veliko hvala na objasnjenju...pre nego sto pocenm da pisem kod da proverim da li bih ovako mogao podesavati frekvenciju: Ako imam definisan sinus sa 360 tacaka, i hocu frekvenciju od 50Hz da li bih mogao postaviti jedan tajmer koji radi na 1.8ms i na svakih 1.8 ms dodeljujem novu vrednost duty-ju? Da li se to tako inace resava?
Hvala

[Ovu poruku je menjao zivadin_despot dana 25.07.2011. u 13:19 GMT+1]
[ veselinovic @ 25.07.2011. 13:58 ] @
Da ne cjepidlacim, ali ne treba ti 360 tacaka, jer je sinus simatricna funkcija dakle 180 tacaka. Ali posto je sinus za alfa, pri cemu je 90<alfa<180 jednak :
beta=alfa -90
uvedes gama=90-beta
pa slijedi
sin(alfa)=sin (gama ).
Ispada da treba samo 90 tacaka.
E sad ti si isao sa vrlo preciznim sinusom ( step po 1 stepen), a mislim da je to pretjerano za pogon motora. Pitanje hoce li 8-bitni PWM moci to odraditi.
Idi na 10 -tak tacaka za 0-*90 stepeni. NF filter ce se pobrinuti za ostalo.
Cak je moyda bolji pristup ici semplovanje po amplitudi , a ne po vremenu.
Elem matematika je sledeca.
Drzis PWM=0 10 klokova
Onda dignes na PWM =10 i to drzis n klokova
pa PWM=20 i to drzis m klokova....
Samo treba odrediti n, m, i, j ,k,l....

[ zivadin_despot @ 25.07.2011. 14:32 ] @
OK za tacke sinusa, korigovacu to...
Ako sam dobro razumeo pocetni PWM je 0 pa nakon 10 klokova PWM povecam duty na vrednost prve tacke kako je u prethodnim porukama definisana, i tako nakon svakih 10 klokova menjam vrednost duty... Za neku drugu frekvenciju, bicu druga vrednost klokova, a to se peracuna, jel?
Hvala
[ veselinovic @ 25.07.2011. 16:49 ] @
Mozes i tako, s tim sto preporucujem sto brzi klok, a mozes i ovako:
ti dizes PWM za recimo 10, ali broj klokova je razlicit.


[Ovu poruku je menjao veselinovic dana 25.07.2011. u 18:06 GMT+1]
[ Sepa011 @ 25.07.2011. 17:30 ] @
Imas nesto interesantno OVDE, dobro procitaj.
[ mg87ser @ 24.08.2011. 15:09 ] @
Trebao bi da napraviš trofazni PWM modulator koji, u zavisnosti od zadate amplitude i frekvencije, na svom izlazu daje potrebna vremena vođenja tranzistora u tri grane invertora, za svaki novi PWM period. Ova vremena se mogu direktno upisati u PDC registre Motor Control jedinice, koja generiše šest PWM izlaza (tri komplementarna para) u skladu sa upisanim faktorima ispune. Ovim se reguliše srednja vrednost napona tri grane PWM invertora u svakoj novoj PWM periodi.U svakoj PWM periodi srednja vrednost napona treba da bude jednaka trenutnoj vrednosti prostoperiodičnog signala željene amplitude i frekvencije. Da bi se to ostvarilo, pored PWM nosioca, neophodan ti je referentni prostoperiodični signal koji ćeš modulisati sa PWM nosiocem. Poređenjem ova dva signala dobijaš signal promenjiog vremena vođenja ton, tj promenjive širine impulsa.


Izlazni PWM signal će se automatski generisati u PWM modulatoru (Motor Control Unit) skoro trenutnim (maksimalno brz clock) poređenjem stanja PWM timera i PWM duty cycle registara. Ono što treba da obezbediti u programu, jeste trofazni modulišući prostoperiodični signal. Pre svakog novog PWM perioda program mora da izračuna željenu vrednost izlaznog napona u sve tri faze invertora i da pripremi tri nova faktora ispune koji će odgovarati tim željenim vrednostima, t.j. obezbedi PWM signale sa odgovarajućim srednjim vrednostima u toku tog PWM perioda.

Veza između srednje vrednosti faznog napona u toku jedne PWM periode i vremena uključenja u toku te iste PWM periodi glasi Uasr = ton/Tpwm * Udc

Da bi izračunao nova vremena vođenja treba prvo da prepoznaš u kojoj si tački u vremenu. Za pomenuto ti je potrebna nova vrednost ugla, koju kontrolišeš i čija brzina promene treba da zavisi od zadate frekvencije. Svakom novom PWM periodu odgovara diskretni ugaoni pomeraj, čija se vrednost dobija jednostavnim diskretnim računom.

Možeš koristi aproksimacija sinus funkcije petog stepena. Ulazni argument funkcije je 16-bitni fixed point broj u opsegu ±1 (±32767), što predstavlja ugao u radijanima.Ovu funkciju je potrebno tri puta pozivati u toku jednog PWM perioda.

U glavnom programu treba da se nalazi inicijalizacija periferije, beskonačna while petlja u kojoj proveravaš zadatu vrednost frekvencije (potenciometrom) i na osnovu nje racunaš amplitudu. Potrebno je da napišeš PWM prekidnu rutinu koja će prekidati while petlju odredjenom brzinom ( npr. postaviš da je PWM 16kHz) i u kojoj se izračunavaju vremena vođenja PWM grana na osnovu tenutne preuzete frekvencije i izračunate amplitude. PWM prekid je najvišeg prioriteta.





[ zivadin_despot @ 26.08.2011. 19:38 ] @
Evo da se nakon ovih objasnjenja da pocnemo to da i realizujemo. Evo kod mog programa kako sam ja to zamislio da treba da radi, uz ovaj kod cu ostaviti i semu kao i rezultate simulacije, pa bi svaka pomoc, sugestija, savet dobro dosli.
Hvala na dosadasnjem trudu.
Kontroler je PIC18F4431, kristal je 20MHz....

Code:

int niz[21]={ 2, 293, 558, 768, 903, 950, 904, 769, 559, 295, 2,-292,-557,-767,-903,-950,-904,-770,-561,-296,-3},i=0,j;
int niz_b[21]={ 552, 764, 901, 950, 906, 774, 566, 303, 10,-284,-550,-763,-900,-950,-907,-775,-567,-304,-11, 283, 549};
int niz_c[21]={  898, 950, 909, 779, 572, 310, 18,-277,-544,-758,-898,-950,-909,-779,-574,-312,-19, 275, 542, 757, 897};
unsigned int pom,b,pom2,pom3,cc;

void interrupt(){
     if(PTIF_bit){
                  j++;
                  if(j==6){
                           j=0;
                  if(niz[i]>0){
                               PDC0L=niz[i];
                               PDC0H=(niz[i] & 0b0011111100000000)>>8;
                               i++;
                  }else{
                               pom=952+niz[i];
                               PDC0L=pom;
                               PDC0H=(pom & 0b0011111100000000)>>8;
                               i++;
                  }
                  if(niz_b[b]>0){
                               PDC1L=niz_b[b];
                               PDC1H=(niz_b[b] & 0b0011111100000000)>>8;
                               b++;
                  }else{
                               pom2=952+niz_b[b];
                               PDC1L=pom2;
                               PDC1H=(pom2 & 0b0011111100000000)>>8;
                               b++;
                  }
                  if(niz_c[cc]>0){
                               PDC2L=niz_c[cc];
                               PDC2H=(niz_c[cc] & 0b0011111100000000)>>8;
                               cc++;
                  }else{
                               pom3=952+niz_c[cc];
                               PDC2L=pom3;
                               PDC2H=(pom3 & 0b0011111100000000)>>8;
                               cc++;
                  }
                  if(i==21) i=0;
                  if(b==21) b=0;
                  if(cc==21) cc=0;
                  }
                  PTIF_bit=0;
     }
}
void main() {
     INTCON=0b11000000;
     INTCON2=0;
     PIE3=0b00010000;    // omogucen interrupt base timer-a
     PWMCON0=0b01010000; // svi omoguceni za PWM i rade u paru
     PTCON0=0b00000100; //pres 4 post 0
     PTCON1=0;
     PTPERH=(311&0b0000111100000000)>>8;    //4kHz PWM
     PTPERL=311;
     DTCON=0b01000111;
     TRISB=0;
     PORTB=255;
     Delay_ms(1000);
     PORTB=0;
     TRISD=0;
     PORTD=0;
     PTCON1.B7=1;
     while(1){
     }
}




Na slici 1. se vide 4 signala koja se vode na prve dve grane trofaznog invertora, prva dva signala se vode na prvu granu i rezultuju fazu a. Na slici 2 je uvelican prikaz i tu je ono sto me buni, vidi se da zuti signal prestavlja opadajucu prvu periodu sinusa, a plavi signal prestavlja invertovano to. Problem mi je kod znaka "?" gde mi zuti signal nema maksimalnu vrednost, duty nije priblizno 100%, zbog cega? Na slici 3. je uvelican prikaz slike 2...
[Ovu poruku je menjao zivadin_despot dana 26.08.2011. u 20:49 GMT+1]

[Ovu poruku je menjao zivadin_despot dana 26.08.2011. u 20:54 GMT+1]
[ zivadin_despot @ 27.08.2011. 19:25 ] @
Jel neko imao iskustva sa ovako necim?
Jos nesto sto mi nije jasno je sto duty registar PDC ako postavim iznad ~950, automacki ga postavi na manje, hocu da kazem sledece ako 8-bitnom PWM-u postavim duty 300 on ne postavlja duty 100% nego manji oko 20%... U datasheet-u ovog kontrolera sam video da mu je registar za duty 14-to bitni ako je prescaler veci od 1, sto je kod mene slucaj, ali nikako nece tako da mi radi...
Ajde prvo da to protumacimo sta je, pa cemo onda gledati sta je sa signalima i ostalim podesavanjima...
Svaki savet je dobro dosao.
Pozdrav
[ veselinovic @ 27.08.2011. 22:32 ] @
Postavi ne na 20% nego na 17.7% jer iz nekog razloga radi na 8 bita.
300-255=45

100*45/255=17.7
[ zivadin_despot @ 28.08.2011. 00:08 ] @
Da, da jasno mi je to, to sam naveo kao primer kako mi se ponasa u mom slucaju. Hteo sam reci da kada predjem maximalnu vrednost duty-ja da on polazi od nule... U mom slucaju se pokazalo da je maximalna vrednost ~950, ali mi nije jasno kako? trebalo bi da je 16384 (14-to bitni registar)... U cemu je problem? Evo deo datasheet-a koji o tome govori.
[ bogdan.kecman @ 28.08.2011. 06:03 ] @
stranica 195

po tablici 17-2 na 25MHz (ti teras na 20, znaci jos gore) da bi imao 14 bitnu rezoluciju teras pwm na 1.5kHz.

Ti konfigurises PWM na 4kHz (po komentaru iz koda; nisam proveravao na koliko ga stvarno setujes) sto ce reci da ti je rezolucija

log (20000000 / 4 / 4000) / log (2)

dakle 10 bita
[ zivadin_despot @ 28.08.2011. 12:03 ] @
Aha, jasno mi je sad, ovo sam totalno preskocio...hvala na objasnjenju. Sada mi je problem oko onih signala, zasto kada vrednost duty-ja treba da bude priblizna 100% on pobrljavi, naznacio sam na slici? Da li je ovaj nacin dobar za stvaranje sin PWM-a?
[ bogdan.kecman @ 28.08.2011. 18:07 ] @
uvek moras da gledas to - to ti je najbitnije kod PWM-a kad je pic u pitanju :D .. krenes od toga "sto je veca brzina pic-a, to imas vecu rezoluciju" :D pa promenis taj kristal i turis 40MHz :D


elem da li si video http://www.microchip.com/stell...deId=1824&appnote=en020394

tu imas sve objasnjeno + source primer
[ zivadin_despot @ 28.08.2011. 20:59 ] @
Pogledao sam file-ove i pokusao da se snadjem ali ne ide :( (los sam sa asemblerom). Video sam da ima PID regulacija, da postoji komunikacija sa PC-jem, da vreme uzimanja tacki iz tabele radi preko timer0, na kraju je data tabela sinusa za 45 stepeni definisana sa 19 tacaka, i nasao sam deo koda gde on podesava duty na osnovu podataka iz tabele, ali mi nije jasno kako dodeljuje vrednost? Evo deo koda pa da probamo rastumaciti:
Code:

;*******************************************************************************
;UPDATE_PWM_DUTYCYCLES
;
;This routine will update the PWM duty cycle on CCPx according to the 
;offset to the table with 0-120-240 degrees.
;This routine scales the PWM value from the table based on the frequency to keep V/F
;constant.
;*******************************************************************************
UPDATE_PWM_DUTYCYCLES

    movf    TABLE_OFFSET1,W            ;Load the table offset for Phase 1
    movf    PLUSW0,W                ;Use offset to access value in sine table via indirect addressing
    mulwf    FREQUENCY, W            ;Table_value X Frequency
    movff    PRODH,PDC0H_TEMP        ;Copy high product into temporary variable for PDC0H
    movff    PRODL,PDC0L_TEMP        ;Copy low product into temporary variable for PDC0L

;    movlw    0x1E                    ;Add 78h (1Eh shifted left two bits), in order to prevent 0 duty cycle
;    addwf    PDC0L_TEMP, F
;    btfsc    STATUS, C
;    incf    PDC0H_TEMP, F

UPDATE_PWM2
    movf    TABLE_OFFSET2,W            ;Load the table offset for Phase 2
    movf    PLUSW0,W                ;Use offset to access value in sine table via indirect addressing
    mulwf    FREQUENCY, W            ;Table_value X Frequency
    movff    PRODH,PDC1H_TEMP        ;Copy high product into temporary variable for PDC1H
    movff    PRODL,PDC1L_TEMP        ;Copy low product into temporary variable for PDC1L
    
;    movlw    0x1E                    ;Add 78h (1Eh shifted left two bits), in order to prevent 0 duty cycle
;    addwf    PDC0L_TEMP, F
;    btfsc    STATUS, C
;    incf    PDC0H_TEMP, F
    
UPDATE_PWM3
    movf    TABLE_OFFSET3,W            ;Load the table offset for Phase 3
    movf    PLUSW0,W                ;Use offset to access value in sine table via indirect addressing
    mulwf    FREQUENCY, W            ;Table_value X Frequency
    movff    PRODH,PDC2H_TEMP        ;Copy high product into temporary variable for PDC2H
    movff    PRODL,PDC2L_TEMP        ;Copy low product into temporary variable for PDC2L
    
;    movlw    0x1E                    ;Add 78h (1Eh shifted left two bits), in order to prevent 0 duty cycle
;    addwf    PDC0L_TEMP, F
;    btfsc    STATUS, C
;    incf    PDC0H_TEMP, F
    
TRUNCATE_PWM123                        ;Truncate results of multiply to 10 uppermost bits
    bcf        STATUS,C                ;discarding lower two bits and right justifying 
    rlcf    PDC0L_TEMP,F
    rlcf    PDC0H_TEMP,F
    rlcf    PDC0L_TEMP,F
    rlcf    PDC0H_TEMP,F
    rlcf    PDC0L_TEMP,W
    andlw    0x3
    movff    PDC0H_TEMP,PDC0L_TEMP
    movwf    PDC0H_TEMP
    
    bcf        STATUS,C
    rlcf    PDC1L_TEMP,F
    rlcf    PDC1H_TEMP,F
    rlcf    PDC1L_TEMP,F
    rlcf    PDC1H_TEMP,F
    rlcf    PDC1L_TEMP,W
    andlw    0x3
    movff    PDC1H_TEMP,PDC1L_TEMP
    movwf    PDC1H_TEMP

    bcf        STATUS,C
    rlcf    PDC2L_TEMP,F
    rlcf    PDC2H_TEMP,F
    rlcf    PDC2L_TEMP,F
    rlcf    PDC2H_TEMP,F
    rlcf    PDC2L_TEMP,W
    andlw    0x3
    movff    PDC2H_TEMP,PDC2L_TEMP
    movwf    PDC2H_TEMP

;testofPWM
;    infsnz    temp, f
;    incf    temp1, f
;    btfss    temp1, 2            ;if this bit is set temp1=4
;    goto    donewiththis
;    clrf    temp
;    clrf    temp1
;donewiththis
;    movff    temp, PDC0L_TEMP
;    movff    temp1, PDC0H_TEMP    
                
;    movlw    0x01
;    movwf    PDC0L_TEMP
;    movlw    0x00
;    movwf    PDC0H_TEMP
;    movlw    0xe8
;    movwf    PDC1L_TEMP
;    movlw    0x03
;    movwf    PDC1H_TEMP

    call    CHECK_LIMITS

    bsf        PWMCON1, UDIS        ;Disable updates to duty cycle and period
    movff    PDC0L_TEMP,PDC0L    ;Transfer temporary values into duty cycle registers
    movff    PDC0H_TEMP,PDC0H
    movff    PDC1L_TEMP,PDC1L
    movff    PDC1H_TEMP,PDC1H
    movff    PDC2L_TEMP,PDC2L
    movff    PDC2H_TEMP,PDC2H
    
    
;    movlw    0xFA
;    movwf    PDC0L
;    movlw    0x00
;    movwf    PDC0H
;    movlw    0xF4
;    movwf    PDC1L
;    movlw    0x01
;    movwf    PDC1H
;    movlw    0xEE
;    movwf    PDC2L
;    movlw    0x02
;    movwf    PDC2H
    
    bcf        PWMCON1, UDIS        ;Enable updates to duty cycle and period to update simultaneously.

    
    return    

;*******************************************************************************
;UPDATE_TABLE_OFFSET
;
;This routine Updates the offset pointers to the table after every access
;*******************************************************************************
UPDATE_TABLE_OFFSET
    btfss    FLAGS,OFFSET1_FLAG            ;If set incr. on table
    bra        DECREMENT_OFFSET1
    movlw    (SINE_TABLE_ENTRIES-1)        ;Check for the last value on the table
    cpfslt    TABLE_OFFSET1
    bra        CLEAR_OFFSET1_FLAG
    incf    TABLE_OFFSET1,F                ;Increment offset1
    bra        UPDATE_OFFSET2

CLEAR_OFFSET1_FLAG
    bcf        FLAGS,OFFSET1_FLAG

DECREMENT_OFFSET1
    dcfsnz    TABLE_OFFSET1,F                ;Decrement offset1
    bsf        FLAGS,OFFSET1_FLAG

UPDATE_OFFSET2
    btfss    FLAGS,OFFSET2_FLAG            ;If set incr. on table
    bra        DECREMENT_OFFSET2
    movlw    (SINE_TABLE_ENTRIES-1)        ;Check for the last value on the table
    cpfslt    TABLE_OFFSET2
    bra        CLEAR_OFFSET2_FLAG
    incf    TABLE_OFFSET2,F                ;Increment offset2
    bra        UPDATE_OFFSET3

CLEAR_OFFSET2_FLAG
    bcf        FLAGS,OFFSET2_FLAG

DECREMENT_OFFSET2
    dcfsnz    TABLE_OFFSET2,F                ;Decrement offset2
    bsf        FLAGS,OFFSET2_FLAG

UPDATE_OFFSET3
    btfss    FLAGS,OFFSET3_FLAG            ;If set incr. on table
    bra        DECREMENT_OFFSET3
    movlw    (SINE_TABLE_ENTRIES-1)        ;Check for the last value on the table
    cpfslt    TABLE_OFFSET3
    bra        CLEAR_OFFSET3_FLAG
    incf    TABLE_OFFSET3,F                ;Increment offset3
    return    

CLEAR_OFFSET3_FLAG
    bcf        FLAGS,OFFSET3_FLAG

DECREMENT_OFFSET3
    dcfsnz    TABLE_OFFSET3,F                ;Decrement offset3
    bsf        FLAGS,OFFSET3_FLAG
    return    


U ovom delu:

Code:

movf    TABLE_OFFSET1,W            ;Load the table offset for Phase 1
    movf    PLUSW0,W                ;Use offset to access value in sine table via indirect addressing
    mulwf    FREQUENCY, W            ;Table_value X Frequency
    movff    PRODH,PDC0H_TEMP        ;Copy high product into temporary variable for PDC0H
    movff    PRODL,PDC0L_TEMP        ;Copy low product into temporary variable for PDC0L


on dodeljuje vrednost, ali mi nije jasno zasto vrednost iz tabele mnozi sa frekvencijom?
Kako dobija vrednost duty-ja kada je pooluperioda negativna? Ja sam, kao sto ste videli, radio tako sto sam invertovao signal koji predstavlja pozitivnu poluperiodu, znaci kada je poluperioda pozitivna dodelim vrednost iz tabele, a kada je negativna od max duty-ja oduzmem vrednost iz tabele i to dodelim.
[ bogdan.kecman @ 28.08.2011. 21:57 ] @
da li si procitao tekst u pdf-u (strana 10)?

[ zivadin_despot @ 28.08.2011. 23:44 ] @
Tamo mi pod tackom 3 kaze da vrednost duty-ja dobija tako sto mnozi vrednost i tabele sinusa sa frekvencijom, rezultat je 16-to bitni i tu vrednost dodeljuje PDC registru koji moze biti maksimalno 14-to bitni, da li on time uzima samo 14 bita od rezultata ili u mom slucaju samo 10?
[ bogdan.kecman @ 29.08.2011. 03:13 ] @
nisam gledao sors (ja asm znam odlicno ali nemam snage da ga gledam) ali obicno ide sledeci kombo
ili je max freq * max sinus iz tabele < max broj koji moze da se upise u pwm registar te onda taj rezultat upisujes bez razmisljanja
ili je taj broj veci te ga onda posle mnozenja shiftujes tako da ga ubacujes u registar tako da odbacis least significant bits koji ne staju u registar
[ zivadin_despot @ 29.08.2011. 20:50 ] @
Evo kako je na kraju ispalo, nadam se da sam dobio dobar PWM. Pregledao sam ova dva pdf file-a (prilozeni) i to bi trebalo da je to. Tu je i kod kao i simulacija.
Code:

unsigned int sin_table[40]={ 625 ,723 ,818 ,909 ,992 ,1067 ,1130 ,1182 ,1219 ,
                             1242 ,1248 , 1242 ,1220 ,1182 ,1131 ,1067 ,993 ,909 ,
                             819 ,724 ,625 ,617 ,595 ,557 ,506 ,442 ,368 ,284 ,
                             194 ,99 ,5 ,98 ,193 ,284 ,367 ,442 ,505 ,557 ,594,617 };
unsigned int i=0,j=0,k=0,brojac=0;
void interrupt(){
     if(PTIF_bit){
                  brojac++;
                  if(brojac==4){
                                brojac=0;
                                PDC0L=sin_table[i];
                                PDC0H=(sin_table[i] & 0b0011111100000000)>>8; //faza_a
                                PDC1L=sin_table[j];
                                PDC1H=(sin_table[j] & 0b0011111100000000)>>8; //faza_b
                                PDC2L=sin_table[k];
                                PDC2H=(sin_table[k] & 0b0011111100000000)>>8; //faza_c
                                i++;
                                j++;
                                k++;
                                if(i==40) i=0;
                                if(j==40) j=0;
                                if(k==40) k=0;
                                PTIF_bit=0;
                  }
     }
}
void main() {
     INTCON=0b11000000;
     INTCON2=0;
     PIE3=0b00010000;    // omogucen interrupt base timer-a
     PWMCON0=0b01010000; // svi omoguceni za PWM i rade u paru
     PTCON0=0b00000100; //pres 4 post 0
     PTCON1=0;
     PTPERH=(311&0b0000111100000000)>>8;    //4kHz PWM
     PTPERL=311;
     //DTCON=0b01000111;
     TRISB=0;
     PORTB=255;
     Delay_ms(1000);
     PORTB=0;
     TRISD=0;
     PORTD=0;
     i=0;
     j=13;
     k=26;
     PTCON1.B7=1;
     while(1){
     }
}

Na osnovu formule za racunanje rezolucije duty registra, dobija se da je duty_max=1250 (simulacijom i potvrdjeno), tabela sinusa je kreirana na sledeci nacin. Poluperioda je definisana sa 20 tacak, za pozitivnu poluperiodu vrednost svake tacke se racuna kao sinus od ugla u toj tacci puta 625 plus 625, a za negativnu poluperiodu je malo drugacije, kako sinus raste u negativno, vrednost tacke opada. Ovako se dolazi do tih brojeva izracuna se vrednost sinusa za odredjenu tacku, zatim se pomnozi sa 625, pa se od toga oduzme 625 i pomnozi sa -1.
PWM signali dobijeni ovom nacinom su isti kao i u pdf file-ovima.




U pdf-u 93004A je dat jos neki nacin za racunanje duty-ja na osnovu iscitavanja iz tabele sinusa...
[ bogdan.kecman @ 30.08.2011. 04:59 ] @
deluje da si ga opravio, btw sto ne dodas na izlaz prema scope-u jedan kond+otpornik da vidis tacno kako sinus izgleda?
[ zivadin_despot @ 30.08.2011. 10:40 ] @
Simulirao sam sa induktivnost+otpornik, predstavio namotaje motora...evo rezultata, i mislim da je to to.
Na slici "slika2-induktivnost" mala je vrednost induktivnost a velika otpornost, pa se vide oni harmonici.
Na slici "korigovane vrednosti" povecao sam induktivnost i smanjio otpor.
Na slici "napon-struja" vidi se PWM signal, tj oblik napona i struja koju prouzrokuje (sin)
Na slici "konacna" povezao sam ceo invertor i predstavio motor. Na osciloskopu je prikazan napon jedna faze i struje sve tri faze.
Sad skupljam pare pa da ovo sve i realizujem.
Zelim svima da se zahvalim na pomoci.
Javim kasnije rezultate :-)
[ zivadin_despot @ 09.11.2011. 15:12 ] @
Pononvo se vracam na ovu temu, jer sada pokusavam prakticno i da napravim invertor. U prilogu je sema. Nastao mi je jedan problem, izgoreo mi je driver za mosfete IR2110 i mislim sva 4 mosfeta, ali mi nije jasno zasto. Pomislio sam i sumnjam da je u pitanju dead time u PWM signalu ali mi nije jasno kako. Trenutno mi je dead time oko1.4us, a datasheet-u ovog mosfeta pise da je vreme gasenja oko 167ns. Ako moze neka pomoc ili savet...

[ zivadin_despot @ 10.11.2011. 12:32 ] @
Mozda da prebacim pitanje na Elektroniku?
[ bogdan.kecman @ 10.11.2011. 12:43 ] @
po tome kako si postavio stvari sve bi "trebalo" da sljaka (i simulacija to pokazuje) e sad, da bi video zasto pucaju drajveri za fet moras da meris direkt tamo sta se desava .. ono sto ja primecujem je da nema otpornika koji skidaju potencijal sa gate-a, nisam koristio ove drajvere - mozda oni to imaju u sebi, ali obicno moras da otpornikom praznis gate inace ne mozes da radis brze promene... no tu bi trebao fet da rsne ili motor, ne drajver za fet ..
[ zivadin_despot @ 10.11.2011. 13:40 ] @
hm...ok, sta preporucujes koliku vrednost otpornika da stavima sa gate prema masi? 1k?
Mozda je zgodno da okacim i plocicu pa da na njoj vidite sta je pregorelo. Na plocici sam obelezio sta se sve izdesavalo, obratite paznju na desni driver, levi nema nikakva vidljiva ostecenja... Ako je potrebno okacicu slike havarije...
[ bogdan.kecman @ 10.11.2011. 15:36 ] @
tebi su pocrkali i fetovi, ne samo drajveri .. mozda postavka teme u parrent forumu nije losa ideja, tamo ima brdo ljudi koji znaju ovaj konfig sa fetovima mnogo dobro :) ...

ako se ja dobro secam ovi fetovi crkavaju (a onda mozda povuku i sve ostalo za sobom) kada su push i pull fet upaljeni u isto vreme. Ovo sto je R2 izgoreo i sto su izgoreli drajveri ja jedino vidim tako da kada su probili fetovi probilo je onih 300V kroz njih i zaboli su kroz otpornike u drajvere. Da li si ti ovo odma puko na 300V ili si mozda prvo probao sa manjim naponom (npr 5V) i sa ampermetrom i osiguracem da probas kako uopste izgleda sinus na izlazu ... pa polako dizes ulazni napon da vidis kako se ponasa ...

generalno sta ja pretpostavljam je da ako ti je pwm ok kapacitivinost na gejtu drzi otvoren fet Q1 dovoljno dugo da je i dalje otvoren kada se Q2 otvori, u tom trenutku oni naprave kratak spoj i 300V jurne kroz njih sa "mnogo ampera" i oni probiju... treba posle ovih kondova da turis jedan brzi topivi osigurac, pa u startu dok testiras stavis lepo 200mA ili tako neku sicu koja ne moze da probije fet, pa kad proradi sve onda turi vec ekser koji ce da pusta struje koliko planiras da trosis. Ovo pretpostavlja da drajver (nikad nisam radio sa njima) ne ume sam da isprazni gate na fetu te moras da ga praznis sam ... velicinu otpornika tu ka masi racunas u odnosu na kapacitet gejta i frekvenciju pwm-a.... ono sto bih ja ocekivao od tog drajvera je da ume da isprazni gate te ako je to tacno onda ova teorija pada u vodu ... druga varijanta je da ti ne valja pwm i da zbog necega imas otvorena oba gate-a. Ako sam ja dobro skontao dead-time na 4431 i ekipi to je vreme kada su oba feta *ugasena*, signal na osciloskopu pokazuje upravo to, kanal B je ugasio fet (A je vec bio ugasen) i onda tek posle dead-time se pali kanal A, dakle ne da nisu otvoreni u isto vreme, nego naprotiv, ima uvek pauza tokom koje su oba ugasena (bas iz razloga da ne bi probili).

po meni, najbolji nacin za testiranje je
- stavis nove drajvere i fetove
- umesto 300V dovodis im neki upotrebljiv napon tipa 5-12DC preko nekog jako malog osiguraca (100-200mA) i teras neki 5-12V motor ili neesto slicno, mozes i neku sijalicu da okacis
- pratis osciloskopom sta se tacno desava na ulazu u drajver, na izlazu iz drajvera i na fetovima ....

kao sto rekoh, nisam trosio drajvere, ako je na primer na drajveru invertovan ulaz onda ti dead time drzi upaljene oba feta neko vreme i onda nije cudo da su rsnuli

ps. slike havarije nece mnogo pomoci, ali su to slike koje je uvek zgodno videti :D
[ goran_68 @ 10.11.2011. 15:57 ] @
Koja je frekvencija pwm signala? Simulacije su OK ali ti je neophodan osciloskop da bi video šta se dešava.
Mogao si da okreneš oba IR2110 za 180 stepeni na pločici. Jednostavnije je.
[ macedo @ 10.11.2011. 16:02 ] @
Dali je doshlo do kvara nakon samog ukljucenja ili nakon izvesnog vremena?
[ bogdan.kecman @ 10.11.2011. 16:11 ] @
koliko ja vidim iz simulacije i iz sorsa pwm je na 4khz sto bi trebalo da je ok

da li je riknulo odma ili posle par minuta ne vidim da pravi preveliku razliku ?! ako bi mogao da objasnis koja je razlika ako je crko odma i ako je crko posle 10min rada

@zivadin_despot btw neke fetove sa overcurrent / thermal shutdown da si stavio bilo bi ti mnogo jeftinije :)
[ goran_68 @ 10.11.2011. 16:32 ] @
Već sam ti negde iznad napisao da unapred spremiš više fetova. Simulacije su jedno a realan rad nešto sasvim drugo. Razdvoj napajanja za MCU i drajver i dodaj optokaplere na pwm izlaze MCU. Uradi redizajn pločice. Pogledaj AN-978 od IR. Bilo bi dobro i da imaš merenje struje (jes da ti ne bi u ovom slučaju pomoglo al' valja).
[ macedo @ 10.11.2011. 17:17 ] @
Po mom mishljenju vreme nastanka kvara je veoma bitno, jer od do sada napisanog se ne moze zakljucite dali je u pitanju problem hardverske ili softverske prirode.
[ zivadin_despot @ 10.11.2011. 17:32 ] @
Frekvencija je 4KHz, a do kvara je doslo neposredno nakon ukljucenja, aj da probam da objasnim cim sam ukljucio u uticnici je sevnulo, ali je to normalno zbog punjenja kondenzatora, nakon sec uli 2. doslo je do eksplozije...Pre eksplozije zaculo se sistanje ali nisam uspeo odmah da iskljucim jer se sve brzo odigralo...
Bogdane nisam najbolje razumeo na koje fetove mislis...
[ bogdan.kecman @ 10.11.2011. 17:59 ] @
Citat:
Bogdane nisam najbolje razumeo na koje fetove mislis...


pa napisah - na fetove sa termickom i strujnom zastitom - one koji nece da prsnu kada kroz njih krene velika struja nego samo da se ugase... ja sam npr koristio dosta NID5004N ali oni su em 40V em su discontinued .. (meni rade posao posto ja preko 35VDC ne idem ima i varijanta sada koju trosim sa 60-70V ali ti svejedno ne radi), treba samo naci slicne fetove na 300+V koji imaju taj temperature i thermal cut-off.

btw bilo bi zgodno da zabodes jedno and kolo i brojac i da brojis svaki put kada su i push i pull fet okinuti .. (tj 2 para da brojis za oba para fetova) pa kresnes spravu na prazno i proveris dal brojac raste ... ako raste - sve jasno ..
[ macedo @ 10.11.2011. 22:19 ] @
Da mozda nisi napravio greshku pri izracunavanju vrednosti R1-R4.
[ zivadin_despot @ 10.11.2011. 22:39 ] @
Vrednosti nisam racunao nego sam stavljao otpornike onako kako uvek stavljam na G. Na plocici su mi otpornici od 470Ohm...
[ foxhunter1 @ 11.11.2011. 07:36 ] @
Na brzinu pogledah DS za tvoje FETove. Tamo stoji da je kapacitet gejt-sors pogolem, tipicno 4500 pF. U kombinaciji sa tvojim otpornicima od drajvera ka gejtovima dobija se prilicno velika vremenska konstanta. U AN za IR drajvere ljudi su stavljali te otpornike sa vrednoscu ispod 10 Oma. Da u tom grmu ne lezi zec?

Pozdrav,
[ bogdan.kecman @ 11.11.2011. 08:29 ] @
sa 4500pF i 470R otpornikom tebi je RC oko 2us sto je previse posto bi morao da se isprazni gate pre nego prodje dead time, a tebi je posle 2us (a dead ti je 1.4us) gate na 4V sto po datasheet-u znaci da tada jos uvek moze da pusti dosta ampera .. ja sam doduse nasao datasheet koji kaze da je 1300pF a ne 4500pF ...

ja bi tu turio 10W 10R (max struja kroz njega je 1.2A sto je malo vise od 10W ali obzirom da prolazi tih 1.2A neku nanosekundu samo 10W bi trebalo da odradi posao) i posle 1us na gejtu imas nista iliti 0.000000027V :)

Mozes da ides sa 100R sa max strujom 0.12A, tako da ti tu slabiji otpornik radi posao, (I*I*R = 1.44W, dakle 2W stavis i ne mislis), tu onda posle 1usec na gate-u onda imas 1.6V sto ce vec ugasiti taj fet ali ne bas skroz (na 1.4us koliko ti je dead time imas na gejtu 0.54V)

nesto izmedju, 1W 50R je mozda idealno :D (posle 1.4us na gejtu 0.02V, 0.24A ide kroz isti dakle 0.7W)
[ macedo @ 11.11.2011. 09:51 ] @
Cini mi se da ovo moze da pomogne oko odredjivanja vrednosti otpornika.
[ goran_68 @ 11.11.2011. 10:27 ] @
I napajanje je sporno. C5, grec, trafo...
Nemaš nigde osigurač...

[Ovu poruku je menjao goran_68 dana 11.11.2011. u 11:56 GMT+1]
[ grabik @ 12.11.2011. 19:57 ] @
Imam 2 rasturena hitachi 3F 5,5Kw invertora, u njima se koriste IGBT moduli od tricavih 1200V i 35A ;).

[ grabik @ 13.11.2011. 14:50 ] @
Neznam odakle da pocnem :) , moras da startas sekvencijalno, znaci prvo PIC i IR2110 pa onda na kraju PIC ukljucuje relejom 300VDC.

Drugo ta PCB bez uvrede ne lici na nista, gejtovi fetova moraju biti udaljeni od IR2110 za duzinu otpornika koji je vezan na gejtu znaci prakticno na fetovima, linije od IR2110 do fetova vrlo kratke, kondenzatori prakticno na pinovima IR2110, otpori od 330 ohma treba da su od 10 do 30 ohma zavisno koliko hoces da ti okida brzo fetove i koliko mozes da ubijes naponske pikove koji se javljaju kod vrlo brzog ukljucenja i iskljucenja. Mislim da su fetovi premalog nazivnog napona, mrtvo vrjeme prekratko a i nemas neki snuber ili zastitu od prevelikih naponskih pikova na njima. takodje odnos kondenzatora na pinovima IR2110 izmedju VB i VS i VCC i COM ti je 10:1 ove druge ti ni nemas:), takodje jedan od njih treba da bude low esr sto blize na pinovima i jedan keramicki na pinovima sto vazi i za drugi par.
Diode na IR2110 treba da su ultra brze a ne obicne.

Sve ti to pise u dokumentima AN978 ,DT97, DT98 takodje pogledaj dokument o snuberima na istom sajtu(IR.com).

[ ZAS011 @ 16.11.2011. 14:16 ] @


Nego, kad smo vec kod U/F kontrole, kako ono bese: sto je visa F to se i napon povecava ili obrnuto? Nesto mi tresnulo na pamet da odradim sa jednim prastarim cipom

[Ovu poruku je menjao veselinovic dana 16.11.2011. u 15:48 GMT+1]
[ zivadin_despot @ 16.11.2011. 18:21 ] @
Ako smanjujes frekvenciju, smanjujes i napon tako da U/f bude const... Iznad nominalne frekvencije mozes podizati frekvenciju ali ne i napon i onda ti dolazi do slabljenja polja, nemas vise nominalnu snagu... Pozdrav

Javim rezultate vezano za invertor.
[ ZAS011 @ 17.11.2011. 22:38 ] @
Axm, to sam i predpostavljao, hvala u svakom slucaju. Sad mogu da se bacim na crtkaranje plocice.

Bicete obavesteni o napretku (nece bude DsPiconja, obicna boranija 16F887 i jedan starac od SA8281)