Elektroda.pl
Elektroda.pl
X
PLC Fatek
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AVR ATmega328][C] - przetwornik adc, wpływ obciążenia

joker1309 19 Gru 2014 21:14 2835 32
  • #1 19 Gru 2014 21:14
    joker1309
    Poziom 11  

    Witam,
    mam "dziwny" problem z uC atmega328P. mam układ zbudowany z lcd na HD44780, czujnika temp lm35dz oraz diody led. Układ zachowuje się w dziwny sposób. Program wygląda tak :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    chodzi o to że jak dioda jest w programie, ale ją fizycznie odłączę to program działa w 100% poprawnie, lcd nie przeskakuje albo jest "A" albo "B" ( zalezenie czy ogrzeje czujnik) jeżeli ją włożę do układu to czasami w momencie zapalania się diody na lcd jest "A", czyli program wchodzi do pętli w do której nie ma prawa wejść, a gdy dioda zgaśnie ponownie na lcd jest "B" - im częściej przyjdzie przerwanie od timera tym więcej i częściej występuje to zjawisko. Jest pętla histerezy 0,5st.C więc to nie zależy od tego, i bez fizycznie podłączonej diody ten sam program działa stabilnie. Z diodą przy zmienianiu się z A na B (co nie następuje odrazu, z powodu zastosowania pętli histerezy) program głupieje ( tak gdyby w momencie zapalania się diody odczytywał niższą wartość z przetwornika adc).TAKA SAMA SYTUACJA JEST JAK ZAMIAST DIODY PODŁĄCZE BUZZER Z GENERATOREM.


    czasami raz się przełączy wyświetlacz, czasami 3 a czasami ani razu.

    Ktoś ma jakiś pomysł ? Wpadłem na rozwiązanie że obciążenie uC ma wpływ na Uref przetwornika ADC, ale przecież lcd jest połączone cały czas.

    0 29
  • Semicon
  • #4 19 Gru 2014 21:53
    joker1309
    Poziom 11  

    joker1309 napisał:
    Program:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    schemat załącznik.


    edit: na schemacie nie ma ale Vref jest podłączony do gnd przez kondensator 100n. Jakieś pomysły ? GDY WYJME DIODE UKLAD DZIALA DOBRZE !

    0
  • #5 19 Gru 2014 21:58
    piotrva
    Moderator na urlopie...

    Mała uwaga - umieść schemat jako obrazek (z eagle można wyeksportować do pliku graficznego) - wtedy będziemy mogli szybciej go otworzyć.

    do schematu:
    1. to wyprowadzenie LCD podpięte do PB6 - zwykle oznacza się takie połączenia po 2 stronach nazwą sygnału - czyli pd PB6 powinna być etykietka D7 i takaż sama powinna być przy LCD. Taka uwaga stylistyczna. Zrobiłeś to OK przy złączu programatora.
    2. AREF nie podłączamy do zasilania! To nie ma praktycznego sensu - zamiast tego dałbym kondensator 100nF do masy.
    3. Na zasilanie i masę mamy w Eagle dedykowane symbole - korzystaj z nich.

    Program (na szybko):
    1. pętlę while odlicz zastąp raczej instrukcją if.
    2. Czy jesteś pewien, ze zmienna z buforem na tekst (sprintf) jest dostatecznie długa?

    0
  • #6 20 Gru 2014 00:26
    joker1309
    Poziom 11  

    Schemat na szybko rysowałem żeby wrzuć, aref nie jest podłączony do zasilania jak napisałem wyżej aref jest przez kondensator 100n podpięty do GND. problem nie leży w programie tylko z jakiegoś powodu gdy dioda się zapali to jest zły odczyt z czujnika. Pętlę zmienie : ), problem w tym że nie dzieje się tak zawsze

    Dodano po 1 [godziny] 14 [minuty]:

    wywnioskowałem że miganie diodą wprowadza zbyt duże zakłócenia. Znalazłem 2 rozwiązania :
    -tryb uśpienia na czas pomiaru, ale nie wiem jak go zaprogramować i jak on dokładnie działa,
    -podłączenie diody przez tranzysotr ( żeby obniżyć prąd wypływający z uC) - mam trazystory NPN BC547B- mogę je jakoś wykorzystać ?

    Dodano po 1 [godziny] 10 [minuty]:

    Mam książkę Tomasza Francuza i w roz15. jest opisany tryb uśpienia, jednak nie za bardzo to ruzmiem, chyba że ten kod jest niekompletny ( np. nigdzie nie ustawia sie dla jakiego wejscia ma byc mierzone napięcie) . Czy ta linijka :

    set_sleep_mode(SLEEP_MODE_ADC);

    automatycznie "mówi" uC że ma mierzyć napięcie po uśpieniu ? Jak tak to skąd ma wiedzieć gdzie mierzyć, na jakim wejściu ?

    0
  • Semicon
  • #7 20 Gru 2014 00:35
    dondu
    Moderator Mikrokontrolery Projektowanie

    joker1309 napisał:
    automatycznie "mówi" uC że ma mierzyć napięcie po uśpieniu ? Jak tak to skąd ma wiedzieć gdzie mierzyć, na jakim wejściu ?

    Na tym, które wcześniej ustawisz - patrz kilka stron wcześniej punkt: Multiplekser
    To tak jak z instrukcją samochodu - w punkcie o skrzyni biegów nie jest napisane, że po wrzuceniu jedynki auto pojedzie w lewo - to jest w rozdziale o kierownicy :)

    A co do zakłóceń vs ADC to lektura: http://mikrokontrolery.blogspot.com/2011/03/avr-adc-podlaczenie.html

    0
  • #8 20 Gru 2014 11:47
    BlueDraco
    Specjalista - Mikrokontrolery

    Mi na tym schemacie brakuje przynajmniej kilku kondensatorów (na VREF, przy LCD, na zasilaniu i na wyjściu czujnika. Nie wiemy też nic o źródle zasilania. Zgaduję, że jest ono daleko i ma małą wydajność prądową, wskutek czego np. załączenie LED powoduje skoki napięcia wszędzie. W takiej sytuacji pomiar w uśpieniu nic nie pomoże, bo problem nie leży w szumach ATmega, a w skokach zasilania. Dorzuć 4..5 kondensatorów tam, gdzie trzeba, w tym jakieś 470 uF na wejściu zasilania, dodaj programowe filtrowanie pomiarów, sprawdź/popraw zasilanie i może coś z tego będzie.

    0
  • #9 20 Gru 2014 12:39
    joker1309
    Poziom 11  

    zasilanie mam z USBasp, ale mam zasilacz 5V/2,5A podłącze go i da znać, aby to działało muszę GND programatora podłączyć z masą zasilacza tak ? Czy zasilacz impulsowy mogę włączyć gdy przewód wyjściowy będzie włożony do układu? Czy jak nazwa wskasuje będzie jakiś impuls który może coś uszkodzic ? Taki mam :

    http://botland.com.pl/zasilacze-sieciowe-5-v/1364-zasilacz-impulsowy-5v-25a-dc-5521.html

    Dodałem 5 kondensatorów do układy ( 4x 100nF ceramicznych i 1x 10uF elektrolit) i to nie zmieniło za dużo.

    Zmierzone napięcie na wyjściu zasilacza wyniosło 5,5V, Czekam na odpowiedź o:
    "Czy jak nazwa wskasuje będzie jakiś impuls który może coś uszkodzic ?"
    Nim podłącze do układu : )

    0
  • #10 20 Gru 2014 12:51
    tronics
    Poziom 36  

    Cytat:
    zasilanie mam z USBasp

    Pewnie jeszcze przez zworkę... Nie chcę kolegi zmartwić, ale przy układzie z LCD zasilanie z USB o napięciu 5.05V spadało "po drodze" (czyli 3 złącza - USB, jumper na goldpinach i wreszcie IDC10) do 4.8V! Jakoś zawsze najpewniej działają mi płytki z zasilaniem własnym, a nie pasożytniczo przez interfejs programowania.

    0
  • #12 20 Gru 2014 15:07
    joker1309
    Poziom 11  

    Mam włączone źródło 1,1V na adc.
    przy zasilaczu 5V 2,5A jest taka sama sytuacja. Co jeszcze może być nie tak ?

    0
  • #13 20 Gru 2014 16:48
    emarcus
    Poziom 35  

    joker1309 napisał:


    Dodałem 5 kondensatorów do układy ( 4x 100nF ceramicznych i 1x 10uF elektrolit) i to nie zmieniło za dużo.


    To dobrze...
    Ale datasheet mówi jeszcze żę:(cyt.)
    "1.1.7 AVCC
    AVCC is the supply voltage pin for the A/D Converter, PC3:0, and ADC7:6. It should be externally connected to VCC, even if the ADC is not used.
    If the ADC is used, it should be connected to VCC through a low-pass filter.
    "
    Zdaje się że używasz ADC....(?)
    Zazwyczaj ten 'filter' jest L-C.

    e marcus

    0
  • #14 20 Gru 2014 16:55
    joker1309
    Poziom 11  

    Nie mam cewki : d.
    Narazie mam :
    Dużo kondensatorów filtrujących
    zasilacz zewnętrzny 5V/2,5A
    Program z uśpieniem na czas pomiaru:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i dalej podczas mrugania przeskakuje : d. Co z tymi tranzystorami co mam NPN BC547B- mogę je jakoś wykorzystać ? Tak żeby brały prąd z źródła a uC tylko otwierał bramkę ?

    edit: zrobiłem taki program żeby każdy pomiar był wykonywany przy takim samym stanie diody czyli tak zmieniłem końcówkę programu :
    Kod: c
    Zaloguj się, aby zobaczyć kod


    i wskazania są stabilne, ale to jest dziwne rozwiązanie tego problemu chyba : d, wolałbym użyć tranzystorów.

    0
  • #15 20 Gru 2014 17:21
    BlueDraco
    Specjalista - Mikrokontrolery

    Na moje oko masz problem z zasilaniem - źródłem, doprowadzeniem i filtrowaniem, a nie z brakiem tranzystora przy diodzie. Może np. gdzież masz niepewne połączenie masy lub plusa do uC.

    0
  • #17 20 Gru 2014 17:31
    joker1309
    Poziom 11  

    Sprawdzałem przewody wszystkie mają przejście ( są to krótkie pół centymetrowe zworki). zasilania z dwóch różnych źródeł i taki sam efekt. Chociaż wiem jaki jest powód, gdy dioda jest zapalona to prąd przez nią płynący tworzy zakłócenia pomiaru wewnątrz uC. Czy filtr LC może to w jakiś sposób naprawić ? Gdyby ten prąd obniżyć ( czyli puścić przez tranzystor) to by zakłócenia były mniejsze, bo są one rzędu 5mV, co daje przekłamanie o pół stopnia.

    edit: uC nigdy nawet się nie zagrzał, a adc pracuje tak od drugiego programu, gdy dodałem mrugającą diodę to zauważyłem, pierwszy był taki sam ale bez diody mrugającej : P

    0
  • #19 20 Gru 2014 17:53
    joker1309
    Poziom 11  

    Sprawdziłem inne wejście i jest to samo. Jednak zastanawia mnie to dlaczego jak wejscie analogowe nie jest nigdzie podłączone to uC odczytuje maxymalna wartość 1023, to jest normalne ?

    podłączyłem dzielnik napięciowy ( żeby zobaczyć czy czujnik działa ) i jest tak samo. Wrzucam filmik który pokazuje problem ( zasilanie z programatora bo jest wygodniej, a jak podłączyłem zewnętrze układ działał tak samo więc to nie to). uC na zmiane wykonuje pomiary - z zapalną diodą i z zgaszoną diodą.

    0
  • #21 20 Gru 2014 19:32
    joker1309
    Poziom 11  

    był 220, podłączyłem 1,2k i też są przeskoki ale mniejsze ( o około 3). Buzzer podłączałem przez malutki rezystor rzędu 50om. Ale nie powinno być żadnych tak ? A co z tym że jak pin od ADC "wisi" to wskazuje maxymalna wartość 1023 ?

    0
  • Pomocny post
    #22 20 Gru 2014 20:12
    piotrva
    Moderator na urlopie...

    Hmm, wysuwam więc teorię, że upaliłeś procesor.
    Podłączenie buzzera bezpośrednio pod pin procesora w taki sposób, aby wydawał dźwięk raczej mogło zaszkodzić procesorowi.
    Tym bardziej to co piszesz, wskazuje na możliwe uszkodzenie.

    0
  • Pomocny post
    #24 20 Gru 2014 21:17
    Piotr Piechota
    Poziom 21  

    40 mA to Absolute Maximum Ratings* i wyjaśnienie "Exposure to absolute maximum rating
    conditions for extended periods may affect device reliability." oraz "If IIOH exceeds the test condition (20mA), VOH may exceed the related specification. Pins are not guaranteed to source current greater than the listed test condition."
    Więc w praktyce nie należy przekraczać 20mA.

    Troszkę offtopic migająca dioda sygnalizująca pracę USB zakłócała pracę przetwornika DAC na płytce Discovery STM32F4, która powinna być poprawnie zaprojektowana. Musiałem ją wylutować.

    Pozdrawiam

    0
  • Pomocny post
    #25 20 Gru 2014 21:34
    dondu
    Moderator Mikrokontrolery Projektowanie

    Uporządkujmy temat - na pomiary ADC ma wpływ:
    - zastosowane wydajne źródło zasilania,
    - prawidłowe podłączenie zasilania i pinu AREF,
    - poprawne filtrowanie zasilania zgodnie z dokumentacją producenta (w tym filtr LC),
    - rodzaj sygnałów na sąsiednich pinach ADC vs pin pomiarowy (nie powinno być tam sygnałów szybkozmiennych),
    - rozdzielona masa analogowa i cyfrowa,
    - poprawny projekt płytki PCB,
    - poprawne usypianie do tryby ADC Noise Redction,
    - poprawne skonfigurowanie ADC do pomiarów.
    ... oraz jak wskazali koledzy wyżej nie dobijanie mikrokontrolera nadmiernymi prądami: http://mikrokontrolery.blogspot.com/2011/03/datasheet-mikrokontroler-prady-pinow.html

    Dopiero po prawidłowym spełnieniu wszystkich powyższych punktów, możesz oczekiwać bardzo stabilnych pomiarów.

    0
  • Pomocny post
    #26 20 Gru 2014 21:47
    BlueDraco
    Specjalista - Mikrokontrolery

    A ja coraz bardziej stawiam na błąd w podłączeniu zasilania lub wcześniejsze ubicie uC...

    Proponuję zacząć od napisania prostego programu naprzemiennie włączającego i wyłączającego diodę co kilka sekund i sprawdzenie (pomiar) napięć na wszystkich liniach Vcc i GND uC w czasie działania tego programu.

    0
  • #27 20 Gru 2014 23:06
    joker1309
    Poziom 11  

    uC jest sprawny, rozdzieliłem masy AGND i GND i przeskakiwanie przy rezystorze 220 spadło do +/- 2 max 3. W poniedzialek kupie cewke i może jeszcze bardziej da się to zmniejszyć. Ze wszystkich rzeczy jakie zrobiłem oddzielenie AGND i GND oraz AVCC i VCC najbardziej zmniejszyło błąd. Przy takim ustawianiu ( 1,1V ) i przyjmując w uproszczeniu że 1 bit=1mV bład oscyluje już w granicy 2mV. Dzięki za pomoc : ). Jak podłączyć zatem buzzer jaki linkowałem ? jeżeli prąd z uC jest za mały żeby spokojnie go zasilić ?

    0
  • #28 20 Gru 2014 23:32
    dondu
    Moderator Mikrokontrolery Projektowanie

    joker1309 napisał:
    uC jest sprawny, rozdzieliłem masy AGND i GND i ... Ze wszystkich rzeczy jakie zrobiłem oddzielenie AGND i GND ...

    Zrobiłeś PCB w jedną godzinę od mojego postu?
    ... czy po prostu rozdzieliłeś galwanicznie AGnd od GND, czyli są niepodłączone?

    Pisanie tysięcy słów jest zbędne - my posługujemy się schematami, projektami PCB i zdjęciami.
    Bez tego ciągnąć temat będziemy jeszcze kilka dni :)

    0
  • #29 20 Gru 2014 23:45
    joker1309
    Poziom 11  

    mam płytkę stykową, rozdzieliłem zaraz za źródłem w taki sposób:


    [AVR ATmega328][C] - przetwornik adc, wpływ obciążenia



    Edytuj

    0
  • #30 21 Gru 2014 00:48
    dondu
    Moderator Mikrokontrolery Projektowanie

    Czyli AGND i GND są ze sobą połączone przy źródle - OK.

    Dodam tylko dla porządku, że rozdzielenie mas analogowej od cyfrowej dot. przede wszystkim PCB. Takie masy są podzielone, ale połączone w jednym miejscu - przykład: http://mikrokontrolery.blogspot.com/2011/03/RoDonM8-MB-Modul-glowny-CPU-Main-Board.html

    Ale na płytce stykowej także może nieco wnieść dobrego do pomiarów.

    Rozumiem, że nigdzie indziej masy już się nie łączą?
    Jak daleko wyprowadzona jest masa analogowa?
    Pytam o to, czy czasem nie jest do niej podłączony jakiś długi przewód itp - zdjęcia by się przydały ... słowa trzeba pisać, pytać ... i czytać odpowiedzi.

    Dokładny schemat i zdjęcia - szybki rzut oka ... szybka pomoc.

    0