AD -> UART, pomoc s programem
Moderátor: Moderátoři
AD -> UART, pomoc s programem
mám následující problém. Mám analogový signál, který potřebuji za pomoci (asi) ATmega8 digitalizovat a přes UART poslat k dalšímu zpracování. Parametry signálu jsou následující. Frekvenční rozsah asi 0,3-100 Hz, amplituda jednotky V (není problém upravit na nejvhodnější hodnotu pro MCU), signál nabývá i záporných hodnot (umí A/D převodní pracovat i se zápornou hodnotou nebo budu muset signál ještě před převodem upravit?).
Problém je, že s programováním procesorů nemám vůbec žádné zkušenosti. Byl by někdo tak moc hodný a podělil se se mnou o tento program? Předem moc děkuji. *s*
Takže signál posunu kousek výš, aby byl kladný, to nebude problém. Vyšší frekvence by se tam opravdu dostat neměla, filtr už tam mám. Vzorkovací teorém znám
http://osvetleni.juracka.info/index.php.
Trocha z programové praxe:
http://www.ebastlirna.cz/modules.php?name=Forums&file=viewtopic&t=35867&highlight=
http://forum.mcontrollers.com/viewtopic.php?t=1272&highlight=p%F8evodn%EDk
Trocha dokumentace:
http://rapidshare.com/files/308810364/Pr__ce_s_mikrokontrol__rey_ATLEM_AVR_ATmega16_4d__l.rar
http://www.root.cz/clanky/vyvojove-nast ... ice-pic-2/
- elnovy
- Doporučuje se dohled statného moderátora
- Příspěvky: 884
- Registrován: 04 črc 2010, 00:00
- Bydliště: JČ
Bydliště: JČ
Povolání: Vývoj elektroniky+DPS
Zájmy: Programování C++ ,assembler
Frekvencni rozsah 100 Hz vyplyva z ceho? Kdesi jsi psal, ze chces signal zobrazovat. Pokud ale 100Hz pouzijes vzorkovani 200Hz, budes sice na hranici Nyquistovy podminky, ale zadne detaily na signalu neuvidis, protoze prave ty detaily znamenaji vyssi frekvence. Takze pri 20Hz signalu a 200Hz vzorkovani ziskas jen 10 vzroku na periodu tj. 5 vzorku na pulvlnu...
Pro korektni cinnost je treba do signalu vradit DP pred vzorkovanim. Vzorkovaci frekvenci je treba zvolit takovou, aby tam ta DP mela pozadovany utlum.... Takze treba pri DP 1.radu na fo 200 Hz, je pro utlum aliasingovych signalu >20dB treba Fvz alespon 2kHz.
Mám to zatím takhle:
ADMUX
REFS1=0 REFS0=1 -> AVCC (kondenzátor na AREF) - pochopil jsem to správně, že jako reference se použije napájecí napětí?
ADLAR=0 (zarovnání napravo)
MUX3-0 = 0000 - požije se kanál 0
takže ADMUX=0x40
ADCSRA
ADEN=1 zapne převodník
ADSC=1 zapne převod
ADFR=1 free funning mode
ADPS2-0=011 dělící poměr 8, což při použití vnitřních hodin 1MHz odpovídá vzorkovací frekvenci 125 kHz (pro maximální přesnost je potřeba 50-200kHz)
takže ADSCRA=0xE3
Zatím to není moc, ale po malých krůčcích snad docupitám do cíle
WLAB: Díky za upřesnění. Posunout signál by neměl být problém. 100Hz vyplívá z toho, že vyšší frekvence není třeba, jedná se o EKG signál a tam těch 100Hz úplně stačí. Vzorkovací frekvence bude 125 kHz, takže by snad neměl být problém. A zobrazovat to chci v programu StampPlot Pro.
Akorat pozor, abys ta data zvladl protlacit pres UART ven, tech 10kHz je hodne na hrane, pokud budes posilat jen 8 bitu na vzorek, pokud budes posilat 2x8 bitu na vzorek, tak uz to pres rychlost 115200 neutlacis...
A nezapomen dat vhodny Xtal, protoze 115200 baud uz treba ze 16 MHz krystalu neudelas s prijatelnou chybou.
Mozna bych se spis vykaslal na free running ADC a misto toho startoval prevod v pravidelnych intervalech generovanych prerusenim od casovace. Vzorkovaci frekvence tak pujde volneji nastavit - ovsem zas tam bude vnesen jitter umerny delce sekvenci programu, kde je zakazane preruseni (obsluhy intek atd...)
WLAB píše:ovsem zas tam bude vnesen jitter umerny delce sekvenci programu, kde je zakazane preruseni (obsluhy intek atd...)
Co má obsluha přerušení společného s převodem ADC? Pokud se spouští ADC od timeru, tak na to běh procesoru nemá žádný vliv a jitter vznikne jen pokud je nesoudělná frekvence taktování ADC a spouštění timeru.
Andrea píše:WLAB píše:ovsem zas tam bude vnesen jitter umerny delce sekvenci programu, kde je zakazane preruseni (obsluhy intek atd...)
Co má obsluha přerušení společného s převodem ADC? Pokud se spouští ADC od timeru, tak na to běh procesoru nemá žádný vliv a jitter vznikne jen pokud je nesoudělná frekvence taktování ADC a spouštění timeru.
Nejak si nevybavuji, ze by ATmega mela HW spousteni ADC od nejakeho z casovacu. Takze se musi spustit z obsluhy intka casovace - ktera se nespusti dokud bezi obsluha jineho intka a nevykonaji se eventuelne vsechna ostatni, ktera maji vetsi "prioritu"....-> jitter. Castecne to lze vyresit tim, ze se povoli preruseni v obsluhach preruseni, ale to je celkem pakarna a stejne se jitteru nevyhne - a to vetsimu, nez je ten tebou popisovany.