Softverski PWM 50Hz za Inverter 12vDC-220vAC

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: stojke369, pedja089, [eDo], trax

Post Reply
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by milan-markovic »

Pozdrav svim clanovima foruma.

Dosao sam na ideju da uradim Pretvarac napona 12v - 220v sa PIC16F1827 Mikrokontolerom.Posto HPWM nemoze da se spusti toliko nisko 50Hz dobio sam informaciju da je tu potrebno da se uradi softversko resenje sa nekim Tajmerom koji ce da pravi interapte na svakih 20ms kada kontroler treba za promeni stanje na pinovima.
Posto sam ja pocetnik u programiranju potrebna mi je vasa pomoc . Za pisanje programa koristim PicBasic Pro (MicroCode Studio) ali za ovaj poduhvat mi je potrebna vasa pomoc.

Evo jednog predloga koji mi je dao Pedja089 kako bi to trebalo da se uradi:
Prvo moras odabrati tajmer koji ti se svidja. Ne znam koji pic koristis, pa ti detaljnije ne mogu reci.
Ali krenes ovako, prvo pregledas tajmere koje ima taj pic. Pa odaberes neki koji ima preskaler, on u principu samo podeli ulaznu frekfenciju.
I onda za 50HZ podesis preskaler na maksimalno deljenje frekfencije.
Zatim podesi tajmer da bude ukljucen. I u glavnom programu probaj napraviti da li ti se menja vrednost tajmera. Ne znam dal imas neki displej ili tako nesto, pa bi mogao ispisati vrednost tajmera.
Ako nemas to napravi neku led diodu, pa ispituj vrednost TMRxH pa nek se pali i gasi recimo ako je veci od 127 i manji od 127.
Kad to uradis onda si uspesno pokrenuo tajmer. Onda ti ostaje samo igranje sa interuptom i preloadom.
Ja sam odabrao Timer0: 8-Bit Timer/Counter sa 8-Bit Prescaler koji ima deljenje sa maksimalno 256.
Njegov registar je OPTION_REG.

Timer0 sam uspeo da pokrenem i svakih 10 sekundi led dioda povezana na RB0 blinka evo i koda:

Code: Select all

#CONFIG
 __config _CONFIG1, _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF 
 __config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF 
#ENDCONFIG

 define osc4

TRISB=%00000000   ' Port B je izlazni

mS  Var Word     'Promenljiva za milisekunde
    Sek Var Word     'Promenljiva za sekunde
     	
    Symbol Led = PORTB.0 'Led dioda na RB0
    TRISB = 0            'PORTB je izlazni 

Inicijalizacija:

	
	INTCON.5 = 0	   	 'Onemoguci TMR0 prekide
	
	mS = 0		  		 'Brise promenljive za vreme
	Sek = 0		  		 '

	OPTION_REG.0 = 0   	 '010 preskaler postavi u odnos	1:8
	OPTION_REG.1 = 1   		
	OPTION_REG.2 = 0			
	OPTION_REG.3 = 0			

	OPTION_REG.5 = 0	 'Izaberi Interni takt
	OPTION_REG.7 = 1		

	TMR0 = 6	   		'Postavi vrednost TMR0 
	
	INTCON.5 = 1		'Omoguci TMR0 prekide
	INTCON.7 = 1		'Omoguci sve prekide

    ON INTERRUPT goto Int_Sub

Pocetak:

	Repeat 				 'Ciklus

	Until Sek = 10		 'Sacekaj  do 10 sekundi

  	Toggle Led	
  	
  	TMR0 = 6
	Sek = 0	   	 	 	'Ponisti promenljivu Sek
	
	Goto Pocetak
 	
'------Podprogram obrade prekida-----------------------
       Disable
Int_Sub:

    INTCON.7 = 0
    
	If INTCON.2 and INTCON.5 Then
	   INTCON.2 = 0
	  	  mS = mS + 2
		  If mS >= 1000 Then 
		  	 mS = mS - 1000
			 Sek = Sek + 1
		  EndIf
	EndIf
   
     
    INTCON.7 = 1  'Omoguci prekide
    INTCON.5 = 1  'Omoguci prekide

     
    Resume        'Vrati se iz rutine prekida
    End
E sad je potrebno da se uradi interrupt da menja stanje pinova na svakih 10ms ali mi nije jasno kako to da izvedem.
Evo slike sta treba da dobijem iz pretvaraca (kvazi sinus)sa pauzama izmedju poluperiode.
Attachments
kvazi-szinusz.gif
kvazi-szinusz.gif (1.4 KiB) Viewed 7944 times
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by milan-markovic »

Probao sam da napisem program da kada se desi interrupt od strane tajmera na svakih 8ms pontoler skici na izvrsavanje potprograma u kome sam probao da uradim da mi se menja stanje na pinovima.
Ali negde gresim ne dobijam oscilogram koji meni treba sigurno postoji neki drugi nacin koji ja neznam za promenu stanje na pinovima.
evo Cod pa pogledajte de gresim

Code: Select all

 define OSC 4

TRISB=%00000000   ' Port B je izlazni

mS  Var Word     'Promenljiva za milisekunde
    Sek Var Word     'Promenljiva za sekunde
     	
    TRISB = 0            'PORTB je izlazni
    

Inicijalizacija:

	
	INTCON.5 = 0	   	 'Onemoguci TMR0 prekide
	
	mS = 0		  		 'Brise promenljive za vreme
	Sek = 0		  		 '

	OPTION_REG.0 = 0   	 '010 preskaler postavi u odnos	1:32
	OPTION_REG.1 = 0   		
	OPTION_REG.2 = 1			
	OPTION_REG.3 = 0			

	OPTION_REG.5 = 0	 'Izaberi Interni takt
	OPTION_REG.7 = 1		

	TMR0 = 0	   		'Postavi vrednost TMR0 
	
	INTCON.5 = 1		'Omoguci TMR0 prekide
	INTCON.7 = 1		'Omoguci sve prekide

    ON INTERRUPT goto Int_Sub

Pocetak:

	
	Goto Pocetak
 	
'------Podprogram obrade prekida-----------------------
       Disable
Int_Sub:

    INTCON.7 = 0
    
    low portB.0
	toggle portB.0
	high portB.1
	toggle portB.1
   
     
    INTCON.7 = 1  'Omoguci prekide
    INTCON.5 = 1  'Omoguci prekide

     
    Resume        'Vrati se iz rutine prekida
    End
	
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by pedja089 »

Ovo puno nema smisla.

Code: Select all

    low portB.0  'Iskljuci pin
toggle portB.0 'Promeni stanje na istom tom pinu, znaci odma je 1. Nula je biotaj pin sega nekoliko uS, zavisi od brzine procesora
high portB.1 'ISto vazi i za drugi pin
toggle portB.1
Koliko ja vidim tebi treba sledece:
1. Ulazak u int ukljuci B0
2. Iskljuci B0
3. Ukljuci B1
4. Iskljuci B1
5. Ulazak vrati se na 1
E sad vidi kako ces to napraviti. Ima nekoliko nacina da se to realizuje.
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by milan-markovic »

Danas sam razmisljao na koji nacin da uradim promenu stanja na pinovima i dosao ovu na ideju da u potprogramu ispitujem stanje RB0.

Code: Select all

 define OSC 4

TRISB=%00000000   ' Port B je izlazni
ANSELB=%0000000   ' Port B je digitalni
PortB.0=0
PortB.1=0
   

Inicijalizacija:

	
	INTCON.5 = 0	   	 'Onemoguci TMR0 prekide
	

	OPTION_REG.0=0   	 '100 preskaler postavi u odnos	1:32
	OPTION_REG.1=0   		
	OPTION_REG.2=1			
	OPTION_REG.3=0			
    OPTION_REG.4=0
	OPTION_REG.5=0	 'Izaberi Interni takt
	OPTION_REG.7=1		

	
	INTCON.5=1		'Omoguci TMR0 prekide
	INTCON.7=1		'Omoguci sve prekide

    ON INTERRUPT goto Int_Sub
'------------Glavni program--------------------------
Pocetak:

     
     TMR0=6	   		'Postavi vrednost TMR0 
	
	Goto Pocetak
 	
'------Podprogram obrade prekida-----------------------
       disable
Int_Sub:

    INTCON.7=0
    INTCON.2=0
     
    IF portB.0=1 THEN Tranz
    
    portB.1=0
     pause 2
    portB.0=1
    
    INTCON.7=1  'Omoguci prekide
    INTCON.5=1  'Omoguci prekide

     Resume        'Vrati se iz rutine prekida
Tranz:


     portB.0=0
      pause 2
     portB.1=1
     
     INTCON.7=1
     INTCON.5=1
     
      RESUME
    
    End
	


Sada imam dve poluperiode sa pauzama ali njihovo trajanje ne odgovara frekvenciji 50Hz vec 15Hz (65ms).

Koliko sam ja shvatio interrupt se desava kada dodje do prekoracenje tajmera a ovo je 8-bit tajmer.
Posto ja koristim oscilator 4MHz znaci interrupt ce da se desi svake 256 mikrosekunde.
Ukoliko koristim preskaler 1:32 interrupt ce da se desi na 8192 mikrosekundi.Ja hocu da trajanje jedne poluperiode bude 8ms znaci da pocetna vrednost brojaca mora biti 6 a evo i zasto 6*32=192 pa je vreme prekoracenja 8192-192=8000 mikrosekundi tj. 8ms . Pauza izmedju poluperioda 2ms sto ukupno cela perioda iznosi 20ms (50Hz).
Postavio sam celokupan kod da vidite de gresim i zasto nemam odgovarajuce trajanje poluperioda i primetio sam kada ubacim nesto u glavnom programu da kontroler radi onda mi se javi problem sa sporim prebacivanjem stanja RB0 i RB1.
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by milan-markovic »

Uspeo sam da resim Softversko oscilovanje uz pomoc timer0 interrupta.

evo kako sam to uradio:

Code: Select all

 define OSC 4
 
OSCCON=%01101000
TRISB=%00000000   ' Port B je izlazni
ANSELB=%0000000   ' Port B je digitalni
ms var word
PortB.0=0
PortB.1=0   

	
	INTCON.5 = 0	   	 'Onemoguci TMR0 prekide
	
	ms=0
	
    OPTION_REG = %1000010    '010 preskaler postavi u odnos	1:8
    TMR0=6	   		'Postavi vrednost TMR0
			
	INTCON.5=1		'Omoguci TMR0 prekide
	INTCON.7=1		'Omoguci sve prekide

    ON INTERRUPT goto Int_Sub
'------------Glavni program--------------------------
Pocetak:
      
     
     
    
	
	Goto Pocetak
 	
'------Podprogram obrade prekida-----------------------
       disable
Int_Sub:

    INTCON.7=0
    
   if INTCON.2 AND INTCON.5 THEN
    INTCON.2=0
        ms = ms + 2
        ENDIF
     
      if ms = 6 then    
     PortB.0=0
     ENDIF
     
   if ms = 10 Then
     PortB.1=1
     endif
     
   IF MS = 16 THEN
     PortB.1=0
     endif
     
   if ms = 20 then
     PortB.0=1
     ms = 0
     endif
     
    
    INTCON.7=1  'Omoguci prekide
    INTCON.5=1  'Omoguci prekide

    resume         'Vrati se iz rutine prekida

     End 
	
Ovo ovako radi ali kad ubacim nesto u glavni program (recimo blinkanje led svake sekunde) onda se poremeti oscilovanje i krene da se menjaju stanja na RB0 i RB1 u ritmu led diode (svake sekunde).
Da li je to normalno da se desava kada u glavnom programu ima pauze ili je moja graska.
Mislim da bih interrupt morao da se desi i kada je program u izvrsenje pauze zatecen i da se to obustavi da bih se odradila interrupt rutina i ponovo da se vrati i glavni program na izvrsenje te pauze ali to ovde nije slucaj neznam de sad moze biti greska.

Pozdrav
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by pedja089 »

Taj interupt je malo glupo resen u PBP. Tacnije mnogo glupo...
Generalno taj interupt radi tako sto posle svake pbp kopmande on proveri da li se dogodio interupt. I ako imas komandu koja trajer neko vreme, za to vreme interupt se ne izvrsava.
Zato imas DT_Int, pogledaj na PBP forumu. To je pravi interupt i pic skace na podprogram onog trenutka kada se interupt dogodi.
http://www.picbasic.co.uk/forum/showthread.php?t=3251
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by milan-markovic »

Skinuo sam DT_Int fajl ali nemogu nikako da pronadjem de se nalazi INCLUDE folder da ubacio ovaj fajl u program Files imam folder Mecanique i imam folder PBP3 from melabs ali u nijednom nema folder za Include de ja da ubacim ovo da bih kompajler mogao da pronade.
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by Kukinjos »

Ubaci fileove DT_INTS-14.bas i ReEnterPBP.bas u PBP3 folder.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by milan-markovic »

Ubacio sam raspakovane fajlove u folder PBP ali opet mi se pojavljuje greska kao da nisu pronadjeni
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by pedja089 »

Samo ih stavi u isti folder gde je i tvoj fajl...
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by milan-markovic »

Hvala Pedja uspeo sam i stvarno sam odusevljen kako radi jer uopste nesmetaju duge pauze u glavnom programu interrupt se izvrasava.

E sad me jedino interesuje da li da ostavim ovu kontrolu pinova da se izvrsava u interrupt potprogramu ili da je ubacim u drugi potprogram.
Meni bi najvise odgovaralo da ostane ovako i mislim da ce imati vreme da se zavrsi potprogram za interapte jer se sledeci interrupt desava nakon 2ms a to je bas dugo vreme za kontroler .
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7871
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by pedja089 »

Nisam bas skontao pitanje, ali probaj pa ces videti...
U interuptu ako imas nesto sto ti traje 2ms, onda negde gresis. Tako da ako sam skontao, ostavi ovako kako je i to je to.
User avatar
milan-markovic
Pocetnik na forumu
Pocetnik na forumu
Posts: 34
Joined: 24-05-2014, 10:54
Location: Aleksinac

Re: Softverski PWM 50Hz za Inverter 12vDC-220vAC

Post by milan-markovic »

Nisi dobro razumeo Interrupt se javlja na svake 2ms a u potprogramu za obradu interrupta se nalazi kontrola stanja pinova i u tom potprogramu mislim da ce imati dovoljno vreme da se sve odradi pre nego sto se desi sledeci interrupt.
Post Reply