PWM vezérlés RS485 buszon át

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Robival beszéltem ő azt javasolta hogy a T1 lábon a timer1 ben számoljam és csak kiolvasom ha kíváncsi vagyok rá. Ez tetszett és egyszerűnek is hangzott, de a T1 lábra nem tudom kötni csak az int0-ra. Kérdés: Ezt is tudom ugyan úgy használni mint a T1 hogy a háttérben ketyeg a timer és számolja az impulzusokat?
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

Ne impulzusokat számolj, hanem periódusidőt mérj. Ha impulzusokat számolsz, akkor az INT0-ra kell egy SW számlálót csinálnod és kell egy másik időzítő (mennyi ideig számolod ugye). Belül pereg a T1 (mondjuk, de elég a T0 8-bites is szerintem) és ahogy leírtam, kiveszed a CT értéket majd nullázod. Minél kisebb értéket kapsz, annál nagyobb a freki. csak be kell lőni előosztóval a kívánt legoptimálisabb lépéssebességet.
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Magyarul el tudnád magyarázni ? :)
Nem sokat értek ebből még sosem használtam timert, countert, pwm-et.
Egyszer próbáltam de nem sikerült a modell vasúthoz pwm et csinálni.
Mivel a timer1-et használja a PWM, gondolom timer0 -ra kéne állítani az int0t. Periódus idő alatt a két jelzés közt eltelt időt érted?
Ahhoz a timer0-at így kellene configolni? :

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

Config Timer0 = Timer , Prescale = 1
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

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

Config Timer0 = Timer , Prescale = 1024
On Timer0 T0_int
Enable Timer0

Config Int0 = Falling                             'Ford. érz.
On Int0 Bejovo
Enable Int0
Enable Interrupts

'PROGRAM
'xxxxxxxxxxxxxxxxxxx

Bejovo:
Periodus = Timer0
Timer0 = 0
Allunk = 0
Return

T0_int:                                           'Nem jött sokáig impulzus, átfordult
Allunk = 1
Return
Az "allunk" 1-be megy, ha jóideig nem jött impulzus, ezt is illik lekezelni, nehogy megszoruljon pl. A T0-t meg beállítod olyan frekire, ami a legjobb felbontást adja túlcsordulás nélkül. Ha nagyobb érzékelési tartomány kell, akkor T0-INTben SW számlálót teszel, mondjuk word-öt, az sokáig elég (inkább nagyon alacsony fordulatszámnál van jelentősége). A "Periodus"-ban lesz az INT-kor bejött Timer értéke, ciklikusan frissül minden INT0-nál.
Remélem működik, nem teszteltem :)
JAni
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

És akkor ez most a ami a "periodus"ban van ez a az az idő ami két fordulat közt telt el? Akkor úgy kapom meg ebből a fordulatot számot hogy az 1 percet elosztom és ahány egésszer meg van benne annyit fordul percenként? Ez a szám amit a timer0 vissza ad ez ms vagy milyen mértékben számol? remélem nem órajel mert akkor az életben ki nem számolom..:S.
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

Órajelfüggő. Mondjuk 8MHz-ről /1024 prescale az 7812Hz, /256=>1/30-ad Hz-el csordul túl. 1/7812=>128usec pontosan tudsz mérni. Aránylag lassú jelnél ajánlott a SW-es számláló alkalmazása vagy 16-bites Timert használsz. Ha nem akarod kiíratni a ford/perc értéket, akkor belül nem kötelező átszámolni, olyan számokkal számolsz, ami kézreesik. A túlcsordulás INTre betehetsz még egy számlálót, ami számolja a túlcsordulásokat és ha az elér mondjuk 100-at, akkor biztosan megszorult a cucc vagy nem indult el. Ez azért javallott, mert pl. indulásnál általában nagyobb periódusidőket mérünk, míg fel nem pörög a cucc.
JAni
Ja, 2009-es versenyben volt 12V-os motorford. szab., abból kiollózhatod. Ott van indítási várakozás, SW számláló stb.
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

A leglassabb órajel kb 500-800 rpm a legmagasabb 3100 kb. 8 bites a timerem ha jól tudom atmega 8 timer0.
Megnéztem már párszor azt a kódot de úgylátom hogy te ott % ban számolsz, nekem rpm ben kellene elküldenem.
Az a 128usec a lekérdezés időköze, hogy olyan sűrűn nézegeti a timer a lábát hogy hogy áll?
Csak azt nem értem hogy abból hogy kapok furdulatszám jelet?
Vagy az 1 percet osszam 128 usec el és szorozzam be a periodus, értékkel?
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

Az 500rpm=>8Hz. Itt látszik már, hogy ilyen frekin a 8bites timer kicsi lesz, bővíteni kell SW úton 16-bitesre (30Hz-enként már át is fordul). 8Hz-nél kb 1000-es Ct értéked lesz (7812/8). 1 értéked 128usec. f=1/T
A fordulatszámod Hz-ben: f=1/ ertek*0.000128
rpm=60*f
A legjobb, ha csinálsz egy 16-bites SW számlálót (kibővíted +8 bitre a T0-t pl. asszem ilyen megoldás van az említett ford. szab.-ban), ezt kiírator a kijelzőre és látod a legkisebb/legnagyobb értéked, hogy bele fér-e a számábrázolába és elég pontos-e.
Az, hogy %-ban számoltam, az a kezelői felület miatt volt, arányszámmal szorozgatva lett %, de ott van a pontos időérték is a Periodus változóban.
A servo vezérlő versenymelóban is van fordulatszámmérés, azok a beállítások biztos jók.
JAni
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

ja, a 128usec az az órajelből osztott léptetőfreki, ami a számlálót folyamatosan lépteti. Ha az alkalmazott uC-ben van 2048-as előosztó is, akkor az is alkalmazható, akkor lassabban lépteti, lehet, bele is férsz a 8 bitbe. Csak akkor a felbontásod fele lesz (256usec).
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Úgy látom neked lehetett 2048 at beállítani de nekem 1024 a padlás a timer0 és a timer1 ben is.

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

Config Timer1 = Timer , Prescale = 2048                     'Idő mintavétel 16Hz-4kHz
Stop Timer1
On Timer1 Tim1                                              'Timer1 megszakitas
Enable Timer1
De ebben nem találom hogy hogy lehetne sw ből bővíteni. Igazából nem is tudom mit keressek.

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

Enable Ovf0                                                 'Csak 1 impulzus legyen a PWM kimeneten
On Ovf0 Tim0
Ez lenne talán?
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

Csináld teljesen SW-ből:
config timer0=timer, prescale=64
on timer0 idovan
enable timer0

Config int0=falling
on int0 impulzus
enable int0

dim periodus as word
dim szamlalo as word

'....program


impulzus:
periodus=szamlalo
szamlalo=0
return

idovan:
incr szamlalo
return

Valahogy így. Itt a Timer0 ad egy periódikus megszakírtást, amire a szamlaló lép. Ha jött INT0, akkor az kiolvassa ennek a szamlalo-nak az értékét és nullázza.
Hogy milyen sebességgel fog menni a szamlalo, az függ az órajeltől és a prescale értékétől.
8MHz/64/256/=> 2msec
Ezt be kell lőni igény szerint
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Megpróbáltam amit írtál, kiprinteltem a periodust és az érték a terminálban 0 1 5 3 4 8 értékek jönnek random.
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

akkor lehet nagy a sebességed, csökkentsd a prescale-t. De print közben is jöhet ám INT0 sőt a Print konvertálás alatt is.
Próbáld ki így:
atmeneti_word=periodus
print atmeneti_word
goto eleje
JAni
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Hát amit próbáltam állandó venti fordulat (+- 5% talán)mellett:

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

config timer0 = timer , prescale = 8
on timer0 idovan
enable timer0
Config int0=falling
on int0 impulzus
enable int0
enable interrupts

dim periodus as word
dim szamlalo as word 
dim atmenet as word

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

main:
do
wait 1
disable int0
atmenet = periodus
portd.3 = 1    'rs485 dir
print atmenet
portd.3 = 0
enable int0
loop

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

impulzus:
periodus= szamlalo
szamlalo = 0
return

idovan:
incr szamlalo
return
És az eredmény prescale = 8 :
Kép
És az eredmény prescale = 1 :
Kép
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

A sorosporti adatküldés is idő!
9600 bps esetén 1 karakter 1 msec!
Válasz küldése