Učím se s AD převodníkem

Další převod by měl proběhnou. Pakticky jsem nikdy nepoužil ADC bez přerušení, takže to nenám vyzkoušené. On totiž převod trvá dost dlouho a čekat na výsledek v nějaké smyčce mi příjde značne neefektivní.
Pro měření napětí jako u voltmetru je nutné nasbírat více vzorků a nějak je statistiky vyhodnocovat, takže pak má AVR dost práce.
U ATmega8 lze převodník spouštět jen softwarem nebo ho nechat volně běžet. Lépe jsou na tom novější AVR jako např. ATmega88, kde je možné ADC spouštět některou periférií (AC, Timer,…). V mnoha případech je nutné, aby start ADC byl přesně načasován.

Tak zejtra to zkusim “dát do reálu” zapojim si AVRko, vymyslim nějaký jednoduchý program, a uvidíme, jak to půjde…

ad mega88… joo, kdyby nebyly tak drahý… (kapesný moc malý :wink: )

Díky moc všem, dám vědět jak to dopadlo, hned jak to vyzkouším
Honza

jak to teda dopadlo ?
Leží mně v šilíku akcelerometr a rád bych si udělal loger do letadla a právě přemýšlím kterak oživit AD převodník.

Jak moc se létají ty vzorky ?
Plánuju to naprogramovat stylem odměř napětí porovnej to s minimální dosud naměřenou hodnotou - pokud je menší přepiš to též s největší hodnotou a tak furt dokola. Tak aby se mně neuložila jako největší hodnota nějaká špička nebo šum

Kupodivu jsem to zatím zkoušel jen v nedostatečném simulátoru AVR…
do reálu jsem se nedostal…

Otevři datasheet, a pokud pro tebe angličtina není problém, postupuj přesně podle toho DS. Já tak učinil, a v simulátoru jsem fungoval úspěšně na prvý krát… (ale v reálu to může vypadat už jinak)…

Jak moc se “létají” ty vzorky? - nechápu… ??
šum tam až zas tak moc nehrozí… Navíc můžeš to AVRko dávat do sleep modu,… pak bude šum minimální…

Jinak ten postup, jhak bys to programoval, mi není úplně jasný…
napeti= namerena hodnota
jestlize napeti < než CO? tak to přepiš “též” (??!!) s největší hodnotou (čeho??)

Pormiň byl večer.

Cílem je zachytit největší a nejmenší napětí. A cílem dotazu bylo zjistit jaké je pravděpodobnost toho že mi ADC vyplivne nějakou totální kravinu. Když se tak stane tak je výsledek nepoužitelný.

to že ti vyplivne totální kravinu by se stát nmělo… leda tak bude trocha šumu plus mínus pár LSB…

záleží taky, jak často chceš měřit, co dalšího ten procík bude dělat,…

Takže jenom zjistit největší a nejmenší naměřenou hodnotu?
<<pokud tam máš akcelerometr, tak lkogicky, nejmenší hodnota bude 0, nebo ne?

  1. to sem rád šum to nerozhodí
    2)poběží to ve freerunning módu takže měřím furt. mezitím než se změří by měl porovnat jestli to co změřil je věší než to co je v registru max a případně to přepsat a potom jestli je to menší než min a případně přepsat. potom se zacyklí na kotrole jeli seplý vypínač a nebo jeli změřeno. při sepnutém vypínači skočí do smyčky která vypíše min a max na display a zacyklí se dokud je vypínač sepnutý.
    a to je všecko.

Teď mně napadá že bude asi lepší spouštět měření ručně. Běží to celé na interním oscilátoru 1MHz a předdělička je jenom 16.

Co se stane pokud bude A/D měřit na měnší frekvenci než je těch doporučovaných 50khz ? Pujde přesnot taky do kytek ? pro měn by bylo nejlepší kdyby měřil třeba 10Hz - nechci snímat vibrace ale regulární přetížení.

Jo a taky si nejsem jistý co s tím referenčním napětím. Z akcelerometru leze pří maximu (50G) Vcc a pří druhém extrému (-50G) 0V beztížný stav je 0,5Vcc Přičemž Vcc by mělo být 5V.
V Meze mám na výběr ze třech možností

AREF, Internal Vref turned off - jestli dobře chápu tak pin Aref připojím na horní mez napětí čili Vcc a to je všecko

AVCC with external capacitor at AREF pin - Vcc připojit na pin AVCC a na Aref připojit konda

Třetí je interní zdroj 2,65V to nepotřebuju… Takže který z těch dvou je pro mně to pravé ?
Díky.

[/list]

B je spravne. :slight_smile:, ale iba ak akcelerometer pouziva ako referenciu svoje Ucc.

Pouzi ako referenciu AVcc. Z AVcc mozes priamo napajat ten akcelerometer
Medzi Vcc a AVcc daj tlmivku (malu, par uH, podla doporucenia z datasheetu) a medzi AVcc a GND kondik.

Ak ma ale akcelerometer svoju internu referenciu a signal na vystupe len zosilni aby dosiahol 5V, potom vystup z akcelerometra vydel dvoma odporovym delicom 1:1, prived na vstup AD a ako referenciu pouzi aspon jeho internu 2.56V

Martin

dobrý Martine, už to spolu řešíme po ICQ… bude to dělat tak jak ty řikáš…
:slight_smile:
zbytek dořešujeme taky :slight_smile:
Honza

Díky.

Ale eště mně vratá hlavou proč je A špatně .

Nepovedal som, A je zle, ale ze B je spravne. Dalo by sa pouzit aj A, ale uz ked v samotnom procesore maju moznost volby referencie ako AVcc bez hw prostriedkov, tak preco to nevyuzit ? Aj ked sa to za urcitych okolnosti moze zdat byt zdvojene, lebo skutocne staci prepojit AVcc s Uref.

Martin

[code];AVCC propojit s VCC
;portb = data dispalye
;portd = ovládání dispu
;vstup akcelerometr ADC0(PC0)
;vstup vypínač diplaye pc5 připojit na gnd

.include "m8def.inc"

.def ceka=r22
.def cekb=r23
.def inkrement=r24
.def w=r16
.def min=r20
.def max=r21
.def tmp=r17

.equ DD=portb	;D0-7 na display
.equ vyp=portc,5
.equ RS=portd,0
.equ RW=portd,1
.equ EN=portd,2

rjmp main

main: LDI W,$FF ;jedničky do W

out DDRB,w	;učinit portb výstupním (dispdata) 

out DDRD,w	;učinit portD výstupním (ovládání dispu)
LDI W,$00
out DDRC,w	Port C vstupní



LDI w,$80

out min,w 	;nastavit počíteční honodty min 
out max,w 	;nastavit počíteční honodty max





LDI W,LOW(ramend) ;natáhnout konec ram

out SPL,W	;vložit adresu do stackpointeru

LDI W,HIGH(ramend)

out SPH,W

LDI inkrement,$01

;–init ADC

ldi w,$20
out ADCMUX,w 	;reference připojena na AVCC 01 vysledek zarovnán do leva 1 vybrat kanál převodníku ADC0 0000 čili 01100000
ldi w,0b01100000	;11100100 povolit|začít|freerunning mode|?|zakázat přerušení|dělička 16 62,5kHz čili e4
out ADCSRA,w

mereni: SBIS vyp ;přeskočí řádek není li sepnutý vypínač
rjmp display ;sepnutý vypínač - zobrazíme

SBIS ADCSRA,4 	;přeskočí další řádek jeli změřeno
rjmp mereni	;neni zmereno - cyklíme dál.

in w,ADCH	;načíst honotu napětí
mov tmp,w

sub w,max 	;napětí - max
brpl Uprmax	;kladný výsledek - upravit max

mov w,tmp
sub w,min	;napětí - min
brmi Uprmin	;výsledek je záporný - uprav min

rjmp mereni	;návrat zpátky

Uprmax: mov max,tmp
rjmp mereni ;návrat zpátky
Uprmin: mov min,tmp
rjmp mereni ;návrat zpátky

;–Zobrazení-------------

display: SBI EN ;Nastav enable bit na jedna
CBI RW
CBI RS
LDI w,0b00111000

;počkat >40ms
RCALL cekej ;No tak počkáme 1/4s

OUT DD,w 
CBI EN	;první init 	
SBI EN	

;-----------------------------
LDI w,0b00001110

;počkat >4,1ms
RCALL cekej ;No tak počkáme 1/4s

OUT DD,w
CBI EN	;zapnutí nastavení kurzoru	
SBI EN

LDI w,0b00000110
OUT DD,w
CBI EN	;init zápisu

;-----------------------------
SBI EN

;počkat >100us
RCALL cekej ;No tak počkáme 1/4s

SBI RS
;Tady budem psat znaky	

;-----------------------------
LDI inkrement $02 ;urychlíme kapátko čekání

mov tmp,max
LDI ceka,$07	

vypis1: SBRC tmp,7 ;pokud není nula >
LDI w,0b00110001 ;vypsat jedničku
SBRS tmp,7 ;pokud není jedna >
LDI w,0b00110000 ;vypsat nulu
LSL tmp
out DD,w
CBI EN ;zapsáno
DEC ceka
RCALL cekej ;počkat
BRPL vypis1

mov tmp,min
LDI ceka,$07	

vypis2: SBRC tmp,7 ;pokud není nula >
LDI w,0b00110001 ;vypsat jedničku
SBRS tmp,7 ;pokud není jedna >
LDI w,0b00110000 ;vypsat nulu
LSL tmp
out DD,w
CBI EN ;zapsáno
DEC ceka
RCALL cekej ;počkat
BRPL vypis2

LDI inkrement $01

brzda: sbis vyp ;přeskočí řádek není li sepnutý vypínač vyp=1
rjmp brzda ;zacyklit dokavaď není vypínač rozepnut
rjmp mereni ;začít měřit

;======== čekací smyčka cca čtvrt sekundy při 1MHZ a inkrementu 1========

cekej: CLR ceka

CLR cekb	;nastavit na nulu

wait: add cekb,inkrement ;přičteme 1

nop

nop

nop

brcc wait	;skočí je li carry v nule





add ceka,inkrement ;jedničku k béčku

brcc wait

ret		;návrat z podprogramu

;======== [/code]

No jestli toť toto pojede tak se asi ožeru…
už zbývá jenom poladit pojmenování pinů portu a zitra koupit konektor na display…

.equ vyp=portc,5 .equ RS=portd,0 .equ RW=portd,1 .equ EN=portd,2

No tak ADC s vnitřním zadrtování reference mně nefungoval s vnějším už je to lepší ale co mně zaráží je že pokud chci aby mega spolehlivě pracovala tak by se napětí na vstupu ADC mělo pohybovat zhruba 0,7-0,3 reference
jinak mi to začne dělat kraviny.
Konkrétně v registru MAX se mi objeví hodnoty měnší než 128 a vregistru MIN zase větší. k tomu by nemělo dojít.

Program je zde paste.jabbim.cz/2452

Pouzivam ADC na mega velmi velmi casto. A nemam s nou najmensie problemy. Ani so stabilitou nameranej hodnoty a ani s tym, ze by mega nepracovala spravne, ak je ADvst mimo rozsah 0.3-0.7 Uref. Odkial si prisiel na tento rozsah? A ze by mimo neho nemala mega spravne pracovat?
Ako “nespravne” pracuje procesor mimo tento rozsah? Znamena to, ze ak na ADvstup privedies iba GND, tak ti procesor blbne?

Nestalo sa mi, ze by nefungovala interna referencia. Ani externa a ani referencia z Ucc. Co to znamena, ze vnejsi reference je lepsi?
TEn zdrojak luskat nebudem, v ASM nepracujem. Ale ak su MIN a MAX tvoje registre, ktore plnis na zaklade porovnania z hodnotou z AD a mas tam nezmysly, potom su asi dane programom a nie vysledkami AD prevodu. Ale mozno sa mylim.

Martin

Už jsem to s nim vyřešil… PRoblém byl trochu jinde :slight_smile:

Zdravím vás.
Potřeboval bych připojit v AD převodníku fotodiodu na snímání okolního osvětlení. Stačilo by mi klidně přesnost na 2bity (hodně světla venku, mín, podvečer, večer). O programování mi teď nejde - jde mi o hardwarovou stránku věci. Doporučíte mi nějakou fotodiodu (nebo snad fotorezistor?) a taky jak to připojit k ATmega32. Bude to na PA2, ale nevím co s AREF, AVCC a AGND
Moc díky za nějaky nápady.

Fototranzistor není moc vhodný. Rozsah osvětlení přes den je obrovský a fototranzistor velice snadno dostaneš do saturace.
dioda.GIF

jankop: bylo by možné s touto fotodiodou snímat otáčky modelářské vrtule za denního osvětlení ?

Na to nelze jednoznačně odpovědět. Rychlostně naprosto bez problémů, je to PIN dioda. Záleží na tom, jaký poměr jasů bude k dispozici. Ale je to reálné. Ovšem v tomto případě by to jednoznačně chtělo střídavý zesilovač, aby se člověk zbavil té převažující stejnosměrné složky.

Díky za info, budu hledat dál něco co je vyzkoušené.