Bascomban PWM

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
bgergo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2009. március 11. szerda, 6:00

Hozzászólás Szerző: bgergo »

Sziasztok!

Szeretnék jobban megismerkedni a pwm szabályzással.
Írtam egy programot ami használ egy pwm kimenetet és két gombal tudom változtatni az izzó fényerejét. Ez így hibátlanul müxik.

Kód: Egész kijelölése

Config Portb.3 = Output

Config Pinb.0 = Input
Config Pinb.1 = Input


Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8

Dim Sz As Byte

Sz = 255

Do

 Compare1a = Sz

   If Sz = 255 Then Sz = 254
   If Sz = 0 Then Sz = 1


   If Pinb.0 = 0 Then
         Sz = Sz + 1
         Waitms 50

   End If

   If Pinb.1 = 0 Then
      Sz = Sz - 1
      Waitms 50

   End If

Loop

End
A kérdéseim a következők:
Meg lehet e írni ezt a programot egyszerűbben?
Mit jelent a "pwm = 8" és a "Compare A Pwm = Clear Up" ?

Előre is köszönöm a segítséget!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Kissé káosz a program....

Nem compare1a, hanem pwm1a.
Ugyanazt jelenti, DE:
Compare az összehasonlítás, mérés során használandó, a PWM pedig kitöltési tényező állítást takarja.


Tessék a súgót is nézni néha :twisted: !
PWM=8 : 8bites PWM-t csinálsz (0...255)
Compare c-ű részt a processzor adatlapja írja le jól, az a könyvben is egy külön fejezet lenne:). Röviden: 0...X-ig legyen aktív magas, vagy X...255-ig, amikor a PWM számlálója fut?
Avatar
bgergo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2009. március 11. szerda, 6:00

Hozzászólás Szerző: bgergo »

Persze, hogy káosz két nap alatt ennyit tudtam megtanulni.

Nézem a súgót is csak nem mindíg értem.
És hogy lehet megadni minimális és maximális kitöltési tényezőt, csak a változó értékével vagy van rá valami más megoldás is?

A változóknál is ugyan az a gondom, hogy ne csorduljon túl ezért szorítottam 1 és 254 közé.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

???

A változó nem csordul túl. A PWM1a (8 bites esetben) 0...255 lehet, 9 bitesben 0...511, 10 bitesben 0...1023.

De a 8 bitesre amint Sz as Byteként definiáltad, máris nem tud túlcsordulni!
De a 255 miért nem jó érték? Miért kell 254 helyette? Ekkor ha hangkártya-oszcilloszkóppal megnézed, látiod hogy mindig van egy visszaréntás benne (1/255-nyi időre).

Túlcsorduláskor (ha pl. Wordként definiálod), akkor az alsó byte-ja kerül figyelembe vételre.... Azza 255+1-> 256 (1 HByte+0 LByte Wordként bontva)
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

itt a pwm-ed!

szabályozhatod gombal fel és le is. Illetve nem engedi 250 feölés vagy 2 alá a pwm-et.

Én motort szabályzok vele de fényerőhöz is használtam már hőmérséklet fügvényében.

Ha valamit nem értesz csak írj nyugodtan.

Clear Down = alsó pwm
Clear Up = Felső pwm

mekkor frekin akarod zavarni a dolgot?

Kód: Egész kijelölése


$regfile = "M16def.dat"                                     ' we use the M16
$crystal = 16000000                                         '-es kvarcot alkalmazunk, X1 lábon trimmer kondival a pontos órajel beállítása miatt.


Rem Konfiguráljuk a portokat
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 1       ' pwm
Config Pind.5 = Output                                      ' pwm kimenet



Rem Nyomógombok
Fgomb Alias Pinb.6                                          ' fel állítása
Lgomb Alias Pinb.5                                          ' le állítása



Rem Változók deklarálása
Dim B As Byte

Rem a pwm felpörgetés 0% - 100%
For B = 0 To 250 Step 1
Pwm1a = B
Waitms 10
Next B


Rem vissza pörgés 20% ig
For B = 250 To 80 Step -1
Pwm1a = B
Waitms 10
Next B


Do

If Fgomb = 0 Then B = B + 1

Waitms 10

If Lgomb = 0 Then B = B - 1


Pwm1a = B

' korlátozás a túlcsordiláűs ellen ------------------------------
If Pwm1a <= 1 Then Pwm1a = 2                                ' lefele nem engedi csak 2 ig max

If Pwm1a >= 251 Then Pwm1a = 250                            ' felfele nem engedi csak 250 ig max



Loop


End
Avatar
bgergo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2009. március 11. szerda, 6:00

Hozzászólás Szerző: bgergo »

Köszi!
A frekit már ki tudom számolni, most legalább megértettem a For - Next parancsot is. Ha a változó pl.: 255 és ahhoz adok egyet akkor az 0 lesz, ha ebből kivonok egyet akkor 255 vagy rosszul gondolom?
Így viszont nem tudom a Pwm1a értékét 0-ra vagy 255-re állítani, ami a valóságban nem is számít csak most a tanulás kedvéért kérdezem.
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

ha byte-ban vagy akkor 255 után túlcsordul és 0 lessz.
a pwm pedig byte-ban kell legyen a 8 bites ugyebár. A pwm freki számolására van egy pwmcalc nemű kis progi a file cserebere alatt fel van töltve ha minden igaz.

amit én adtam neked azzal ha külső 16mhz-es kvarcot használsz akkor a pwm 31250 hz lessz kifele.

a végén azért van ott az az if igen hogy ne tudd nyomógombbal túl szabályozni vagy alul.

a for ciklus az elején pedig tesz képpen van bele téve először felnyomja majd vissza szabályozza a kakaót.

Tapasztalataim alapján nem szertik a cuccok ha 20% alatt van a pwm és ha 250 fölé engeded a 99%-os kitöltési tényezőt már nem igazán szerették.

De a lámpa vezérlésre nagyon jó a cucc megfelelő hardverrel.

Mi már csináltunk több ilyesmit. 2* 500w -os infra lámpákhoz pl.
A hozzászólást 1 alkalommal szerkesztették, utoljára szovhoz 2009. március 23. hétfő, 11:10-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Rosszul....

A Byte esetén igaz amit írsz. Bináris összeadást nézd meg:

Kód: Egész kijelölése

  &B11111111 (255)
+ &B00000001 (1)
----------------------
&B1.00000000 (256!)
És minthogy az "alsó" 8 bit számít, így lesz 0!
De: 0-1= 255!

De Word esetén:0-1 = 65535 és 65535+1 = 0 !

És Így Tovább...

A For-Nextnek az értékekhez nem sok köze van...
Érdemes megkeresni régi QBasic könyvet illetve a TVBasic (1986 :) ) kiadványokat. Ezekben az alapok nagyon jól benne vannak...
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

jah és egy kis módosítás a programban csak hogy kevesebb helyet foglaljon.



e helyett

Kód: Egész kijelölése

If Fgomb = 0 Then Incr B

Waitms 10

If Lgomb = 0 Then Decr B


Pwm1a = B 
ezt használd

Kód: Egész kijelölése

If Fgomb = 0 Then B = B + 1

Waitms 10

If Lgomb = 0 Then B = B - 1


Pwm1a = B 
Avatar
bgergo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2009. március 11. szerda, 6:00

Hozzászólás Szerző: bgergo »

Igen köszi, bytra gondoltam!

Mostmár kezdenek eszembe jutni a Basic parancsok.
Avatar
bgergo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2009. március 11. szerda, 6:00

Hozzászólás Szerző: bgergo »

Sziasztok!
Megint elakadtam!

Feszültséggel szerentném a pwm-t szabályozni de sehogyse boldogulok, mert az adc 10 bites eredményt ad , a pwmnek meg csak 8 bites kell és ezért mindíg tulcsordul a pwm. Lehet e a 10 bites eredményt 8 bitre konvertálni?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Esetleg igy:

Kód: Egész kijelölése

Dim W As Word , Channel As Byte , B As Byte
Channel = 0
'now read A/D value from channel 0
Do

W = Getadc(channel)

Print "Channel " ; Channel ; " value " ; W
 W = W / 4                                                  'Osztod
    Shift W , RIGHT , 2                                      'Vagy Eltolod jobbra 2-vel
 B = W                                                      'Autómatikus konverzió
Print "Channel/4 " ; Channel ; " Byte: " ; B

Loop
End
:?:
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

Hozzászólás Szerző: herc1234 »

dim ADC_beolvas As word at $60 'nem tudom milyen chipről beszélünk
dim pwm_ertek as byte at $61 overlay 'ez megint csak változó dolog a
lényeg az overlap a változók egymásra dimenzionálása..
és akkor..
ADC_beolvas = getadc(channel)
print pwm_ertek ' az adc_beolvas word alját kapod byteban
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

Hozzászólás Szerző: szovhoz »

megoldható én pwm-es infra szabályzót csináltam hőmérséklet függvényében.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Túlbonyolítjátok:


DIM ADCvege as word '0...1024
dim PWMbe as byte'0...255

pwmbe=adcvege/4 ' :P


Az Overlay nem erre való! Pláne nem ilyen esetkben.... Ezzel csak sok-sok fejreállás lehet!


Herc1234:
ez nem jo, mert igy ugyanazt kapom:
255, 555, 1025 es 2047 eseten is.... :)
Válasz küldése