Witam
Mam dwa dni urlopu to trochę pomęczę z xmega
. Na chwilę timery odstawmy a przejdźmy do ADC .
Mówisz że jest proste do ogarnięcia (jak już się wie to na pewno ) ale niestety człowiek ma stare przyzwyczajenia z ATmega .
Typowo na ATmega ustawiałem ADC w taki sposób :
Kod: Zaznacz cały
$regfile = "m32def.dat"
$crystal = 16000000
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
$baud = 9600
Dim Aa(6) As Word
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Enable Adc
Enable Interrupts
Start Adc
Cls
Do
Aa(1) = Getadc(0)
Aa(2) = Getadc(1)
Aa(3) = Getadc(2)
Aa(4) = Getadc(3)
Aa(5) = Getadc(4)
Aa(6) = Getadc(5)
....
Skala pomiaru w zakresie od 0 do 5V / 10bit ..dla amatora bajka , nic dodać nic ująć .
W Xmega jest trochę inaczej troche mieszania :/ .
Chcąc używać ADC jak z przykładu jak na ATmege wybrałem dla Xmega tryb - Single , Convmode = unSigned . Czyli pomiar napięcia (moje zasilanie jest 3,276V ) podzielonego przez 1,6 a to wychodzi ze max napięcie wyniecie 2,0475V (szkoda że nie ma jak w ATmega cały zakres zasilania). Te 2,0475V musze przeliczyć na rozdzielczość 12bit , 2,0475/4095=0,0005V .
Po podłączeniu ADC do masy wychodzi mi że mam wartość przesunięcia = 188 , by pozbyć się przesunięcia to muszę odjąć od wyniku całego pomiaru wartość 188*0,0005=0,094V .
Napisałem prosty program do testów :
Kod: Zaznacz cały
$regfile = "xm128a3udef.dat"
$crystal = 60000000 '60MHz
$hwstack = 128
$swstack = 128
$framesize = 128
$lib "xmega.lib"
Config Osc = Enabled , Pllosc = Enabled , Pllmul = 30
Config Sysclock = pll
Config Priority = Static , Vector = Application , Lo = Enabled
'-------------------------------------------------------------------------------------------------------------------------------------------
Config Com2 = 19200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
Open "COM2:" For Binary As #1
'-------------------------------------------------------------------------------------------------------------------------------------------
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portf.5 , Db5 = Portf.4 , Db6 = Portf.3 , Db7 = Portf.2 , E = Portf.1 , Rs = Portf.0
Cursor Off
Cls
'-------------------------------------------------------------------------------------------------------------------------------------------
Config Adca = Single , Convmode = unSigned , Resolution = 12bit , Dma = Off , Reference = Intvcc , Event_mode = None , Prescaler = 512 , _
Ch0_gain = 1 , Ch0_inp = Single_ended , Mux0 = &B00000000
'-------------------------------------------------------------------------------------------------------------------------------------------
dim usrednianie as dword , wynik_usredniony as word
Dim pomiar_ADC As Word
Dim napiecie As Single
Dim I As Byte
'napiecie zasilania= 3,276V
'napiecie odniesienia 3,276/1,6=2,0475
'rozdzielczosc=4095
'napiecie rozdzielczosci = 2,0475/4095=0,0005V
'pomiar przesuniecia =188
'napiecie przesuniecia =188*0,0005=0,094V
dim napiecie_rozdzielczosci as single
napiecie_rozdzielczosci =0.0005
dim napiecie_przesuniecia as single
napiecie_przesuniecia = 0.094
'-------------------------------------------------------------------------------------------------------------------------------------------
do
for i=1 to 10
pomiar_ADC = Getadc(adca , 0 )
usrednianie = usrednianie + pomiar_ADC
next i
wynik_usredniony = usrednianie / 10
usrednianie=0
locate 1,1
lcd "ADC krok = " ; wynik_usredniony 'usredniona wartosc ADC
napiecie = wynik_usredniony * napiecie_rozdzielczosci
napiecie = napiecie - napiecie_przesuniecia
locate 2,1
lcd "napiecie - " ;Fusing (napiecie , "##.###") ; "V"
Waitms 200
cls
loop
End
Wyniki wychodzą bardzo bliskie wedle pomiaru z miernika np miernik 1,955V a na lcd xmega mam 1,954V , 1,952V
Wyniki są poprawne z dokładnością 0,002V co mnie zadowala licząc że zasilanie to chińska przetwornica + stykówka+kupa kabli.
Czy dobrze to rozkminiłem ? Chyba że są lepsze metody pozbycia się offsetu .
Interesuje mnie też jak ustawić knfig ADC by móc w taki sposób obsłużyć 8 kanałów jak przy ATmega .
Co do timerów to widzę że są 3 tryby , przepełnienia (wykonanie procedury przerwania po przepełnieniu) , tryb FREQ i PWM ...no chyba że są inne bo mnie by interesowało np: COUNTER jak przy ATmega . Jeśli są inne to jak je skonfigurować .
Dzięki
ps: wiem że nudzę ale zapewne będzie więcej pytań