Frekvencia mérés
Frekvencia mérés
Tiszteletem Urak!
A kérdésen az lenne, (bár lehet, hogy volt már erről szó. de nem találom) hogy INT lábra érkező frekvenciának mekkora lehet a maximuma?
Hogyan tudom meghatározni?
Van ugyanis egy projektem. 16MHz-es kvarccal megy a proci, és pár kHz-es tartományt még mér. Viszonylag pontosan.
De jó lenne tudnom, úgy általánosságban, hogy adott kvarc mellett mekkora lehet az a bemenő freki, ami még nem terheli le teljesen a procit az INTERRUPT rutinhoz való folytonos ugrálgatással?
A kérdésen az lenne, (bár lehet, hogy volt már erről szó. de nem találom) hogy INT lábra érkező frekvenciának mekkora lehet a maximuma?
Hogyan tudom meghatározni?
Van ugyanis egy projektem. 16MHz-es kvarccal megy a proci, és pár kHz-es tartományt még mér. Viszonylag pontosan.
De jó lenne tudnom, úgy általánosságban, hogy adott kvarc mellett mekkora lehet az a bemenő freki, ami még nem terheli le teljesen a procit az INTERRUPT rutinhoz való folytonos ugrálgatással?
Szerintem ne használj megszakítást! Ha frekvenciát akarsz mérni, közben ne akarj mást is csinálni!
Inkább:
1-ik Timert beállítod, mondjuk 1ms vagy 10ms megszakításra.
Írjál 1 ciklust (Lehetőleg ASM-ban), ami közvetlen figyeli a bemenet változását. És minden 0-1-0 változásra, növeli a periódusszámlálót. A ciklus elején indítod a timert Int engedélyezéssel.
Vagy használhatod a másik számlálót külső jelek számolására. Ez HW alapon még gyorsabb lesz.
Timer megszakításban: Kiolvasod a periódusszámlálót és kiszámolod belőle a frekvenciát.
Szerintem így lesz a leggyorsabb! Esetleg több mérés átlagát is veheted, a pontosság kedvéért!
Ui.: Közben volt 1 áramszünet, és megelöztek! De a tanács hasonló!

Inkább:
1-ik Timert beállítod, mondjuk 1ms vagy 10ms megszakításra.
Írjál 1 ciklust (Lehetőleg ASM-ban), ami közvetlen figyeli a bemenet változását. És minden 0-1-0 változásra, növeli a periódusszámlálót. A ciklus elején indítod a timert Int engedélyezéssel.
Vagy használhatod a másik számlálót külső jelek számolására. Ez HW alapon még gyorsabb lesz.
Timer megszakításban: Kiolvasod a periódusszámlálót és kiszámolod belőle a frekvenciát.
Szerintem így lesz a leggyorsabb! Esetleg több mérés átlagát is veheted, a pontosság kedvéért!
Ui.: Közben volt 1 áramszünet, és megelöztek! De a tanács hasonló!
Én amit csinálnék:
Timer számláló bemenetére kötném a mérendő jelet. A timer 1 0...65535ig mér. Másik timerrel meg órajelalapot hozok létre. És két ilyen órajelalappal mérek. 0. órajelalap: timer1=0. 1. órajelalap: timer1 kiolvas.
Frekvencia:
Timer1 értéke/órajelalap hossza
NINCS állandó INT ami beterhel, tisztán HW alapú a mérés.
Timer számláló bemenetére kötném a mérendő jelet. A timer 1 0...65535ig mér. Másik timerrel meg órajelalapot hozok létre. És két ilyen órajelalappal mérek. 0. órajelalap: timer1=0. 1. órajelalap: timer1 kiolvas.
Frekvencia:
Timer1 értéke/órajelalap hossza
NINCS állandó INT ami beterhel, tisztán HW alapú a mérés.
„mivel az AVR vackokban nincs prioritásos INT.”
Nincsen de megoldható ez is!
Mondjuk van 2 vagy több INT.
Mondjuk INT0 az elsődleges akkor a többi INTx elején engedélyezed az „Enable Interrupts”-ot. Esetleg még „Disable Intx”, hogy sajátmagát ne szakítsa meg.
Ezzel a trükkel már INT0 megszakíthatja bármely alacsonyabb szintű másikat.
Csak kicsit nagyobb verem kel hozzá!

És a megszakítás hosszát is bele kel kalkulálni az idő alapba. A nagyobb pontosság elérése érdekébe
Nincsen de megoldható ez is!
Mondjuk van 2 vagy több INT.
Mondjuk INT0 az elsődleges akkor a többi INTx elején engedélyezed az „Enable Interrupts”-ot. Esetleg még „Disable Intx”, hogy sajátmagát ne szakítsa meg.
Ezzel a trükkel már INT0 megszakíthatja bármely alacsonyabb szintű másikat.
Csak kicsit nagyobb verem kel hozzá!
És a megszakítás hosszát is bele kel kalkulálni az idő alapba. A nagyobb pontosság elérése érdekébe
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2010. december 23. csütörtök, 13:41-kor.
Nem szakítja meg ekkor sem!
Kivéve, ha az INT rutinban figyeled, hogy a INT regiszterbe beesett-e egy kérés, és innen ugrasz _tovább_.
De hogy miről is beszélünk?
Timer1 - 65k-ig számol.
Timer0-val mintavétel beállít.
Az INT be/kilépés 25-25 órajel plusz belül a Timer 1 nulláz illetve változóba kiolvas. Ez legyen újabb 25. Azaz a teljes Timer0INT: 75 órajel. Ez 10 MHz esetén:
1 órajel 1 utasítás: 0.1 usec
75 órajel: 75 usec.
Így ha frekvenciában nézem, akkor 130kHz mérhető. DE: Minthogy CAPTURE-vel mérek, ami esetén a TIMR1 akkor is számol ha akár INTben vagyok, így a mérési pontosság csökken csak. Azaz a mérési pontatlanság lesz a 75usec!
Ha 100 kHz-t mérek, akkor 1 rezgés ideje: 10 usec!
Kivéve, ha az INT rutinban figyeled, hogy a INT regiszterbe beesett-e egy kérés, és innen ugrasz _tovább_.
De hogy miről is beszélünk?
Timer1 - 65k-ig számol.
Timer0-val mintavétel beállít.
Az INT be/kilépés 25-25 órajel plusz belül a Timer 1 nulláz illetve változóba kiolvas. Ez legyen újabb 25. Azaz a teljes Timer0INT: 75 órajel. Ez 10 MHz esetén:
1 órajel 1 utasítás: 0.1 usec
75 órajel: 75 usec.
Így ha frekvenciában nézem, akkor 130kHz mérhető. DE: Minthogy CAPTURE-vel mérek, ami esetén a TIMR1 akkor is számol ha akár INTben vagyok, így a mérési pontosság csökken csak. Azaz a mérési pontatlanság lesz a 75usec!
Ha 100 kHz-t mérek, akkor 1 rezgés ideje: 10 usec!
Még 1 trükk:
Enable Timer1 és Disable Timer1 (ill az órajelforrás mi legyen: bemeneti láb vagy NINCS). Ez ~ 5 órajelet vesz igénybe.
Az indítás és a leállítás vesz el időt, azaz ezalatt beeső impulus lehet macerás.
De ha hosszabb a mérési periódus, akkor ez az idő elenyésző....
Amúgy a Capture max frekvenciája: Órajel * 0.4. Azaz 20 MHz esetén 4 MHz mérhető.
Kiskapu: külső számláló CMOS alapon, vagy egy előosztót tessék berakni, így ez a frekvencia feltornászható.....
Szóval önálló AVRrel a mérés órajel 40%-a. Itt a SW az ami a feldolgozásért felel, azaz ez mondja meg hogy milyen pontosan akarsz mérni....
Enable Timer1 és Disable Timer1 (ill az órajelforrás mi legyen: bemeneti láb vagy NINCS). Ez ~ 5 órajelet vesz igénybe.
Az indítás és a leállítás vesz el időt, azaz ezalatt beeső impulus lehet macerás.
De ha hosszabb a mérési periódus, akkor ez az idő elenyésző....
Amúgy a Capture max frekvenciája: Órajel * 0.4. Azaz 20 MHz esetén 4 MHz mérhető.
Kiskapu: külső számláló CMOS alapon, vagy egy előosztót tessék berakni, így ez a frekvencia feltornászható.....
Szóval önálló AVRrel a mérés órajel 40%-a. Itt a SW az ami a feldolgozásért felel, azaz ez mondja meg hogy milyen pontosan akarsz mérni....
A következő dolog jutott eszembe, kíváncsi vagyok, mit szóltok hozzá:
Van RTC a cuccban (lehet másik timer kimenő jele is persze, akinek van), az ad 1Hz-et. Ezt rákötöttem a capture bemenetre, lefuto élre. Sajnos nincs számlálás engedélyezés láb, így kivülről egy ÉS-kapu megy az 1Hz-re és a bejövő frekire. Az 1Hz=1, akkor freki be, Timer számol. 1Hz=lefut, capture megfogja a CT értékét és ad egy INT-et (ami persze vagy végrehajtódik, vagy nem), de van 0.5 sec arra, hogy kiolvassam a capture értékét és nullázzam a Timert. Az meg azért már menni fog. Így mindig 0-ról indul a Timer és az Fbe/2 értéket kapom.
Vélemény?
JAni
Van RTC a cuccban (lehet másik timer kimenő jele is persze, akinek van), az ad 1Hz-et. Ezt rákötöttem a capture bemenetre, lefuto élre. Sajnos nincs számlálás engedélyezés láb, így kivülről egy ÉS-kapu megy az 1Hz-re és a bejövő frekire. Az 1Hz=1, akkor freki be, Timer számol. 1Hz=lefut, capture megfogja a CT értékét és ad egy INT-et (ami persze vagy végrehajtódik, vagy nem), de van 0.5 sec arra, hogy kiolvassam a capture értékét és nullázzam a Timert. Az meg azért már menni fog. Így mindig 0-ról indul a Timer és az Fbe/2 értéket kapom.
Vélemény?
JAni
1/2Hz a mintaidő és 3600Hz-ig kell nekem most mérni (szerencsére). T1 és T3 mér, még nem mertem hozzáfogni, mára elég volt a szívásokból. 
Mondjuk ez a megoldás erősen glitch-es, de 1-2Hz eltérés most nem számít.
(mondom én, csak a megrendelő meg ne tudja)
LONG-nál nagyobb számunk nincs? Legalább 40 bit kellene, de 48 már mégjobb lenne
Mondjuk ez a megoldás erősen glitch-es, de 1-2Hz eltérés most nem számít.
(mondom én, csak a megrendelő meg ne tudja)
LONG-nál nagyobb számunk nincs? Legalább 40 bit kellene, de 48 már mégjobb lenne
Mekkora számérték kellene?
Double: 64bites...
· Bit (1/8 byte). A bit can hold only the value 0 or 1. A group of 8 bits is called a byte.
· Byte (1 byte). Bytes are stores as unsigned 8-bit binary numbers ranging in value from 0 to 255.
· Integer (two bytes). Integers are stored as signed sixteen-bit binary numbers ranging in value from -32,768 to +32,767.
· Word (two bytes). Words are stored as unsigned sixteen-bit binary numbers ranging in value from 0 to 65535.
· Long (four bytes). Longs are stored as signed 32-bit binary numbers ranging in value from -2147483648 to 2147483647.
· Single. Singles are stored as signed 32 bit binary numbers. Ranging in value from 1.5 x 10^–45 to 3.4 x 10^38
· Double. Doubles are stored as signed 64 bit binary numbers. Ranging in value from 5.0 x 10^–324 to 1.7 x 10^308
· String (up to 254 bytes). Strings are stored as bytes and are terminated with a 0-byte. A string dimensioned with a length of 10 bytes will occupy 11 bytes.
3600 Hz.
Vegyél 10 mp-en át mintát. Így 1/10 Hz pontos leszel....
Esetleg 10 mp alatt másodpercenként, majd osztod 10-l. Így is megvan az 1/10 pontosság....
Double: 64bites...
· Bit (1/8 byte). A bit can hold only the value 0 or 1. A group of 8 bits is called a byte.
· Byte (1 byte). Bytes are stores as unsigned 8-bit binary numbers ranging in value from 0 to 255.
· Integer (two bytes). Integers are stored as signed sixteen-bit binary numbers ranging in value from -32,768 to +32,767.
· Word (two bytes). Words are stored as unsigned sixteen-bit binary numbers ranging in value from 0 to 65535.
· Long (four bytes). Longs are stored as signed 32-bit binary numbers ranging in value from -2147483648 to 2147483647.
· Single. Singles are stored as signed 32 bit binary numbers. Ranging in value from 1.5 x 10^–45 to 3.4 x 10^38
· Double. Doubles are stored as signed 64 bit binary numbers. Ranging in value from 5.0 x 10^–324 to 1.7 x 10^308
· String (up to 254 bytes). Strings are stored as bytes and are terminated with a 0-byte. A string dimensioned with a length of 10 bytes will occupy 11 bytes.
3600 Hz.
Vegyél 10 mp-en át mintát. Így 1/10 Hz pontos leszel....
Esetleg 10 mp alatt másodpercenként, majd osztod 10-l. Így is megvan az 1/10 pontosság....
Épp lebegőpontosra nem akartam áttérni. Olyan lökött a feladat, hogy egésszel számolok mindenütt, de "azért ha akarja, meg tudja már nézni 3 tizedesre is az eredményt" kérés beszaladt. A mért értékem 5 digit, a formátum mutatja meg, hogy ez hogyan oszlik meg egész/törtre. Mindig ezt az értéket teszem el, ezzel komparálok, ez megy a gyűjtőbe stb. Így a határértékek beállitása is egészként történik, az, hogy mit lát a kijelzőn, az csak formátum tili-toli. Kevés gomb miatt karakterenként kell beállítgatni minden számot és néha érdekes dolgokat tud művelni a Single (ugyebár jópár olyan szám van, ami "kettedes-végtelen tört", meg kerekítési hibák) és jártam úgy, hogy a beállított érték átalakítás/visszaalakítás után nem stimmelt és ez azért eléggé zavarja a kezelőt; no, ezért döntöttem a tiszta egész mellett. Viszont most meg elfogyott a 31bit
De nagyon úgy látom, át kell írnom az egész aritmetikát double-re. Most 596.000 érték után negatívot kapok, ami logikus, mert a mértékegység "/óra", másodpercenként gyűjtök, szóval 596000*3600=2milliárd+ és elfogyott a 31bit. A hosszú mérés sajnos nem jó, 1 másodperc alatt be kell avatkozni a folyamatba. Ja, meg azért féltem a lebegőket használni, mert az egész cucc távvezérelhető és nem tudom, mit szól a belső konvertáló rutin pl. a 23..7c9 vagy 1.2.3 bejövő tört értékhez. Ilyenekre meg hibakezelést írni egy borzalom.
Az egész cuccnak van áram/fesz/freki bemenete (2x), szóval a pontos frekimérés csak egy részfeladat az egészből. A számábrázolási gondok végül is csak azért vannak, mert a kijelző kicsi és fix hosszon kell megjelenítenem mindenféle formátumot. Bocs a hosszú sirámokért.
Az egész cuccnak van áram/fesz/freki bemenete (2x), szóval a pontos frekimérés csak egy részfeladat az egészből. A számábrázolási gondok végül is csak azért vannak, mert a kijelző kicsi és fix hosszon kell megjelenítenem mindenféle formátumot. Bocs a hosszú sirámokért.