Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
Lehet hogy csak én nem tudok számolni de valami nem stimm azzal amit megírtam .
A counter tárolja hogy két jel között mennyi idő telt el. Azt nem úgy kellene számolni hogy: 1Mhz AVR frekvenciánál, 1/8-as Timerrel: Counter*1,5040mSec -nek kellene lennie az eltelt időnek? Mert valahogy nem jó. 500Hz-s jelnél a Counter:2000 értéket kap.
Ha a mérés ideje alatt körbefordul akkor olyan pontos lesz, amilyen pontosan méred az időt!
Ha azalatt nem fut körbe akkor még programozni kell vele egy keveset...
Ez a baj hogy szerintem a programban van valahol a hiba, a gond hogy nem találom hol. Azért tettem fel a kódot hátha valaki élből kiszúrja .
Én valahogy így csinálnám... (ahogy már modta Ricsi89)
Persze kezelni kell még a timer tulcsordulását is, ami szintén nem nagy dolog, egy timer overflow megszakítással számolod, hogy hányszor fordult körbe, az előző megszakítás óta. Csak majd azt is nullázni kell minden megszakításnál.
Ezt nemigazán tudom éretelmezni mire írtad.
Megszakítás lábra van kötve a bejövő jel. A kódomba látni hogy az első bejövő jelre elindítom a TIMER-t, a második bejövő jelre leállítom a TIMER-t. Timer pedig megvan az hogy a két jel között hány Timer-idő telt el. De utána vannak gondok az átváltással. Tudtom szerint 1Mhz-es Órajel esetén a 1 Timer értéke=0.2560 mSec (1/8-as időosztásnál). De hiába számolok ebből frekvenciát nem azt kapom ami a bejövő jel frekvenciája.
A timert nem kell elindítani és leállítani, hanem folyamatosan fusson. Amikor jön a jel, hogy fordult egyet a kerék, akkor jön az INT1... ekkor megnézed mennyi idő telt el az előző megszakítás óta, és ebből ki tudod számolni a sebességet.
Írjak példát?
1MHz/8 = 125kHz, ennek egyetlen lépése mióta 0.2560mSec??? Nem inkább 0.008mSec?
De elmondom én hogy mi az a 0.2560mSec, ez akkor lenne ha 512 lenne az előosztó - ami nincs! Szívesen leírnám - sokadszorra - az input capture-t, de én úgy látom hogy amíg az alapdolgokkal nem vagy tisztába addig teljesen felesleges, elriasztani meg nem akarlak az AVR-ek csodálatos világától. Időmérésre a legegyszerűbb ha valamelyik INT lábat figyeled. Az egyik felfutó élen indítasz, a következőn pedig leállítod a mérést. A Timer inkább fusson folyamatosan, neked így jóval egyszerűbb lesz. Csak arra figyelj hogy indítás előtt mibdig nullázd, és a túlcsordulásfigyelőt is(lásd lentebb). Az már magánügy hogy milyen osztót használsz, ha 1/8 akkor 8us lesz egy lépés, és ~0.5 másodperc alatt ér körbe a számlálód - azaz túlcsordul. A túlcsordulásra is tehetsz interruptot amiben egy másik volatile változót növelsz, így szélesebb időtartományt fogsz lefedni vele.
Szerintem felesleges leállítani a timer-t, mert úgy is tudsz vele számolni ha fut, és utána meg megint csak el kéne indítani.
Nos, a következők az észrevételeim:
Nem látjuk a következő deklarációkat: timer count A TCCR1A -t miért piszkálod? Egyáltalán milyen szenzor van bekötve? Nem lehet, hogy egy-egy interrupt nem zajlik le, mert eleve zavaros jel jön az érzékelő felől? Vagy sőt, hiszterézises a jel, így aztán gyakrabban van interruptod. Hogyan dolgozod fel az adatot frekvenciára?
Jelenleg négyszögjel 500Hz, 5V Amplitudo. Erre ad vissza az előbb írt példám 2000-et. zombee: Nem riasztasz el mert nem az a tipus vagyok. Programozásból rendben van a tudásom, de az AVR-ekben mindig találok bőven hiányosságokat. Viszont ez a Timer részleget nemigazán értem teljesen. vzoole: Megköszönném a példát ha nem nagy kérés.
Ha jól értem, akkor nem a kerék minden körbefordulásánál kapsz egy jelet?! (mint a kerékpár sebesség mérőknél)
Ha jól tudom egy körbefordulás alatt 4 jelet kapok (négyszögjel). De egyenlőre nem a motoron tesztelem, hanem fix HZ-kal asztalon.
Még le tudnád írni a kerék külső kerületét?
Csak azért kéne, hogy valós számokkal tudjak számolni és példát írni.
Ezeket a jeleket nem közvetlenül a kerékről veszem le hanem a gyári sebességmutatójáról. Nem tudom mit változtat addig az elektronika azon a jelen ami a keréktől jön.
Szerintem úgy értette, hogy az AVR tudásában talál mindig hiányosságot.
Egy kicsit számolgattam... de nem stimmel valami: Írtad hogy: 100km/h sebességnél 1120Hz jelet kapsz. Ez azt jelenti, hogy : 100km/h = 1020 jel másodpercenként azaz: 27,7m/s = 1020 jel másodpercenként Írtad, hogy 4 jel van egy körbefordulás alatt, ami: 27,7m/s = 280 körbefordulás másodpercenként Ebből ki tudod számolni a kerületét a keréknek, ami: sebesség/körök számával 27,7 / 280 = 0,0989m >> ~10cm a kerülete a keréknek 0,0989 / 3,14(pi) = 0,031 >> 3,1cm a kerék átmérő jó kicsi motor lehet
Annyit tudok konkrétan amit leírtam. Én nem számolgattam a kerékátmérőt meg ilyeneket .
Egy illető már megépítette ehhez a motorhoz ezt a dolgot, az ő oldaláról próbálok gyűjteni információkat és ott olvastam ezeket az adatokat. Bővebben: Link Mert hát persze a forráskódot nem küldi el. Kérdeztem tőle. Csak felprogramozott AVR-t. Amivel nem tudok mit kezdeni mert változtatni akarok 1-2 dolgon benne.
Tudom, de ami neki kell siman megoldhato. Ezert mondtam amit mondtam. Csak hallgatnia kene zombee-ra.
Na az a gond, hogy teljesen tisztában kéne lenni a motor gyári sebességmérő rendszerével.
Azért, mert ha tudod, hogy hol milyen jelet kapsz és miért, az nagyban elősegít, hogy megoldást találj a problémádra. Jelen esetben van egy analóg sebességmérő műszer a motoron, amit szerintem nem tudsz frekvenciával befolyásolni. Tehát vagy kitöltési tényezővel, vagy feszültséggel vezérled a kilengését. Viszont a mérő érzékelő valahol a sebességváltóban lesz az utolsó tengelyen. Ott pedig körbefordulásonként kapsz X jelet. Tehát ezzel a frekvenciával nem tudod az analóg műszert közvetlen meghajtani. Valahol lesz egy átalakítás. Még az átalakítás előtti jelet kéne elcsípned valahol. Ha ez megvan, máris tudod hogyan méri a sebességet és ebből el tudsz indulni. Lehet enélkül is próbálkozni, lemásolni kész projekteket, de akkor minden apró hibánál el fogsz akadni. Sokkal nehezebb mindent megérteni és átnézni, de akkor tudod mi miért történik. Idézet: „Szívesen leírnám - sokadszorra - az input capture-t” Igen sűrűn előjön ez a probléma... Mi lenne, ha valaki írna végre egy frekvencia mérő cikket, vagy valamit cikkben és akkor lehetne arra hivatkozni... Tudom, anno nekem is kellett segítenetek, és én meg is írnám, de annyira nem vagyok penge... Ötlet? Vállalná valaki? Lehetne a bemeneten egy számláló és akkor tudna órajelnél magasabb frekit is mérni... Lehetne akár km/h óra is pl. bringára, motorra (reed relé + mágnes), vagy fordulatszám mérő kocsiba... Nem jó cikk ötlet? Nincs kedve valakinek megírni?
Én speciel már jó ideje tervezek autóba kilométerórát, de csak nem akar összejönni. Főleg a jeladó része.
A reed relé szerintem nem valami jó mivel "receg", helyette Hall-generátorral kísérletezem.
En az ultrahang erzekelos cikkemben ismertettem roviden az input capture-t. Ott a visszhangimpulzus hosszat mertem vele. Az a peldakod konnyen modosithato es felhasznalhato frekvenciameresre, vagy kitoltesi tenyezo meresre...
Nem, nem JTAG-et hsználok.
AVR Studio 4.16.638 és AVR-Doper USB-s ISP programozót. Nem találtam, de mindegy, annyira nem fontos, csak jó lett volna...
Ezt a cikkedet azt hiszem nem olvastam (elkerülte a figyelmem) ... Ez tényleg jó cikk
Mégiscsak olvastam... teljesen hülye vagyok
Nezzed meg az alabbi es az azt koveto hozzaszolast. A bennuk levo linkeket es a PDF fajlt is. Egy hazi keszitesu Hall-szenzoros enkoder leirasa van rajta.
Ezzel mar lehet sebessegmerot kesziteni... Bővebben: Link
Sziasztok,
a fleury féle I2C könyvtárat használnám AVR studio alatt, de valamiért nem megy, olyan, mintha nem címezné meg a kívánt regisztert, pl ha eepromból olvasok, akkor ezt jól látni, hogy csak sorban olvassa a tartalmát. Az i2cmaster.h és twimaster.c fájlokat linkeltem be a projektbe. Nem találom mit baltázok el...
Szia!
Esetleg: Bővebben: Link
Így csinálom, szépen le is fordul. HW-t átnéztem párszor, az rendben van, felhúzó ellenállások is megvannak. Proci órajel 8MHz, I2C órajel 100KHz, USART stb megy szépen, csak az I2C nem akar. A kódot leegyszerűsítettem csak olvasásra.
Üdv mindenkinek!
Szükségem lenne egy olyan eszközre, ami 3-5V értékhatárok közt 0,1V skálával feszültséget állít nekem elő. Mivel van itthon felesleges M8-am, és HD44780-am, PWM-re gondoltam, és ADC-vel még a feszültséget is nyomon tudnám követni. Csak az a problémám, hogy a számolgatások után rájöttem, hogy elég magas lenne az áramerősség, 800mA. Ti hogy oldanátok meg ezt a problémát? Válaszotokat előre is köszönöm! Üdvözlettel: BazsiBácsi |
Bejelentkezés
Hirdetés |