Skocz do zawartości

Pomocna odpowiedź

Sorry, pomyliły mi się rejestry.

Zwykle odczytuje ADCW i zwraca mi od razu 10bitową, Mój błąd.

W ADCL mieszczą się tylko dwa bity.
No nie... L oznacza Low, czyli niską część słowa.

Jeśli mamy rozdzielczość 10-cio bitową, to wynik wyrównany jest do prawej, czyli w ADCL mamy 8 najmłodszych bitów, a w ADCH 2 najstarsze.

Jeśli mamy rozdzielczość 8-mio bitową, to wynik wyrównany jest do lewej, czyli w ADCH mamy 8 bitów, a ADCL nie jest używane.

Tak, przetwornik zawsze jest 10b i na to nie mamy wpływu. Jednak możemy zmieniać sposób wyrównania bitów do lewej, lub do prawej strony w rejestrach ADCL i ADCH. A jak chcemy mieć przetwornik 8b to ustawiamy sobie bit ADLAR w stan wysoki i w rejestrze ADCH mamy gotowy wynik w postaci 8b, ale pomiar nadal jest 10b.

Trochę to może gubić tych co programowali wcześniej w bascomie, bo tam się ustawiało czy chcemy mieć przetwornik 8,9, lub 10 bitowy.

  • Lubię! 1

Ja dodam od siebie, że nie powinniśmy dzielić przez 1023, bądź 255, ale przez 256, 1024..

Z resztą taki wzór jest w nocie.

Wyobraźcie sobie przetwornik 1 bitowy. Czy 2^1 = 2. (Analogicznie 2 bitowy, 2^2=4).

Przy 1 bitowym mamy wartości od 0 do 1 (0,1). W 2 bitowym od 0 do 3 (0,1,2,3). ( Co 1 w obu przypadkach)

Teraz VRef powiedzmy 5V.

5V/2 = 2.5 V, a 5V/1 = 5V

5V/4 =1.25V, a 5V/3 = 1.66V

Teraz zgodnie z tym wzorem, ADC = (Vin*x)/Vref

Vin = 2.6V

ADC = 2.6* 1 / 5 = 0 -> ADC = 2.6* 2 /5 = 1 (i który jest poprawnie? 🙂 )

Oczywiście drugi przypadek, przetwornik 1 bitowy dzieli nam Vref na 2 wartości:

<0V ÷ 2.5V ) mamy logiczne 0.

<2.5V ÷ 5 V) mamy logiczne 1.

W pierwszym przypadku liczymy błędnie gdyż, logiczne 1 uzyskalibyśmy dopiero gdy Vin zrówna się z Vref.

Analogicznie dla 2 bitowego (00,01,10,11) :

0 - 1.25 V = 00

1.25 V - 2.5V = 01

2.5V - 3.75 V = 10

3.75V - 5V = 11

Jak widać wartość 3 (11) uzyskamy już przy Vin = 3.75V..

A gdybyśmy podzielili przez 3 to (11) byłoby przy 5V..

Są 4 bity? Są, więc dlaczego miałbym dzielić przez 3, a nie przez 4 ❓ powinniśmy dzielić/mnożyć przez 2^n, gdzie n to ilość bitów przetwornika

Zresztą wyjaśnia to cytat z noty:

The ADC converts an analog input voltage to a 10-bit digital value through successive

approximation. The minimum value represents GND and the maximum value represents

the voltage on the AREF pin minus 1 LSB.

pawel, dzięki za info - opierałem się o skróconą notę ATmegi16 i tam nie było tej informacji, że przetwornik jest zawsze 10b. Widać pora przerzucić się na pełną notę.

regrom, hmm.. to jest ciekawe zagadnienie, nawet na Elektrodzie się o to kłócili. Ja wyszedłem z założenia, że ADC nie może zwrócić większej wartości niż rozdzielczość bitowa. Nie ma jak zwrócić 256 na 8 bitach. Stąd przyjąłem, że Vref = max(8bit) => 255. Rzeczywiście, w nocie dzielą przez 1024 a nie 1023, a to dlatego by maksymalna wartość przetwornika nie oznaczała "nieco mniej niż Vref .. Vref" tylko "Vref .. więcej niż Vref".

Sorry za wprowadzenie w błąd, errare humanum est 🙂

No, o to chodzi że de facto, mierzymy do Vref, Wartość Vin = Vref, jest już przekroczeniem zakresu.

O to chodzi że jak mamy przetwornik 8 bitów to dzieli nam całe napięcie referencyjne na na 256 części, a nie 255. Podałem przykład wyżej na mniejszej ilości bitów.

Dzieląc przez 255 czy 1023 wprowadzamy sobie przesunięcie progów podziałowych, a co za tym idzie błąd pomiarowy. Przy dzieleniu przez 255, wartość ADC wyniosła by 255(1111 1111) dopiero przy 5V, ale ona pojawia się już przy około 4,982 V, jak ktoś mam dokładny miernik może sobie sprawdzić..

Tak samo wartość ADC = 0, nie jest tylko dla 0V, ale dla zakresu od 0V do 0.0195 V..

Ten błąd przy tym dzieleniu przy tak dużej liczbie bitów jest mały, ale jest błąd, kiedy dzielimy przez 255 czy tam mnożymy..

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...