logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak dokładnie mierzyć napięcie w Atmega32 z użyciem ADC i Bascom?

MagicMarcus 15 Paź 2004 09:41 14777 22
REKLAMA
  • #1 913798
    MagicMarcus
    Poziom 13  
    Posty: 142
    Pomógł: 1
    Ocena: 6
    Witam!
    Proszę o podpowiedź jak obliczyć wartość napięcia podaną na dany kanał przetwornika a/d.
    Programuję w bascomie.
    Ustawiam "reference" ADC na AVCC.
    Zapisuję wartość odczytaną z kanału do zmiennej powiedzmy abc.
    Następnie stosuję wzór: abc*(napięcie_odniesienia/1024).
    Napiecie_odniesienia=napięcie odczytane miernikiem.
    Niestety wynik pomiaru różni się od mierzonego miernikiem na samym wejściu kanału. :-(
    Próbowałem ustawić "reference" na internal (2.56V) ale w tym przypadku należałoby raczej napewno zmienić wzór??
    Mogę prosić o podpowiedzi??
    Dodam, że potrzebuję odczyt mV. I tak: na wej. mam np. 0.94V a odczytane jest 1.1V.
    Zależy mi na dokładności 10mV. Chciałbym odczytywać spadki napięć na LM335. Da się??
    Dziękuję
    Marek
  • REKLAMA
  • #2 913843
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Witam !
    Wzór jest prawidłowy. Pamiętaj tylko, że jeśli stosujesz wewnętrzne źródło odniesienia 2.56 V to odłącz zewnętrzne źródło na wejściu AREF (pozostaw je "w powietrzu"). AVCC podłącz przez dławik 10 uH do VCC i przez kondensator 100 nF do masy (redukcja szumów, 208 strona PDFa).
    Pozdrawiam...
  • #3 913844
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    A na którą "nogę" i co procesor dostaje ?
    1. Może podpiąć sie pod AREF z jakiegoś pewnego źródła odniesienia, albo wewnętrzne ? Wzór ten sam, tylko właśnie to napięcie _najpierw_ (większa dokładność) mnożysz przez wynik, potem dzielisz przez 1024. Napięcie AVCC może nie być pewnym żródłem odniesienia(jak kolega wspomniał, podłączać przez filtr), bo zależy od obciążenia i te 10 mV to skacze przy byle "ruszeniu nogą".
    2. "The ADC is optimized for analog signals with an output impedance of approximately 10 kΩ or less." - jak ma się impedancja wyjściowa mierzonego napięcia ?
    3.Pomiar jest w "sleep mode" (minimalizacja zakłóceń) ?
  • #4 913860
    MagicMarcus
    Poziom 13  
    Posty: 142
    Pomógł: 1
    Ocena: 6
    Podłączone mam tak jak napisal Jaca.
    Dodatkowo aref przez kondensator do masy.
    I caly czas ten błąd.
    A jaki musi być wzór przy napięciu odniesienia wewnętrznym (te 2.56V)??
    Dziękuję
    Marek
  • REKLAMA
  • #6 913866
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Taki jak napisałeś:
    V=abc*(napięcie_odniesienia/1024).
    napiecie_odniesienia=2.56, czyli
    V=abc*0,0025

    ps. sprawdź, czy błąd pomiaru jest stały w całym zakresie mierzonego napięcia. Jeśli tak jest to wstaw do wzoru wartość offsetu:
    abc=abc+Offset (lub abc=abc-Offset)
    V=abc*0,0025
  • REKLAMA
  • #7 913870
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Panowie, kolejność działań ma znaczenie dla dokładności, poza tym napisałem sporo wyżej... ;)
  • #8 913875
    MagicMarcus
    Poziom 13  
    Posty: 142
    Pomógł: 1
    Ocena: 6
    Coś mi nie pasuje:
    1. Napięcie odniesienia AVCC=5V
    2. Napięcie odniesienia Internal=2.56V

    Przy wzorze napiecie=(abc*napiecie_odniesienia)/1024 będą różne wyniki.
    ??
    No chyba, że przy zmianie napięcia odniesienia zmienia się odczyt z kanału(abc).
  • #9 913878
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    AVCC nie jest napięciem odniesienia. AVCC to zasilanie dla układu przetworników ADC oraz portu A. AREF to zewnętrzne napięcie odniesienia.
  • #11 913893
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    MagicMarcus napisał:
    Coś mi nie pasuje:
    No chyba, że przy zmianie napięcia odniesienia zmienia się odczyt z kanału(abc).

    Odczyt jest proporcjonalny do ustawionego napiecia odniesienia.
    Np. ustawiasz wewnętrzne Vref=2,56V, mierzysz 1.28V, to wynik będzie 512 itd.
  • REKLAMA
  • #12 913901
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Jeśli używasz wewnętrznego napięcia odniesienia to AREF procka jest niewykorzystane. Wewnętrzne napięcie odniesienia jest tworzone wewnątrz procka. Jakiekolwiek podłączenie napięcia do AREF gdy używamy wewnętrznego napięcia referencyjnego będzie powodować błędy pomiaru.
  • #14 913919
    MagicMarcus
    Poziom 13  
    Posty: 142
    Pomógł: 1
    Ocena: 6
    Usunę kondensator z Aref, ustawię reference na internal i poprawię kolejnośc działań we wzorze. Jak nie pomoże to sprawdzę też liniowość tego błędu i ewentualnie wprowadzę poprawkę.
    W poniedziałek dam znać jak mi poszło.
    Dziękuję
    Marek
  • #15 913953
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    To nie takie proste. Dużo zależy od tego w jaki sposób doprowadzasz sygnał. Po drugie te wewnętrzne źródła odniesienia z AVRów mają spory rozrzut (o ile się nie mylę od 2,3 do 2,7V) więc ustalanei sztywnego wzoru nie ma sensu.
    Po trzecie zakłócenia - jeżeli masz źle zrobioną płytkę, kiepski wzmacniacz itp. to skutkuje zakłóceniami i "pływającymi" pomiarami. Tu najlepiej by było jakbyś miał możliwoaść wpięcia oscyloskopu - zobaczysz czy na wejście ADC przychdzi czyste napięcie czy nie.
    Jaca: Poczytaj manuala do AVRów - Można programowow wybrać jako napięcie odniesienia napięcie końcówki AVCC. Na Aref musi być kondensator kiedy chcesz używać wewnętrznego źródła napięcia odniesienia.
  • #16 919984
    MagicMarcus
    Poziom 13  
    Posty: 142
    Pomógł: 1
    Ocena: 6
    Poprawilem wzór, kombinowałem z różnymi ustawieniami i dalej to samo.
    Zauważyłem coś ciekawego: napięcie zasilania mam 5.18V, napięcie na PCF8583 mam 4.48 (zmniejszone ponieważ puściłem przez diodę). Przylutowałem przewód bezpośrednio z nużki procka do nużki tego PCF i tu ciekawostka. Procek pokazuje napięcie na tej nużce 5.11V ale jak przyłożę końcówkę miernika to miernik pokazuje 4.48V a procek 4.50V czyli mniej więcej tak jak powinno być??!! Strasznie dziwne.
    Taki mam wzór:
    $crystal = 4000000
    Config Porta = &B00000000
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    dim napiecie_pomocnicze as integer
    dim napiecie_pomocnicze1 as single
    dim napiecie as single
    napiecie_pomocnicze=getadc(kanal)
    napiecie_pomocnicze=getadc(kanal)
    napiecie_pomocnicze1=napiecie_pomocnicze 'zamieniam na single(kombinuję jak mogę)
    napiecie=napiecie_pomocnicze1*5.18
    napiecie=napiecie/1024
    Zauważyłem też, że jak końcówka "wisi" w powietrzu to napięcia odczytywane są różne, nie 0.
    Co Wy na to??
  • #17 919990
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Sprawdzałeś zakłucenia i "pływające" potencjały na płytce? Jak masz zrobione masy analogową i cyfrową? W jaki sposób połączone?
  • #18 919995
    domin0
    Poziom 12  
    Posty: 54
    tez chce zrobic cosik takiego na atmega8535 i strasznie lata wartosc z pomiaru , ma moze ktos procedurke w C ktora przepatruje wszystkie wejscia przetwornika A/C
  • #19 920017
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    ADMUX=0x40; //Uref-AVCC
    ADCSRA=0x85;
    SFIOR&=0xEF;

    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input|0x40;
    ADCSRA|=0x40;
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
    }


    void main(void)
    {
    unsigned int adc_in[4];
    unsigned char i;

    for(i=0;i<5;i++)
    {
    adc_in[i]=read_adc(i)
    }
    }

    W wyniku masz w tabeli adc_in pomiary z 4 kanałów prztwornika. (Program był pisany dla ATmega8). To jest oczywiście tylko idea, opócz tego trzeba pamiętać o konfiguracji pinów proca itd.
    Napiszę to jeszcze raz: duże znaczenie dla poprawności i stabilności pomiaru ma wykonanie płytki, szczególnie prowadzenie masy.
  • #20 920034
    MagicMarcus
    Poziom 13  
    Posty: 142
    Pomógł: 1
    Ocena: 6
    Masę analogową i cyfrową mam wspólną.
    W załaczniku przedstawiam sposób zasilania i podłaczenia źródła do procka.
    Załączniki:
    • podlaczenie_napiecia.zip (3.78 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #21 920039
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    No i tu właśnie może być pies pogrzebany. Masy powinno się rozdzielać - połączenie w jednym punkcie. Jeżeli masz taką możliwość pooglądaj sobie przebiegi w poszczególnych punktach układu oscyloskopem - wtedy będziesz wiedział wszystko.
  • #22 922425
    MagicMarcus
    Poziom 13  
    Posty: 142
    Pomógł: 1
    Ocena: 6
    Sprawa wygląda następująco: po podłączeniu źródła do procka i masy źródła do minusa zaraz za zasilaczem odczyt z procka w porównaniu z miernikiem różni się o 2mV. Wydaje mi się, że jest to satysfakcjonujący wynik. Natomiast mierząc prockiem napięcia na płytce wyniki są błędne ale to może właśbnie przez tą masę cyfrową.
    Dzięki
  • #23 8097351
    luki55
    Poziom 20  
    Posty: 520
    Pomógł: 15
    Ocena: 39
    Witam
    Zrobiłem sobie wyświetlacz na ATmega32 do samochodu (m.in. woltomierz też), i wszystko było ok dopóki nie podłączyłem tego do samochodu (wcześniej testowałem na zasilaczu laboratoryjnym i wszystko było ok. W samochodzie też jest ok, dopóki nie odpalę. Napięcie skacze ok. ±100mV od prawidłowej wartości w instalacji. Na wolnych obrotach w instalacji mam ok. 14,1 ± max 5mV.
    Procek to Atmega32 z zew. kwarcem 10Mhz (fuse bity odpowiednio ustawione).
    Zasilacz dioda 1N4007 na wejściu kondesator 470µF , 100n oraz 100µF i 100n za stabilizatorem. Do pomiaru "wyorzystuje" napięcie na AVcc (zasilane przez filtr 10µH do +5V i 100n do masy), do Aref mam podłączony również kondesator 100n do masy. Korzystam z kanału 0. Dzielnik pomiarowy to 4 x 2,67kΩ 1% odczyt wykonuje na jednym takim rezystorze zblokowanym dodatkowo kondesatorem 100n.(czyli impedancja wejściowa zgodnie z notą jest ok.) Masy mam połączone na płytce bezpośrednio nóżka 31 z 18. (i być może tu jest problem). Tylko nie wiem czy masa na 31. to analogowa? Bo w Atmega8 jest oznaczona specjalnie jako AGnd. Czy jeśli ta masa 31 to analogowa to mam ją pociągnąć bezpośrednio do instalacji w której mierze dane napięcie?
    Nie mam niestety możliwości sprawdzić to oscyloskopem :/ Czy może zastosować jakiś dodatkowy dławik na wejściu zasilacza? Np. taki z zasilacza ATX.

    Proszę o jakieś sugestie.

    Zamieszczam kod (ale to książkowa wersja):
    Start Adc
    Cursor Off
    
    Wart_ac = Getadc(0)
    
    V = Wart_ac * 0.0049
    
    X = V * 4
    
    P = Fusing(x , "#.&")
    Locate 3 , 1
    Lcd "Napi" ; Chr(3) ; "cie:" ;
    Locate 3 , 16
    Lcd P ; "V"


    Pozdrawiam z góry dziękuje

Podsumowanie tematu

✨ Dyskusja dotyczy dokładnego pomiaru napięcia za pomocą przetwornika ADC w mikrokontrolerze Atmega32 programowanym w Bascomie. Użytkownik stosuje wzór V = abc * (napięcie_odniesienia / 1024), gdzie abc to odczyt ADC, a napięcie odniesienia to AVCC lub wewnętrzne 2,56 V. Wskazano, że wzór pozostaje ten sam niezależnie od źródła odniesienia, jednak ważne jest prawidłowe ustawienie referencji i odłączenie napięcia na pinie AREF przy użyciu wewnętrznego Vref. Podkreślono konieczność stosowania filtrów (dławik 10 µH, kondensator 100 nF) na linii AVCC dla redukcji szumów oraz odpowiedniego uziemienia masy analogowej i cyfrowej, najlepiej rozdzielonej i połączonej w jednym punkcie. Zwrócono uwagę na wpływ impedancji źródła sygnału (zalecana ≤10 kΩ) oraz na możliwość występowania offsetu i zakłóceń powodujących rozbieżności pomiarów. Wskazano, że wewnętrzne źródło odniesienia ma rozrzut napięcia (ok. 2,3–2,7 V), co wymaga kalibracji i ewentualnego wprowadzenia korekty offsetu. Przykładowy kod w Bascom i C pokazano dla konfiguracji ADC i odczytu z kanałów. Omówiono także problemy z pomiarami w warunkach rzeczywistych, np. w samochodzie, gdzie napięcie zasilania jest niestabilne, oraz wpływ złego uziemienia i zakłóceń na dokładność pomiarów. Ostatecznie uznano, że przy prawidłowym uziemieniu i kalibracji można osiągnąć dokładność rzędu kilku mV, co jest wystarczające do pomiaru spadków napięć na czujnikach LM335.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA