08M2 + 2x "jakoPWM" výstupy

Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od Pepa z depa »

Zatím díky za odpovědi. Ale určo se ještě někde zaseknu na programu :?
Jo a ty fety jsou RFP40N10, tak snad budou OK.
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od Pepa z depa »

Tak jsem se nesplet a jsem zaseklej :cry:
Smetí okolo N fetu jsem upravil podle předchozích rad, ale zjistil jsem, že ty velký skoky v intenzitě svitu jsou programem... a netuším proč.
Mám tady kus programu, má dělat postupný rozsvícení/zhasínání pásku. Pokud použiju postupně změnu pwmduty(podprogram SV), tak je to v cajku. Pokud ale použiju pwmduty ve smyčce do loop(podprogram VS), tak ty skoky jsou děsně velký. Netušíte někdo čím to je?

Kód: Vybrat vše

#picaxe 08M2
#no_data
' PICAXE 08M2 schodiste09
' 30.6.2015


init:

setfreq m4 ; nastaveni vnitrniho oscilatoru na xxMHz
	
	low C.2
	pause 200
	symbol tlV  = pinC.4  'tlacitko set
	symbol tlS  = pinC.3   'tlacitko on
	symbol vystupS = C.2      'vystup pwm
	symbol cas    = w0
	
	
	
smycka:
		pause 50
	if    tlV=0 then
		pause 50
		gosub VS   'skok na podprogram SV
		pause 50
	elseif tlS=0 then
		pause 50
		gosub SV  'skok na podprogram VS
		pause 50
	endif goto smycka
	
		
		
		
SV:		
	pwmout C.2,150,0 ; start pwm  
	pwmduty C.2,40  ; změna pwm plnění   
	pause 1000  ; pauza 1 s     
	pwmduty C.2,45  ; změna pwm plnění   
	pause 1000  ; pauza 1 s      
	pwmduty C.2,50 ; změna pwm plnění   
	pause 1000  ; pauza 1 s      
	pwmduty C.2,55  ; změna pwm plnění   
	pause 1000  ; pauza 1 s       
	pwmduty C.2,60  ; změna pwm plnění   
	pause 1000  ; pauza 1 s       
	pwmduty C.2,65  ; změna pwm plnění   
	pause 1000  ; pauza 1 s       
	pwmduty C.2,70  ; změna pwm plnění   
	pause 1000  ; pauza 1 s 
	pwmout C.2,off
	return
			
VS:	
	let w0 = 2   ; nastaveni pocatecni hodnoty do w0
	pwmout C.2,w0,0 ; start pwm 
	do    ; zacatek do loop cyklu 
		pwmduty C.2,w0  ; změna pwm plnění
		pause 1000   ; pauza 1s 
		inc w0   ; zvyseni hodnoty v w0 o +1 
    	loop while w0 < 5  ; opakovani cyklu do loop
		pause 1000 
      	dec w0 
	do    ; zacatek do loop cyklu 
		pwmduty C.2,w0  ; změna pwm plnění 
		pause 1000   ; pauza 1s 
		dec w0   ; snizeni hodnoty w0 o +1 
      loop while w0  >  1; opakovani cyklu do loop
		pause 1000
		pwmout C.2,off
		let w0 = 0
		return
		
		
		end
		
	
		
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od AlesH »

Řekl bych, že hlavní problém bude v tom, že v podprogramu VS nastavuješ nevhodnou PWM periodu (pomocí "pwmout C.2,w0,0" kde to w0 je na pozici "periody" a přitom má v tu chvíli hodnotu jen 2). Asi by pomohlo místo toho příkazu dát do VS "pwmout C.2,150,0" (jako na začátku podprogramu SV) a pak i nastavovat w0 na obdobné hodnoty (jako v SV) při změnách pomocí "pwmduty C.2,w0" (tedy w0 v rozsahu 40 až 70 ve skocích po 5).
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od Pepa z depa »

JJ je to přesně tak, jak říkáš. Díky za nakopnutí
micer
Příspěvky: 180
Registrován: 12 čer 2014, 19:14

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od micer »

Podstatná otázka: Jak dlouhý má být ten pásek LED respektive kolik bere proudu? Ten tranzistor RFP40N10 je totiž pro tyto účely dost nevhodný, je to tranzistor na poměrně vysoké napětí (V(DSS) = V(DGR) = 100 V), a s dost velkým odporem v sepnutém stavu (0,040 ohm, ovšem při buzení 10V!!), je to třída S, ne třída L! Pro srovnání třeba IRL2203N má V(DSS) 30V, ale odpor v sepnutém stavu 0,007 ohm při 10 V, ovšem při 4,5 V pořád ještě 0,010 ohm. Přikládám tu podstatnou charakteristiku .
RFP40N10
RFP40N10
Pokud bude těch LED málo (do odběru asi tak 4 A), ono to chodit bude, ale pak nechápu, proč tam dávat 40 A tranzistor na 100 V a s odporem, který bude zbytečně topit. Při větším počtu LED začne ten tranzistor pracovat ne jako spínač ale jako klasický FET zdroj proudu, omezí svítivost a bude hodně, hodně hřát. To asi není požadovaným cílem.
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od Pepa z depa »

Já vím, že tenhle fet není zrovna ideální na tuhle aplikaci. Chápej to tak, že jsem jich z něčeho kdysi vybagroval asi třicet... a "na skladě" zrovna jinej nemám :?
Ten pás žere max 1A. Zkoušel jsem v různejch režimech, jak moc se ten fet hřeje a zjistil jsem, že je to OK. Ale samozřejmě děkuju za upozornění.
micer
Příspěvky: 180
Registrován: 12 čer 2014, 19:14

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od micer »

OK, pokud mají LED spotřebu 1 A, nebude to problém, naopak to chránění transilem je potom zbytečné, protože 100 V špičky tam nebudou. Já naopak podle volby tranzistoru odhadoval, že záměrem je spínat LED s odběrem asi tak 20 A, to by problém byl.
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od Pepa z depa »

Jsem asi měl napsat hned z kraje, že ten tranzistor není volba, ale nouze ;)
Pepa z depa
Příspěvky: 85
Registrován: 02 úno 2014, 02:12

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od Pepa z depa »

Tak jsem program zprovoznil a funguje. Akorát bych se chtěl znalejších zeptat: někde jsem četl, že kolik je GOSUBů, tolik má bejt RETURNů. A to tam rozhodně nemám. Trochu jsem změnil spínací algoritmus...
tlON - jsou dvě paralelní tlačítka (nad a pod schodama), pokud jedno z nich zmačknu a pustím, rozsvítí se LED na nastavenej čas v nastavený intenzitě. Pokud v tomto čase znova zmačknu tlON, LEDky zhasnou . tlSET - tlačítko na krabici s elektronikou (není až tak volně přístupný) -pokud ho zmačknu po dobu svícení, nastaví hodnotu svitu a času ( cca 5 minut silný svit). Pokud tlSET zmačknu a držím v "klidovym stavu", tak se ledky začnou postupně rozsvicet víc, pokud chci "zrovna tuhle" intenzitu, tak tlSET ve správný chvíli pustím. Program nastaví intenzitu a přejde do nastavení času. To se indikuje krátkými BLIKy ledek (1 až 5x - 1= minimální čas, 5=max). Po zmačknutí tlSET (zase ve správnym čase) nastaví proměnné a pak už "jede" podle nich. A právě ty BLIKy volám GOSUBem a nevím, jestli to nebude dělat nějakej bofdel. Snad jsem to popsal trochu srozumitelně... ;)Ono tam těch fcí je trochu víc, ale základ je tenhle. Díky všem, za připomínky

Kód: Vybrat vše

#picaxe 08M2
#no_data
' PICAXE 08M2 schodistak PWM v.1201
' piny C.3 a C.4 - pullup odpory = tlacitka v klidu "1"
' 6.7.2015

init:
		pwmout C.2,off 
		pause 200
		symbol tlON     = pinC.4  'tlacitko ON
		symbol tlSET    = pinC.3   'tlacitko set
		symbol vystupS  = C.2      'vystup pwm
		symbol svit	    = w0
		symbol cas      = w1
		symbol pom      = w3
		symbol pom1      = w4
		
		let w0 = 60   ; nastaveni hodnoty svitu po zapnuti
		let w1 = 345  ; nastaveni hodnoty casu po zapnuti
		pause 200
		goto smycka
		
		
		
smycka0:
	do
		pause 20
		pwmout C.2,off 
		
		pause 50		
		if tlSET = 1 then exit ; cekani na konec stisku tl set
		pause 50
	loop 
		pause 20
			
smycka:

 		pause 50
		
	if tlON=0 then 
		pause 50
		goto zap   'skok na podprogram zap
		pause 50
		
	elseif tlSET=0 then 
		pause 50
		goto nastav  'skok na podprogram nastav
		pause 50
		
	endif goto smycka
		
				
				
				
				

				
zap:	
	do
		pause 50		
		if tlON = 1 then exit ; cekani na konec stisku tl ON
		
		pause 50
	loop 
		pause 20
		
		let w3 = w0   ; nacteni hodnoty svitu do w3
		
		pause 20
		
		let w4 = w1  ; nacteni hodnoty casu do w4
		
				
		pause 20
		
	
		pause 20				
		pwmout C.2,250,w0 ; start pwm 
	
	do    		; zacatek do loop cyklu 
		pause 50
		if tlON = 0 then goto vyp	
		pause 50
		if tlSET = 0 then gosub zapmax
		pause 50
		
			
		
		dec w1   	; snizeni hodnoty w1 o -1 
	loop while w1  > 0; opakovani cyklu do loop
		pause 20
		
	do    		; zacatek do loop cyklu 
		pause 50	
		pwmduty C.2,w0  ; zmena pwm plneni
		pause 50
		if tlON = 0 then goto vyp 
		pause 50   
		dec w0   	; snizeni hodnoty w0 o -1 
	loop while w0  >  20; opakovani cyklu do loop
		pause 50
	
vyp:
		pause 20
		
		pwmout C.2,off 
		
		pause 50
		
		
		
		let w0 = w3   ; nacteni hodnoty svitu do w3
		
		pause 20
		
		let w1 = w4  ; nacteni hodnoty casu do w4		
				
		pause 20		
	 	
		
		goto smycka
		
		
nastav:	
		pause 1000
		pause 20
		
		pwmout C.2,250,40 ; start pwm	
		pause 20	
		let w0=40
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		pwmduty C.2,60 ; start pwm	
		pause 20	
		let w0=60
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		pwmduty C.2,80 ; start pwm	
		pause 20	
		let w0=80
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		pwmduty C.2,100 ; start pwm	
		pause 20	
		let w0=100
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		pwmduty C.2,120 ; start pwm	
		pause 20	
		let w0=120
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		pwmduty C.2,140 ; start pwm	
		pause 20	
		let w0=140
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		
		pwmduty C.2,160 ; start pwm	
		pause 20	
		let w0=160
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		
		pwmduty C.2,180 ; start pwm	
		pause 20	
		let w0=180
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		
		pwmduty C.2,200 ; start pwm	
		pause 20	
		let w0=200
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		
		pwmduty C.2,250 ; start pwm	
		pause 20	
		let w0=250
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		
		
		pwmduty C.2,300 ; start pwm	
		pause 20	
		let w0=300
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
		
		pwmduty C.2,500 ; start pwm	
		pause 20	
		let w0=500
		pause 1000
		if tlSET = 1 then goto nastavcas
		
		pause 20
			
		pwmduty C.2,1000 ; start pwm	
		pause 20	
		let w0=1000
		pause 1000
		if tlSET = 1 then goto nastavcas
				
		pause 1000
		
		
		
nastavcas:	
		pause 20
		pwmout C.2,OFF
		
		pause 1000
		let w1=75 ;
		pause 20
		gosub blik
		pause 1000
		
		if tlSET = 0 then goto smycka0
		pause 50
		
		
		
		let w1=180
		pause 20
		let w6=2
		pause 20
	do    		; zacatek do loop cyklu 
		pause 10
		gosub blik	
		pause 10	
		dec w6   	; snizeni hodnoty w6 o -1 
		pause 10
	loop while w6  > 0; opakovani cyklu do loop
		pause 1000
		if tlSET = 0 then goto smycka0
		pause 50
		
		
		
	
		let w1=345
		pause 20
		let w6=3
		pause 20
	do    		; zacatek do loop cyklu 
		pause 10
		gosub blik	
		pause 10	
		dec w6   	; snizeni hodnoty w6 o -1 
		pause 10
	loop while w6  > 0; opakovani cyklu do loop
		pause 1000
		if tlSET = 0 then goto smycka0
		pause 50
		
	
		let w1=480
		pause 20
		let w6=4
		pause 20
	do    		; zacatek do loop cyklu 
		pause 10
		gosub blik	
		pause 10	
		dec w6   	; snizeni hodnoty w6 o -1 
		pause 10
	loop while w6  > 0; opakovani cyklu do loop
		pause 1000
		if tlSET = 0 then goto smycka0
		pause 50
		
		let w1=700
		pause 20
		let w6=5
		pause 20
	do    		; zacatek do loop cyklu 
		pause 10
		gosub blik	
		pause 10	
		dec w6   	; snizeni hodnoty w6 o -1 
		pause 10
	loop while w6  > 0; opakovani cyklu do loop
		pause 1000
		if tlSET = 0 then goto smycka0
		pause 50
		
		let w0 = 60   ; nastaveni hodnoty svitu po probehnuti nastaveni
		pause 20
		let w1 = 250  ; nastaveni hodnoty casu po probehnuti nastaveni
		pause 20
		
		pwmout C.2,off 
		pause 20
		
		goto smycka				
			
	blik:
		pause 50
		pwmout C.2,250,80; start pwm 
		pause 60
		pwmout C.2,off 
		pause 150
		return
	
	zapmax:
		pause 20
	do
		pause 50		
		if tlSET = 1 then exit ; cekani na konec stisku tl ON
		
		pause 50
	loop 
		pause 20
			
	 	let w0=1000   ; nacteni hodnoty svitu 
		
		pause 20
		
		let w1 =1000 ; nacteni hodnoty casu
		
		pause 20
						
		pwmout C.2,250,w0 ; start pwm 		
				
		pause 20			
						
		return
							
		end
		
	
		
Uživatelský avatar
gilhad
Příspěvky: 262
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: 08M2 + 2x "jakoPWM" výstupy

Příspěvek od gilhad »

Pepa z depa píše: Akorát bych se chtěl znalejších zeptat: někde jsem četl, že kolik je GOSUBů, tolik má bejt RETURNů. A to tam rozhodně nemám.
Tak tohle je hrubá dezinformace :)
Ve skutečnosti je to tak, že každý GOSUB - v okamžiku, kdy se provede - uloží na zásobník svojí adresu a skočí někam (jako GOTO) a každý RETURN - v okamžiku kdy se provede - ze zásobníku vyzvedne adresu a skočí na ní (jako GOTO), čímž se vrátí tam, odkud byl přez GOSUB zavolaný.

A zásobník má jen omezenou velikost, takže by se v něm neměly věci hromadit (a podčerpání je taky špatně), takže když program prochází kódem, takk by měl potkat tolik RETURN, kolik potkal GOSUB, aby se zásobník udržoval na stejné úrovni.

Naopak je naprosto běžné, že v kódu (=textu) programu je mnohem víc řetězců 'GOSUB', než řetězců 'RETURN' a proto taky GOSUB byl vymyšlen - na volání opakujícího se kusu kódu z různých míst. A funkce/procedury/podprogramy s více vstupními body také nejsou nic neobvyklého (i když je některé jazyku neumožňují/nepodporují).

Následující je naprosto legální (ač neelegantní) kód

Kód: Vybrat vše

loop:
    GOSUB blik1
    GOSUB blik2
    GOSUB blik3

    GOSUB blik1
    GOSUB blik2
    GOSUB blik3
   
    GOTO loop

blik3:
      pause 30
      pwmout C.2,250,80; start pwm
      pause 30
      pwmout C.2,off
blik2:
      pause 20
      pwmout C.2,250,80; start pwm
      pause 20
      pwmout C.2,off
blik1:
      pause 10
      pwmout C.2,250,80; start pwm
      pause 10
      pwmout C.2,off
      RETURN
Odpovědět