witam
Próbuje napisać program który po wgraniu do atmegi będzie pokazywał napięcie i prąd.
10 bitowa rozdzielczość przetwornika A/D jest dla mnie nie wystarczająca,
Postanowiłem sięgnąć po technikę zwaną nad próbkowaniem (oversampling)
Atmege programuje w bascomie znalazłem artykuł w nowym elektroniku z 2007 roku opisujący to zagadnienie.Przepisałem kod z gazety i próbuje go dopasować do mojej płytki testowej (atmega 32)
Zmieniłem typ procesora i kompilator ma problem z "Adcsra.adate = 1"po zmianie na 16 kompilacja przechodzi bez problemu.Dopasowałem też preskaler przetwornika do częstotliwości kwarcu w oryginale
był 8Mhz ja mam 16Mhz
Dodałem znaczniki [code] - proszę o nich pamiętać w przyszłości.
[zumek]
Próbuje napisać program który po wgraniu do atmegi będzie pokazywał napięcie i prąd.
10 bitowa rozdzielczość przetwornika A/D jest dla mnie nie wystarczająca,
Postanowiłem sięgnąć po technikę zwaną nad próbkowaniem (oversampling)
Atmege programuje w bascomie znalazłem artykuł w nowym elektroniku z 2007 roku opisujący to zagadnienie.Przepisałem kod z gazety i próbuje go dopasować do mojej płytki testowej (atmega 32)
Zmieniłem typ procesora i kompilator ma problem z "Adcsra.adate = 1"po zmianie na 16 kompilacja przechodzi bez problemu.Dopasowałem też preskaler przetwornika do częstotliwości kwarcu w oryginale
był 8Mhz ja mam 16Mhz
'wybór preskalera
Adcsra.adps2 = 1
'sykClk/64
Adcsra.adps1 = 1
'sysClk/64
Adcsra.adps0 = 1
'sysClk/64
zmieniłem też wybór napięcia referencyjnego na wewnętrzne 2,56
'Wybór napięcia referencyjnego
Admux.refs1 = 1
'napiecie referencyjne 2,56 wewnętrzne
Admux.refs0 = 1
'napiecie referencyjne 2,56 wewnętrzne
Nie rozumiem też do którego wejścia analogowego mam się podpiąć
w artykule autor celowo nie użył polecenia " Getadc(1) "
To program w całośći
'owersampling na podstawie "elektronik nowy "
$regfile = "m32def.dat" 'Atmega 32
$crystal = 16000000 'kwarc 16Mhz
'zmienne globalne
Dim Accumulator As Single
'akumulator 10bit próbek
Dim Samples As Word
'licznik 10 bit próbek
Dim Xadc As Word
'wartosc 10bit przetwornika A/D
Dim Lowbyte As Byte
'mlodszy bajt adc
Dim Type_sampling As Byte
'typ samplingu
Dim Max_sample As Word
'ilosc próbek
Dim Offset_error As Word
'blad ofsetu przesuniecia pomiaru
Dim Xfact As Byte
'wartosc skalowania
Dim Xfact_2 As Byte
'wartosc zaokraglenia
Dim Divder As Word
'dielnik
Dim Vin As Single
'wartosc napiecia po przeliczeniu
Dim Temp As Word
'zmienna pomocnicza
Dim Templong As Long
'zmienna pomocnicza typu long
'konfiguracja lcd
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Cls
'czysc ekran lcd
'prototypy procedur
Declare Sub Init_adc0
'ustawienie parametrow pracy przetwornika A\D
Declare Sub Sel_stype1
'wybor oversamplingu 11 16 bit oraz przeliczanie wartosci
Declare Sub Oversampled1
'wlasciwa procedura nadpróbkowania
On Adc Adcinterrupt
'pryporzadkowanie wektorowi przerwania A/D
Enable Interrupts
'wylaczenie systemu przerwan
Disable Adc
'wylaczenie przerwan ADC
'-------------------------------------------------------------------------------
'zerowanie zmiennych i wybor typu samplowania
Accumulator = 0
Samples = 0
Vin = 0
Temp = 0
Templong = 0
Lowbyte = 0
Type_sampling = 12
'oversampling 12bit
Call Sel_stype1
'-------------------------------------------------------------------------------
'pentla głowna
'-------------------------------------------------------------------------------
Call Init_adc0
Do
If Samples > Max_sample Then Call Oversampled1
'moj program
Lcd "A:" ; Vin
Home
Loop
'-------------------------------------------------------------------------------
'koniec pentli glownej
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Podprogramy
'-------------------------------------------------------------------------------
'wlacza przetwornik A/D wlacza przerwania przetwornika A/D
Sub Init_adc0
Adcsra.aden = 1
'1=wlacz adc
Adcsra.adie = 1
'1= wlacz przerwanie
Adcsra.adsc = 1
'1 = start przetwarzania
Adcsra.adate = 1
'1 = wlacz autowyzwalanie
'wybor preskalera
Adcsra.adps2 = 1
'sykClk/64
Adcsra.adps1 = 1
'sysClk/64
Adcsra.adps0 = 1
'sysClk/64
'Wybór napiecia referencyjnego
Admux.refs1 = 1
'napiecie referencyjne 2,56 wewnetrzne
Admux.refs0 = 1
'napiecie referencyjne 2,56 wewnetrzne
Enable Adc
'wlaczenie przerwania ADC
End Sub Init_adc0
'kompensacja bledow,skalowanie wynikow zaokraglanie
Sub Oversampled1
Disable Adc
'wlaczenie przetwarzania ADC
Accumulator = Accumulator + Offset_error
'kompensacja bledu przesuniecia =(69*Max_sample)/64
Accumulator = Accumulator * 0.9993
'kompensacja bledu wzmocnienia wzmacniacza ADC
Templong = Int(accumulator)
'wartosc kontrolna zaokraglenia
Temp = Templong Mod Xfact
Accumulator = Accumulator / Xfact
'skalowanie wyniku Akumulatora
If Temp >= Xfact_2 Then
Accumulator = Accumulator + 1
'zaokraglenie
End If
Vin = Accumulator / Divder
'obliczanie napiecia po przeliczeniu
Type_sampling = 12
Vin = Vin * 2.56
'napiecie odniesienia 2,56
Samples = 0
Accumulator = 0
Enable Adc
'wlaczenie przerwania ADC
End Sub
'-------------------------------------------------------------------------------
Sub Sel_stype1
Select Case Type_sampling
Case 11
Xfact = 2
Max_sample = 4
Divder = 2048
Case 12
Xfact = 4
Max_sample = 16
Divder = 4096
Case 13
Xfact = 8
Max_sample = 64
Divder = 8192
Case 14
Xfact = 16
Max_sample = 256
Divder = 16384
Case 15
Xfact = 32
Max_sample = 1024
Divder = 32768
Case 16
Xfact = 64
Max_sample = 4096
Divder = 65535
End Select
Templong = 69 * Max_sample
Templong = Templong / 64
Offset_error = Templong
'kompensacja wartosci bledu przesuniecia =(69*max_sample)/64
Xfact_2 = Xfact / 2
'ustaw wartosc zaokraglacza
Decr Max_sample
'ustaw ilosc probek zakres(0..ilosc probek-1)
End Sub
'-------------------------------------------------------------------------------
'procedura przerwania ADC
Adcinterrupt:
Lowbyte = Adcl
'najpiew odczytaj mlodsza czesc rejestru A/D do lowbyte
Xadc = Adch
'nastepnie odczytaj starsza czesc rejestru A/D do
Shift Xadc , Left , 8
'przesun wartosc xadc o 8 bitow
Xadc = Xadc + Lowbyte
'dodaj lowbyte do xadc
Accumulator = Accumulator + Xadc
'sumuj wartosc xadc
Incr Samples
'zwieksz wartosc licznika probek
Return
'-------------------------------------------------------------------------------
EndDodałem znaczniki [code] - proszę o nich pamiętać w przyszłości.
[zumek]
