08M2 + 2x "jakoPWM" výstupy
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 08M2 + 2x "jakoPWM" výstupy
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.
Jo a ty fety jsou RFP40N10, tak snad budou OK.
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 08M2 + 2x "jakoPWM" výstupy
Tak jsem se nesplet a jsem zaseklej
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?
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
Re: 08M2 + 2x "jakoPWM" výstupy
Ř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).
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 08M2 + 2x "jakoPWM" výstupy
JJ je to přesně tak, jak říkáš. Díky za nakopnutí
Re: 08M2 + 2x "jakoPWM" výstupy
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 .
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.-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 08M2 + 2x "jakoPWM" výstupy
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í.
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í.
Re: 08M2 + 2x "jakoPWM" výstupy
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.
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 08M2 + 2x "jakoPWM" výstupy
Jsem asi měl napsat hned z kraje, že ten tranzistor není volba, ale nouze
-
- Příspěvky: 85
- Registrován: 02 úno 2014, 02:12
Re: 08M2 + 2x "jakoPWM" výstupy
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
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
Re: 08M2 + 2x "jakoPWM" výstupy
Tak tohle je hrubá dezinformacePepa 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.
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