Skocz do zawartości

Przeliczanie ADC na V - dzielenie przez 1023 czy 1024?


Elvis

Pomocna odpowiedź

Nie, z multimetrem Twój przykład jest zupełnie nietrafiony. Popatrz na ten: ustawiasz multimetr na zakres 2VDC, podłączasz źródło 2.000V i dostajesz wynik 1.999V. Reklamacja?

W ADC, jeśli potrzebujesz mierzyć do samego Vref możesz lekko je zwiększyć (choćby o 1/1024) albo podzielić Vin. Ja nigdy nie projektuję tak, by mój zakres przetwornika był idealnie taki jakiego zakresu Vin oczekuję - przecież to nigdy nie zadziała z powodów choćby tolerancji elementów. Skoro w AVR masz do wyboru Vref=2.56 albo 1.1V to przełącz się na nie i/lub dobierz dzielnik wejściowy tak by mieć zapas np. 10 czy 20%. Wtedy bez problemu zmierzysz co potrzebujesz. I tak Vcc jest w większości przypadków najgorszym możliwym odniesieniem więc pomiary z niego uzyskane są słabe. W sumie.. to chyba nie rozumiem Twoich wątpliwości.

EDIT: A nawet gdy za pomocą drobnego oszustwa sprawisz, że użytkownik wreszcie zobaczy 5.00V to po przyłożeniu 2.5000V, dzięki błędom liniowości ten sam gość zobaczy 2.48V i Cię pozwie. To co? Będziesz każdą sztukę kalibrował? W ilu punktach? Użytkownik który wie czego używa i zna ograniczenia sprzętu zrozumie. Na wszystkich innych.. nie ma lekarstwa.

Link do komentarza
Share on other sites

Wbrew pozorom wiele osób uważa, że istnieje tylko jedno rozwiązanie. Wcześniej ethanak, napisał, że

2 * 2 = 4

Jeśli sprzedasz mu kalkulator (tak kiedyś liczył ten z windowsa), gdzie:

2 * 2 = 3,9999999999

Może jednak narzekać (jak przystało na artystyczną duszę).

Problem polega na tym, że większość użytkowników oczekuje pełnego zakresu: czyli powiedzmy wyników od 0 do 5V. Natomiast licząc "poprawnie", czyli po inżyniersku dostaną trochę mniej.

Sztuczka z używaniem 1023 zamiast 1024 sprawia, że użytkownik dostaje to czego oczekiwał. Jak przekręci potencjometr w lewo ma 0V, w prawo 5V - jest zadowolony i szczęśliwy oraz dumny że opanował Arduino.

Z drugiej strony inżynier, albo chociaż absolwent podstawowego kursu metrologii powie, że to zupełnie niepoprawne.

Stąd były moje próby prównania różnych rozwiązań:

a) prostego, w pełnie inżynierskiego dzielenia przez 1024 bez znieczulenia i zaokrąglenia

b) poprawki o 0.5LB, która niestety niewiele wnosi

c) użycie niepoprawnego dzielenia przez 1023, które jednak daje efekty najbliższe oczekiwaniom użytkownika

Link do komentarza
Share on other sites

I myślisz, że ten "użytkownik", który właśnie wziął do ręki Arduino i pierwszy raz w życiu podłączył potencjometr nie jest w stanie zrozumieć idei i wzorów opisujących przetwornik ADC tylko trzeba mu naciągać wyniki żeby nie zadawał pytań i był "zadowolony i szczęśliwy"?

Acha 😐

Moje obserwacje są zupełnie inne, ale jeśli jest jak mówisz to marny nasz los.

Link do komentarza
Share on other sites

Ja raczej rozumiem użytkownika WRata, który pisze że dzielenie przez 1023 jest poprawne. Kiedyś sam tak myślałem, na szczęście uważałem na zajęciach z metrologii i teraz wiem zarówno co myśli początkujący, jak i inżynier.

W każdym razie chciałem wykorzystać ten temat nie do biadolenia, ale wytłumaczenia innym, być może początkującym (a może nie), pewnych niuansów związanych za działaniem przetwornika ADC.

To co już chyba wszyscy wiemy: wyniki są obarczone błędami. Co więcej nie dostajemy jednej wartości, ale "przedział".

Natomiast chcąc zaprezentować wynik użytkownikowi, musimy to co odczytaliśmy odpowiednio dostosować - i tutaj jest o wiele więcej możliwości i opcji niż się wydaje. Można na różne sposoby skalować zakresy, zaokrąglać, warto byłoby jeszcze uśredniać wyniki. W każdym razie ten temat daje szansę na podzielenie się wiedzą i doświadczeniem z innymi użytkownikami forum.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Chwila moment.

Odejdźmy na chwilę od niuansów metrologii.

Załóżmy istnienie prostego termometru o zakresie od zera do 20° i dokładności 0.1°. Możemy utonąć w dyskusji na temat dokładności pomiaru, przedziałów i tak dalej...

Tyle, że wyświetlacz takiego termometru powinien wyświetlać wyniki z przedziału obustronnie domkniętego [0.0..20.0], a nie [0.0..20.0) (gdzie w rzeczywistości maksymalną temperaturą wyświetlaną byłaby 19.9°).

Oczywiście - zarówno przy dzieleniu przez 2^n-1, jak i przez 2^n wyniki będą obarczone pewnym błędem. Tyle, że w przypadku 2^n-1 wyniki są jakby nieco bliższe prawdy: 0.0 oznacza "coś bliskiego 0, może nieco więcej", 20.0 to "coś bliskiego 20, może nieco mniej". W przypadku 2^n wynik 19.9 oznacza "nie mniej niż 19.9, a może nawet 20".

Jak to się ma do teorii? Który wynik jest piękniejszy i prawidłowszy? 🙂

Link do komentarza
Share on other sites

ethanak, lubię Twoje podejście - warto czasem postawić się w roli użytkownika.

Po inżyniersku, termometr wyświetlający zakres 0-19.9 jest w 100% sprawny. Jednak użytkownik może to widzieć zupełnie inaczej.

Rozwiązanie z dzieleniem przez 2^n-1 jest jedną z możliwości obejścia tego problemu. Jednak to wcale nie najlepsza opcja.

Okazuje się, że dostajemy 20.0 tylko dla maksymalnej wartości, czyli powiedzmy 1023. Okazuje się że rzeczywisty przetwornik może nam nigdy tej wartości nie zwracać. Więc powinniśmy pomyśleć nad innym rozwiązaniem.

Marek już o tym wspominał - zamiast dzielić przez 1023, lepiej sztucznie podwyższyć zakres. Czyli zamiast przez 5 mnożyć przez 5.005 - wartość trzeba oczywiście obliczyć.

Wtedy cały najwyższy zakres da nam największą wartość.

Teraz nie mogę się rozpisać, ale może warto żeby ktoś ten wzór wyprowadził i zapisał. Wydaje mi się, że to może być przydatne dla początkujących.

Jest jeszcze co najmniej jedna rzecz warta uwagi - kalibracja. Zakładamy że przetwornik i czujnik jest idealny, ale rzeczywistość bywa inna. Więc warto byłoby wspomnieć jakie mogą być wzory jeśli dodamy kalibrację.

Link do komentarza
Share on other sites

Ładne bo kolorowe, tyle że to bzdura.

Między 0 a Vref są 1024 przedziały a nie jak na rysunku tylko 1023. To samo lepiej widać po lewej stronie, na przykładzie ADC 2-bitowego (ha, mój pomysł): tam powinny być 4 przedziały a wynik 11 dostajesz już od 3/4 wysokości a nie powyżej Vref. Jeśli nie wierzysz, odrzuć 8 młodszych bitów z wyniku arduinowego przetwornika 10-bitowego i narysuj sobie kiedy i jakie kombinacje dostajesz z dwóch najstarszych bitów...

Ktoś się narobił na bezdurno zmyślając jak mu pasuje, przykro mi.

Rany, naprawdę tyle trzeba bić pianę by to zrozumieć? Czy poniższe zdanie z dokumentacji producenta Cię przekonuje?

"0x000 represents analog ground, and 0x3FF represents the selected reference voltage minus one LSB"

Podkreślenie moje. Stan 3FF dostajesz poniżej Vref a nie powyżej.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.