Nadpróbkowanie. Programowe zwiększenie rozdzielczości przetwornika A/C
Wtorek, 01 Grudzień 2009
W niniejszym artykule w formie skróconej przedstawiam podstawy
teoretyczne oraz praktyczny sposób wykorzystania oversamplingu
(nadpróbkowania), dzięki któremu możliwe jest programowe zwiększenie
rozdzielczości przetwornika A/C wbudowanego w mikrokontroler. Zalety
takiego podejścia do problemu zbyt małej rozdzielczości przetwornika
są w zasadzie dwie: po pierwsze, niższe koszty, gdyż nie musimy
stosować przetwornika zewnętrznego, po drugie, uproszczenie połączeń
oraz oszczędność miejsca na płytce drukowanej.
62 ELEKTRONIKA PRAKTYCZNA 12/2009
NOTATNIK KONSTRUKTORA
Nadpróbkowanie nie jest panaceum
na wszystkie problemy związane z roz-
dzielczością przetwornika. Oczywiście,
należy liczyć się z pewnymi ograniczenia-
mi i mieć na względzie, że w niektórych
warunkach sposób ten w ogóle nie będzie
mógł być zastosowany, ponadto nie jest to
droga do zastąpienia wysokiej jakości spe-
cjalizowanych przetworników A/C. Jednak
warto zainteresować się tym sposobem,
gdyż w wielu aplikacjach mikrokontrole-
Nadpróbkowanie
Programowe zwiększenie
rozdzielczości przetwornika A/C
W niniejszym artykule w formie skróconej przedstawiam podstawy
teoretyczne oraz praktyczny sposób wykorzystania oversamplingu
(nadpróbkowania), dzięki któremu możliwe jest programowe zwiększenie
rozdzielczości przetwornika A/C wbudowanego w mikrokontroler. Zalety
takiego podejścia do problemu zbyt małej rozdzielczości przetwornika
są w zasadzie dwie: po pierwsze, niższe koszty, gdyż nie musimy
stosować przetwornika zewnętrznego, po drugie, uproszczenie połączeń
oraz oszczędność miejsca na płytce drukowanej.
rowych nie stawiamy wygórowanych wy-
magań przetwornikowi A/C, zaś przydała-
by się większa rozdzielczość. Na zachętę
dodam, że korzystając z oversamplingu,
z powodzeniem zwiększyłem rozdziel-
czość przetwornika A/C w ATmega8535
do 12 bitów, co przy napięciu odniesienia
równym 4,096 V dało teoretyczną, idealną
rozdzielczość 1 mV.
Prezentowany artykuł powstał na pod-
stawie dwóch not aplikacyjnych: AVR121 ?
Enhancing ADC resolution by oversampling
oraz AN2668: Improving STM32F101xx and
STM32F103xx ADC resolution by oversam-
pling, dostępnych odpowiednio na stro-
nach internetowych ?rm Atmel i STM.
Nota aplikacyjna STM prezentuje dwa spo-
soby zwiększenia rozdzielczości przetwor-
nika AD ? w tym artykule zajmiemy się tyl-
ko sposobem wykorzystującym szum biały.
Podstawy teoretyczne
Częstotliwość próbkowania ustalona
dla płyt CD ma taką nieco dziwną war-
tość równą 44,1 kHz. Najwyższa słysza-
na przez człowieka częstotliwość sygnału
akustycznego wynosi około 20 kHz, więc
zgodnie z twierdzeniem Nyquista (przy-
pomnijmy, że mówi ono, iż w celu unik-
nięcia zniekształceń, częstotliwość prób-
kowania sygnału powinna być większa niż
dwukrotność największej spodziewanej
63ELEKTRONIKA PRAKTYCZNA 12/2009
Programowe zwiększenie rozdzielczości przetwornika A/C
częstotliwości próbkowanego sygnału) wy-
starczyłoby próbkowanie z częstotliwością
40 kHz. Po co te dodatkowe 4,1 kHz? War-
to w tym momencie wspomnieć, że prób-
kowanie z częstotliwością wyższą od wy-
maganej przez twierdzenie Nyquista nosi
nazwę nadpróbkowania, od angielskiego
terminu oversampling.
Kolejnym ważnym terminem, który
musimy poznać, jest SNR (Signal to Noise
Ratio). Zgodnie z zasadą działania prze-
twornika A/C, sygnał analogowy o nieskoń-
czonej liczbie stanów przetwarzany jest
na wartość cyfrową o skończonej liczbie
bitów, z czym wiąże się błąd kwantyza-
cji. Dla idealnego przetwornika A/C błąd
kwantyzacji wynosi ?0,5 LSB (połowa naj-
mniej znaczącego bitu). W przypadku, gdy
mierzony sygnał przyjmuje różne poziomy
pomiędzy próbkami oraz częstotliwość
próbkowania nie jest zsynchronizowana
z częstotliwością tego sygnału, błąd kwan-
tyzacji można uznać za szum biały, którego
moc jest równomiernie rozłożona w zakre-
sie od napięcia stałego do połowy często-
tliwości próbkowania. Dla idealnego prze-
twornika A/C pomijamy inne źródła szumu
i przyjmujemy, że SNR to stosunek mocy
szumu przetwornika A/C do mocy sygnału
wejściowego, przy czym szum przetworni-
ka odpowiada szumowi kwantyzacji. Dla
pełnozakresowego sygnału sinusoidalnego,
SNR przetwornika A/C przyjmuje maksy-
malną wartość, którą określa wzór:
SNR [dB]=6,02?N+1,76
gdzie N to liczba bitów przetwornika A/C.
Z powyższego równania wynika, że aby
zwiększyć rozdzielczość przetwornika A/C;
wystarczy zwiększyć wartość parametru
SNR, co uczynimy w dalszej części artykułu.
Przy założeniu, że szum kwantyzacji
odpowiada szumowi białemu, jego moc
Rys. 1. Wpływ oversamplingu na szum kwantyzacji
jest równomiernie rozłożona w zakresie od
napięcia stałego do połowy częstotliwości
Nyquista, zaś samo skupienie mocy jest
niezależne od częstotliwości próbkowana.
Przy próbkowaniu z większymi częstotli-
wościami szum kwantyzacji rozciąga się
na całą szerokość pasma, odpowiadają-
cą częstotliwości próbkowania. Na rys. 1
przedstawiono wpływ oversamplingu na
szum kwantyzacji. Na rys. 1a pokazano
normalną sytuację, gdy sygnał jest próbko-
wany zgodnie z twierdzenie Nyquista (tzn.
z częstotliwością dwukrotnie większą niż
maksymalna, spodziewana częstotliwość
sygnału), zaś na rys. 1b sytuację, gdy sy-
gnał jest próbkowany z częstotliwością
dwukrotnie większą (oversampling) od
częstotliwości Nyquista. Obszar niebieski
reprezentuje sygnał wejściowy, zaś obszar
zielony szum kwantyzacji. Porównując
oba rysunki, można zauważyć, że obszar
nakładania się szumu oraz próbkowanego
sygnału (część wspólna obszaru niebie-
skiego i zielonego) zmniejsza się (rys. 1b)
wraz ze wzrostem częstotliwości prób-
kowania, co pociąga za sobą zwiększenie
SNR. Nadpróbkowanie sygnału z częstotli-
wością OSR-razy większą niż częstotliwość
Nyquista pozwala osiągnąć SNR określony
następującym wzorem:
SNROVS
[dB]=6,02?N+1,76+10?log(OSR)
Na podstawie powyższego równania
można stwierdzić, że każde podwojenie
częstotliwości próbkowania zwiększy SNR
o 3 dB, zwiększając jednocześnie rozdziel-
czość pomiaru o 0,5 bitu. Aby zwiększyć roz-
dzielczość o 1 bit, należy więc uzyskać SNR
o 6 dB większy. Ogólnie rzecz biorąc, aby
zwiększyć rozdzielczość przetwornika A/C
o n bitów, należy sygnał próbkować z często-
tliwością FOVS
=4n
?FS
, gdzie FS
jest aktualnie
używaną częstotliwością próbkowania.
Uważny Czytelnik może teraz stwier-
dzić: próbkujemy sygnał ileś tam razy
częściej i co z tego? Owa większa liczba
próbek okaże się bardzo przydatna, co już
wyjaśniam. Najprościej rzecz ujmując, aby
uzyskać jeden bit więcej, należy sygnał
próbkować czterokrotnie, wyniki zsumo-
wać, a następnie uśrednić. Ogólnie, aby
uzyskać N bitów więcej, należy próbkować
sygnał 4N
razy, otrzymane wyniki zsumo-
wać i uśrednić. Należy zwrócić uwagę na
fakt, że uśrednienie wyników nie polega na
podzieleniu sumy próbek przez ich liczbę.
W zamian, należy sumę przesunąć o N bi-
tów w prawo, co odpowiada jej podziele-
niu przez 2N
(jest to tzw. decymacja). Od tej
pory możemy cieszyć się wynikiem pomia-
ru o rozdzielczości większej o N bitów.
Ograniczenia
Aby oversampling mógł działać,
w próbkowanym sygnale powinny znaj-
dować się ?śmieci? w postaci szumu o po-
ziomie 1?2 LSB. Normalnie szum ten bę-
dzie pochodził ze źródeł takich jak: szum
termiczny, CPU, przełączanie portów I/O
czy wahania napięcia źródła zasilania,
i będzie wystarczający. Dobrym rozwią-
zaniem jest podłączenie innych układów
peryferyjnych do portu, w którym znajduje
się wejście przetwornika AD. Czasem może
się jednak zdarzyć, że szum pochodzący
z wymienionych źródeł nie będzie wystar-
czający. W tym przypadku należy do prób-
kowanego sygnału dodać dodatkowy szum.
W najgorszym przypadku oversamplingu
w ogóle nie będzie można zastosować ? po
szczegóły odsyłam do wspomnianych not
aplikacyjnych.
Należy pamiętać o tym, że oversam-
pling zmniejsza maksymalną częstotliwość
sygnału, którą możemy próbkować, co jest
związane z maksymalną częstotliwością
próbkowania przetwornika AD oraz liczbą
dodatkowych bitów, które chcemy uzy-
skać; zależność tę określa wzór:
Fmax
=FADC
max/(2?4n
)
gdzie:
Fmax
? maksymalna częstotliwość próbko-
wanego sygnału
FADCmax
? maksymalna częstotliwość prób-
kowania przetwornika AD
n ? liczba dodatkowych bitów, które chce-
my uzyskać.
Układ testowy oraz
oprogramowanie
W roli układu testowego wystąpił
kit AVT-2550 ?Mikrokomputer PECEL?,
w którym jako źródło napięcia odniesie-
nia przetwornika AD zastosowałem układ
MCP1541 o napięciu 4,096 V. Do kanału
6 przetwornika AD mikrokontrolera pod-
łączone zostało środkowe wyprowadzenie
potencjometru 10 kV (skrajne wyprowa-
64 ELEKTRONIKA PRAKTYCZNA 12/2009
NOTATNIK KONSTRUKTORA
dzenia podłączone zostały odpowiednio do
masy oraz napięcia 4,096 V źródła napięcia
odniesienia). Ponadto, między masę układu
a środkowe wyprowadzenie potencjometru
podłączony został multimetr (UNITEST
9005), dzięki czemu możliwe stało się prze-
prowadzenie pomiarów. Wyniki pomiaru
napięcia dokonane przetwornikiem AD oraz
multimetrem zostały zestawione w tab. 1.
Jak widać, różnica między pomiarami do-
konanymi przez przetwornik AD oraz mul-
timetr jest nieznaczna i kształtuje się na
poziomie 0,007 V. Różnica ta najprawdo-
podobniej spowodowana jest niedoskona-
łością przetwornika AD (oraz multimetru)
? dokładne sposoby kalibracji przetwornika
AD można znaleźć w odpowiednich notach
aplikacyjnych, zaś w najprostszym przy-
padku wystarczy uwzględnić średnią róż-
nicę w programie, kosztem nieznacznego
błędu dokonywanych pomiarów.
Układem testowym steruje program
napisany w języku C++ (avr-gcc), przed-
stawiony na list. 1. Głównym zadaniem
programu jest pomiar napięcia z przetwor-
nika AD skon?gurowanego w trybie Fre-
e-running oraz wysyłanie tej wartości na
wyświetlacz LCD. Należy zwrócić uwagę
na fakt, że przed wysłaniem wartości do
LCD, napięcie z przetwornika próbkowane
jest 16-krotnie, a następnie suma próbek
przesuwana jest o 2 bity w prawo. Zało-
żeniem było zwiększenie rozdzielczości
przetwornika AD z 10 do 12 bitów (n=2),
czyli: 42
=16 ? liczba wymaganych próbek,
2 ? o tyle bitów należy wynik przesunąć
w prawo. Dodatkowe informacje zawar-
te zostały w komentarzach, dzięki czemu
pełne zrozumienie programu nie powinno
stanowić problemu.
Podsumowanie
Przedstawiony artykuł ma z założenia
formę skrótową i zawiera jedynie zarys
informacji z zakresu oversamplingu. Po
szczegółowe informacje, między innymi od-
nośnie do częstotliwości próbkowania oraz
wymagań co do próbkowanego sygnału, od-
syłam do wspomnianych not aplikacyjnych.
Uwaga praktyczna: jeżeli zależy nam
na w miarę przyzwoitej jakości przetwarza-
List. 1.
#include
#include
#include
#include ?lcd.h?
void adc_start();
void adc_convert();
// zmienna przechowujaca wynik konwersji
volatile uint16_t conv_result;
int main()
{
// ustaw preskaler ADC na 64, co daje czestotliwosc jego pracy
wynoszaca ~172,8kHz
// dla kwarcu 11,0592MHz.
ADCSRA |= _BV(ADPS2) | _BV(ADPS1);
// wybor kanalu ADC (kanal 6)
ADMUX = 6;
// wlacz przerwanie od ADC
ADCSRA |= _BV(ADIE);
// wlacz ADC
ADCSRA |= _BV(ADEN);
// wlacz obsluge przerwan
sei();
// rozpocznij konwersje
adc_start();
while( 1 )
{
lcd.clrscr();
// wypisz wynik konwersji
lcd << conv_result;
_delay_ms( 500 );
}
return 0;
}
void adc_start()
{
// rozpocznij konwersje
ADCSRA |= _BV(ADSC);
}
void adc_convert()
{
static uint8_t sample_no;
static uint16_t sample_sum;
// sumuj kolejne probki z przetwornika
sample_sum += ADC;
sample_no++;
// jesli pobrano 16 probek
if( sample_no == 16 )
{
// wyzeruj licznik probek
sample_no = 0;
// zapisz wynik konwersji,
// uwzgledniajac wymagane przesuniecie o 2 bity w prawo
conv_result = sample_sum>>2;
// wyzeruj sume probek
sample_sum = 0;
}
// rozpocznij konwersje
adc_start();
}
ISR( ADC_vect )
{
adc_convert();
}
nia wartości napięcia na postać cyfrową, to
nie warto stosować napięcia odniesienia
pobieranego z systemowego stabilizatora
(np. 7805), lecz raczej wykorzystać dedy-
kowane, specjalizowane źródło napięcia
odniesienia, o wartości np. 2,048 V lub
4,096 V. Po pierwsze, unikniemy błędów
związanych z zaokrąglaniem (liczby 2048
i 4096 w obliczeniach będą dzieliły się bez
reszty), po drugie, stabilizator 7805 rzadko
kiedy da na wyjściu dokładnie 5 V. Rzeczy-
wistą wartość napięcia będzie trzeba mie-
rzyć w każdym nowo budowanym urządze-
niu i odpowiednio mody?kować tę wartość
w programie. Dla przykładu, zastosowanie
źródła napięcia odniesienia o wartości
4,096 V w miejsce napięcia ze stabilizatora
7805 zaoszczędziło mi wyrwania wszyst-
kich włosów z głowy, gdy przetwarzałem
wartość napięcia z czujnika temperatury
LM235 (przy stabilizatorze 7805 wyniki
były zadziwiająco rozbieżne).
Andrzej Telszewski
atelszewski@gmail.com
Tab. 1. Zestawienie wyników pomia-
rów [V]
multimetr ADC różnica
0 0 0
0,028 0,020 0,008
0,150 0,143 0,007
0,415 0,409 0,006
1,058 1,051 0,007
1,726 1,719 0,007
2,258 2,252 0,006
2,827 2,822 0,005
3,248 3,242 0,006
4,09 4,092 ?0,002
65ELEKTRONIKA PRAKTYCZNA 12/2009
Programowe zwiększenie rozdzielczości przetwornika A/C
Rabbit ? RCM5700
Darmowe środowisko programistyczne Dynamic C
10/100Base-T Ethernet z konektorem RJ45
Standard MiniPCIExpress
Wydajna platforma sprzętowa
Wbudowany Web serwer
Wsparcie dla projektantów
Pełna certy?kacja
Multitech ? Socket Ethernet IP
Kompatybilność pin-to-pin z modemami Multitech?a
pracującymi w innych technologiach sieciowych
Zgodny z normą EN60601 do zastosowań medycznych
Stos Univeral IP rozszerzający funkcjonalność M2M
Kompletne rozwiązanie Serial to Ethernet
Sterowanie komendami AT
Teridian ? seria 78Q21xx
Rozwiązanie dla projektów Set Top Box, IP Video
Zintegrowana warstwa MAC i PHY
Tryb transmisji synchronicznej i asynchronicznej
Transmisja Full Duplex z funkcją autonegocjacji
Pojedyncze napięcie zasilania 3,3 V
Łatwa integracja
Współpracujemy ze światowymi liderami!!!
Rabbit ? RCM5700
Darmowe środowisko programistyczne Dynamic C
Pełna certy?kacja
Kreujemy bezprzewodową rzeczywistość...
?Przemysłowy Ethernet?
Zobacz więcej w kategorii Notatnik konstruktora