PWM vezérlés RS485 buszon át
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?
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.
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? :
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
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
Remélem működik, nem teszteltem
JAni
É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.
Ó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.
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.
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?
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?
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
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
Úgy látom neked lehetett 2048 at beállítani de nekem 1024 a padlás a timer0 és a timer1 ben is.
De ebben nem találom hogy hogy lehetne sw ből bővíteni. Igazából nem is tudom mit keressek.
Ez lenne talán?
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
Kód: Egész kijelölése
Enable Ovf0 'Csak 1 impulzus legyen a PWM kimeneten
On Ovf0 Tim0
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
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
Hát amit próbáltam állandó venti fordulat (+- 5% talán)mellett:
És az eredmény prescale = 8 :
És az eredmény prescale = 1 :
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 = 1 :