Periódikus jel mérése!

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

Periódikus jel mérése!

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

Sziasztok.

Nemrégen kezdtem el foglalkozni az AVR-ekkel és Bascomban programozom a jelenlegi projektemet de most elakadtam. Próbáltam keresni de nem találtam használható példát. A gondom a következő.

Van két jelem:
164 Mhz 0....12V közötti Amplitudoval (Sebesség)
1130 Mhz 0....5V közötti Amplitudoval (Fordulatszám)

Mindkét jel esetében a frekvencia az állandó. Viszont nekem kellene a jel Amplitudoja. Proteusban megpróbáltam modellezni a szituációt és írtam rá egy kissebb Bascom programot de nem azt kaptam amit kellett volna. 5V-os Reff volt mellett 5V-os 164 Mhz-s jel 907-et adott vissza holott 1023-nak kellene lennie.

A program a következő:

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


$regfile = "m8def.dat"
$crystal = 1000000
'Config Portd = Output


Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC
Start Adc

Dim Amp As Integer
Dim Amp1 As Integer

Config Lcd = 20 * 4
Config Lcdpin = Pin , Rs = Pind.7 , E = Pind.6 , Db4 = Pinb.7 , Db5 = Pinb.6 , Db6 = Pind.4 , Db7 = Pind.5

Amp = 0
Amp1 = 0

Do
   Gosub Amplimeres
      Locate 1 , 1
      Lcd "Amplitudo:"
      Locate 2 , 1
      Lcd Amp

   Waitms 200
   Loop
End

Amplimeres:
   While Amp =< Amp1
      Amp1 = Amp
      Amp = Getadc(3)
   Wend
Return
Valaki tudna esetleg ebben segíteni? Vagy egy jó példaprogramot minden sallang nélkül írni? Köszönöm előre is 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 »

Itt a baj:
MHz.
A csúcsegyenirányítás hiányzik a HWből....
Vagy sok minta és abból bízzál, hogy a max. csúcot megfogod a mintvételezéskor....



Az elejen mérj egymas utan sokszor:
for i = 1 to 100000
Amp = Getadc(3)
if amp1 < amp then amp1=amp
next i

De az eredmeny a max ertek lesz:) - remélhetőleg.
1023.



Mi az ami ilyen sebességű és fordulatszámú? Csak nem a CERN gyorsítóban méred az elektron által megtett körök számát?:)
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

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

Neeem :).. Van egy 600-as motorom. És arra akarok csinálni mint tanulóproject egy komputert. Hát pörög szépen 15k-t a motorom mert egy gyorsasági motor. Az általad írt megoldáshoz hasonlót csináltam énis csak annyi különbséggel hogy 2 tömböt létrehoztam. (200-200 elemmel). És egymás után mérek 200-at és abban megkeresem a legnagyobbat és elvileg az lesz az Amplitudo. Ha a gondolkodásmódom jó.

A másik kérdés hogy ez mennyire pocsékolás a hardver oldalon. 200-as tömböket tárolni és használni. Na meg hogy ugye a fordulatszám és a sebesség elég gyorsan tud változni a másik kérdés hogy meddig fog tartani a mérés. (Mármint időben). Mert ugye azt nem szeretném ha fél percig méregetni az AVR mert mire kiírja az eredményt már köszönőviszonyba sincs a fordulatszám és a sebesség ahoz amit mért. Nincs erre valami képlet vagy valami hogy 200 mérés mennyi ideig fog tartani az átalakítással együtt?

Köszönöm :)
Robert írta:Itt a baj:
MHz.
A csúcsegyenirányítás hiányzik a HWből....
Vagy sok minta és abból bízzál, hogy a max. csúcot megfogod a mintvételezéskor....



Az elejen mérj egymas utan sokszor:
for i = 1 to 100000
Amp = Getadc(3)
if amp1 < amp then amp1=amp
next i

De az eredmeny a max ertek lesz:) - remélhetőleg.
1023.



Mi az ami ilyen sebességű és fordulatszámú? Csak nem a CERN gyorsítóban méred az elektron által megtett körök számát?:)
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 200 mérés kevés....

Az ADC sebessége az adatlap alapján: 15 ksps (15 e minta/sec.

Nálad az 1 periódus ideje (akkor nem MHz, hanem kHz van):
1130 kHz -> ~1 MHz
1 periódus -> 1 usec!
1 mérés ideje: 1/15e sec-> 66 usec!!!

Necces....
A mintavételezés ideje 0,1 usec, azaz ez is halovány...

A 200 mintával nem vagy sehol. mintha lenne egy színuszgörbéd, és söréttel belelőnél, hogy honnan vegyen mintát...
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

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

Akkor szerinted mennyi lenne az ideális a két jelre hogy mintát vegyek?
1000 minta / 164Hz-s jelből elég?
200 minta / 1.13Khz-ből?

Köszi :)
Robert írta:A 200 mérés kevés....

Az ADC sebessége az adatlap alapján: 15 ksps (15 e minta/sec.

Nálad az 1 periódus ideje (akkor nem MHz, hanem kHz van):
1130 kHz -> ~1 MHz
1 periódus -> 1 usec!
1 mérés ideje: 1/15e sec-> 66 usec!!!

Necces....
A mintavételezés ideje 0,1 usec, azaz ez is halovány...

A 200 mintával nem vagy sehol. mintha lenne egy színuszgörbéd, és söréttel belelőnél, hogy honnan vegyen mintát...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Szóval mennyi is a jel frekvenciája?
1130 Hz, 1130 kHz, 1130 MHz ? 8)

15 e minta/sec (ha 2 csatorna van, ez feleződik!)

1130 Hz -> 0,88 msec 1 periódus!
7 e minta/sec -> 0,14 msec-enként mérek


Hát.....

Minél agasabb mintaszám!
És nem tömb, mert az minek :)

do
eredmeny=getadc(mérés1)
if eredmeny<eddigimax them eddigimax=eredmeny
loop until el nem telt 0.5 sec...


A mérési eredmény az a maximumérték meghatározása? Az ADC-ben ez 1023 lehet :)
Igazi megoldás egy dióda + kondi+ellenállás lenne (csúcsegyenirányítás). Így nem SWből kellene bűvészkedni:)
Viszont lehet SW-bő így egy maximumot is jelző VU metert csinálni :P


Az hogy egy chipet pazarolsz e vagy sem - a feladat határozza meg.
Viszont: M8-> M328 chipcsere jelent max 1000 Ft költséget. A SW bűvölése (órabérben, hogy beférjen a kisebb chipbe ) konvergál így a 0-hoz... Viszont az optimalizációt megtanulva nagyon kockafeje lesz az embernek!
Én maradoka nagyobb chipnél és a kerekebb fejnél :idea:
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

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

Ohh. Ezt nem is tudtam. Nekem megfelel ha nem kell bűvészkednem SW-ben hanem hardveresen csúcsenyenirányítással megoldás születik. Csak erről én semmit nem tudok. Tudsz erre adni valami kapcsolást vagy megoldást?
Robert írta:Szóval mennyi is a jel frekvenciája?
1130 Hz, 1130 kHz, 1130 MHz ? 8)

15 e minta/sec (ha 2 csatorna van, ez feleződik!)

1130 Hz -> 0,88 msec 1 periódus!
7 e minta/sec -> 0,14 msec-enként mérek


Hát.....

Minél agasabb mintaszám!
És nem tömb, mert az minek :)

do
eredmeny=getadc(mérés1)
if eredmeny<eddigimax them eddigimax=eredmeny
loop until el nem telt 0.5 sec...


A mérési eredmény az a maximumérték meghatározása? Az ADC-ben ez 1023 lehet :)
Igazi megoldás egy dióda + kondi+ellenállás lenne (csúcsegyenirányítás). Így nem SWből kellene bűvészkedni:)
Viszont lehet SW-bő így egy maximumot is jelző VU metert csinálni :P


Az hogy egy chipet pazarolsz e vagy sem - a feladat határozza meg.
Viszont: M8-> M328 chipcsere jelent max 1000 Ft költséget. A SW bűvölése (órabérben, hogy beférjen a kisebb chipbe ) konvergál így a 0-hoz... Viszont az optimalizációt megtanulva nagyon kockafeje lesz az embernek!
Én maradoka nagyobb chipnél és a kerekebb fejnél :idea:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Google mit mond? :o

Műveletio erősítővel együtt kombinálva gyakori....
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

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

Auu.. Gond van :). Ma megnéztem a jelemet amit kapok a motoron és köszönő viszonyban sincs azzal amit olvastam vagyis mondtak. Szóval. Az amplitudo változik az egy dolog de számunkra nem ez a fontos hanem a Hz.. Azt kellene megnérni hogy mekkora a jel Frekvenciája. Na ez már nekem magasabb :(.. :S
Robert írta:Google mit mond? :o

Műveletio erősítővel együtt kombinálva gyakori....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Na!

Tessék kitalálni előbb a feladatot :P
Utána megy az ötletbörze....

Fordítva is érdekes, csak nehezebb :)


Tipp:
A,
1. jel: Timer INDÍT.
2. jel: Timer leállít...


B,
Timer indít
INT mér, számol
Timer leállít....


Nézz körbe: frekvenciamérő AVR címszónál....
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

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

Mivel ezt amit mondtál épp ésszel nem bírtam felfogni és megcsinálni így más megoldáshoz fordultam. Igaz nem a legjobb megoldás (pontosság, gyorsaság) de működik :).

555-ös IC-vel csináltam egy Frekvencia-Feszültség átalakítót és azt mérem ADC porton. Így közel pontosnak mondható. De ha megírod nekem azt amit mondtál akkor nagyon hálás leszek :).

Kép
Robert írta:Na!

Tessék kitalálni előbb a feladatot :P
Utána megy az ötletbörze....

Fordítva is érdekes, csak nehezebb :)


Tipp:
A,
1. jel: Timer INDÍT.
2. jel: Timer leállít...


B,
Timer indít
INT mér, számol
Timer leállít....


Nézz körbe: frekvenciamérő AVR címszónál....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

:oops: :cry: :twisted: :evil: :oops:

Van egy szinuszjeled. Ebből a feszültséget leveszed, frekvenciává alakítod (tök jó, lett egy frekvenciamodulált frekvenciád).
Vagy ezt egy AD konverterre viszed... Ami Feszültségszintet mér....


Csak én nem látom ebben a logikát?
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

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

Pedig egyszerű. A kimeneten megjelenik egy 0-5V közötti feszültség ami arányosan változik a frekvenciával. Minnél nagyobb a frekvencia annál nagyobb a feszültség a kimeneten. Ez nekünk tökéletes mert ugye ezt ADC-vel tökéletesen meg tudom mérni. Ami miatt ezt választottam az hogy 2 ilyen jelet kellene mérnem a motoron (Sebesség, fordulat). És ezzel szerintem egyszerűbb. Vagy rosszul gondolkodom? Azt hogy mennyire legyen pontos elméletileg a kimeneten lévő kondenzátorral és a vele párhuzamos kisütő ellenállással tudom állítani.

De nyugodtan írd le hogy ha jobb megoldásod van :). Most még tanulok csak ez egy ötlet volt. És 555 Timer IC-m volt itthon. Össze is dobtam és működött a motoron. Változott az ADC értékem ahogy nőtt a fordulat úgy nőtt az is.

Egy olyan kérdés. Hogy EEPROM-ba ha írok az AVR-rel. Számítógépen a programozóval valahogy ki tudom olvasni az értékeit? Csak azért kérdem mert mondjuk teszek fel most egy nyomógombot a kapcsolásra és felteszem motorra. És amikor megnyomom a gombot akkor az ADC-t eltárolja az EEPROM-ba. A tipikus fordulatoknál: 1000, 2000 .... 15000.
Ha meg utána kitudom olvasni a gépen akkor tudok grafikont csinálni meg stbstb hogy változik hogy hozzá tudjam lőni majd a kijelzést. De lehet ilyet nem lehet csinálni :)
Robert írta::oops: :cry: :twisted: :evil: :oops:

Van egy szinuszjeled. Ebből a feszültséget leveszed, frekvenciává alakítod (tök jó, lett egy frekvenciamodulált frekvenciád).
Vagy ezt egy AD konverterre viszed... Ami Feszültségszintet mér....


Csak én nem látom ebben a logikát?
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 freq generátor->U kimenet is érdekes. Minthogy nem PWM, így nem változhatna.

De a bemeneted NEM erre való!
A folyamat:
Feszültség->frekvencia előállítás->feszültség előállítás-> ADC

A freq előállítás minek? :oops:

Jobb ötlet(EK):

A,
1. jel: Timer INDÍT.
2. jel: Timer leállít...


B,
Timer indít
INT mér, számol
Timer leállít....


Nézz körbe: frekvenciamérő AVR címszónál....

Azaz amit mérsz:
- 2 impulzus közti távolság -> ebből Freq számolható.
- 1 sec alatti impulzusok száma -> Megkaptad a frekvenciát.

Nem egyszerűbb?????
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

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

Hát sajnos a jónak ítélt Freq -> DC átalakítom nem nyert.. 3Khz felett már nem ad vissza rendes értéket.

Nézzük csak azt amit te írtál. Ugye van a jelem. Fogok egy megszakítás lábat, felhúzom 5V-ra és megszakítást generálok ha 0-ra húzza? A megszakításban elindítom a másik Timert és addig futtatom még megint nem kap 0-át a megszakítás láb? Utána a Timerből hogy tudom kiszámolni azt hogy mennyi idő telt el? Na itt van nekem káosz :S.
Robert írta:A freq generátor->U kimenet is érdekes. Minthogy nem PWM, így nem változhatna.

De a bemeneted NEM erre való!
A folyamat:
Feszültség->frekvencia előállítás->feszültség előállítás-> ADC

A freq előállítás minek? :oops:

Jobb ötlet(EK):

A,
1. jel: Timer INDÍT.
2. jel: Timer leállít...


B,
Timer indít
INT mér, számol
Timer leállít....


Nézz körbe: frekvenciamérő AVR címszónál....

Azaz amit mérsz:
- 2 impulzus közti távolság -> ebből Freq számolható.
- 1 sec alatti impulzusok száma -> Megkaptad a frekvenciát.

Nem egyszerűbb?????
Válasz küldése