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

ATMega8 - [C/C++] Nieprawidłowy odczyt jednego napięcia

mandragor6 27 Lip 2015 21:36 1038 5
REKLAMA
  • #1 14880058
    mandragor6
    Poziom 11  
    Witam
    Zbudowałem sobie zasilacz a do niego układzik z pomiarem napięcia, prądu i temp. radiatora. Pomiar napięć (napięcie wyjściowe-główne oraz napięcie dodatkowe) odbywa się poprzez dzielniki rezystancyjne, prąd za pomocą przetwornika ACS712 20A, temp radiatora LM355.
    Napięcie główne -napięcie wyjściowe zasilacza.
    Napięcie dodatkowe - dodatkowy przewód pomiarowy wyprowadzony z zasilacza.
    Napięcie wyjściowe z ACS712 bezpośrednio podłączone do przetwornika ATMega8.

    Temp. radiatora, napięcie główne oraz prąd wskazywane/mierzone są poprawnie.
    Natomiast napięcie dodatkowe zachowuje się dziwnie.
    Gdy podłącze-zewrę napięcie główne i dodatkowe, napięcie dodatkowe wskazuje taką samą wartość jak główne.
    Gdy zostawię niepodłączone lub zwarte do masy wskazuje 0.
    Ale gdy obciążę zasilacz i popłynie jakiś prąd to również zmienia się wartość napięcia dodatkowego (np. płynie prąd 0.4A a nap. dodatkowe wskazuje 0.78V)
    Gdy zewrę napięcie dodatkowe do masy nadal wskazuje 0.78V. Gdy zewrę napięcie główne i dodatkowe przy płynącym prądzie sumuje się ta wartość tj.:
    nap główne 12V
    prąd 0.4A
    nap dodatkowe 12V + 0.78V

    Zmieniałem wejście pomiarowe przetwornika ATMega, sprawdzałem przewody - od strony fizycznej układu wszystko jest ok.
    Wydaje mi się, że problem tkwi po stronie programowej, ale nie mogę dojść co to może być.

    Jeśli ktoś zauważy błąd w programie lub wie co może być przyczyną to będę wdzięczny.
    Poniżej kod zawierający część główną i obsługę przetwornika ATmega8.

    Temp radiatora - AC0.
    Nap główne - AC4.
    Nap dodatkowe - AC5.
    Prąd - AC2.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 14881040
    Eagle
    Poziom 24  
    Tak na szybko to nie znalazłem nic co mogłoby powodować powyższy opis. Jednak kod, nie obraź się wymaga wielu poprawek:

    1) korzystasz z przerwań do obsługi ADC a na flagę końca konwersji czekasz w pętli
    2) odczyt z ADC wybierasz justowanie do lewej a później pracowicie obliczasz jakby to miało być justowane do prawej.
    3) każda z funkcji zwraca wartość przez zmienną globalną

    ad 1) zrezygnuj z przerwań skoro i tak czekasz w pętli aktywnego czekania. Napisz funkcję która będzie rozpoczynała pomiar, czekała na zakończenie i zwracała zmierzoną wartość. Jako argumenty niech przyjmuje nr chanel.
    ad 2) dużo łatwiej będzie jeśli nie włączysz ADLAR i skorzystasz mniej więcej z takiego czegoś:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Wydaje się dużo czytelniejsze.

    ad 3) Generalnie unikaj zmiennych globalnych. Nie oznacza to że na siłę należy je wyeliminować ale w tym przypadku tylko przy zastosowaniu przerwań wynik mógłby być globalną. Gdy zrezygnujesz z przerwań żadna z globalnych nie będzie potrzebna.

    Jak już uporasz się z powyższym, to zrób stub na funkcję od pomiaru ADC i zobacz czy wyniki są zgodne z oczekiwanymi. W zależności od wyniku testu szukaj w pomiarze albo w przetwarzaniu.
  • REKLAMA
  • #3 14881268
    dondu
    Moderator na urlopie...
    1. Nie definiuj F_CPU w kodzie z tych powodów: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    2. Co to za kombinacje w funkcji przerwania ADC? Wyłącz ADLAR i zrób tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    3. Uwaga kol wyżej, dot. przerwania ADC i jednoczesnego oczekiwania jest istotna. Po co przerwanie skoro i tak czekasz na wynik w pętli? Usuń więc przerwanie i jego inicjację oraz zmienną wynik i wprowadź poprawkę:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    lub ta przerób swój program, by nie było tej pętli,


    4.
    mandragor6 napisał:
    Napięcie główne -napięcie wyjściowe zasilacza.
    Napięcie dodatkowe - dodatkowy przewód pomiarowy wyprowadzony z zasilacza.
    ...
    Natomiast napięcie dodatkowe zachowuje się dziwnie.
    Gdy podłącze-zewrę napięcie główne i dodatkowe, napięcie dodatkowe wskazuje taką samą wartość jak główne.

    Trudno żeby było inaczej skoro są zwarte :)
    Pokaż może jakiś schemat, bo to co opisujesz łatwiej byłoby przeanalizować.
  • REKLAMA
  • #4 14882168
    mandragor6
    Poziom 11  
    Witam
    Dzięki za sugestie. Poprawki naniosłem na program, niestety problem pozostał.

    Dołączam schematy zasilacza.

    ATMega8 - [C/C++] Nieprawidłowy odczyt jednego napięcia ATMega8 - [C/C++] Nieprawidłowy odczyt jednego napięcia

    Poniżej zamieszczam poprawiony kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 14882218
    BlueDraco
    Specjalista - Mikrokontrolery
    Całkowity brak odsprzęgania zasilania plus brak kondensatorów na wejściach ADC - to nie ma prawa działać. Ponadto usmażysz wyjście uC sterujące tranzystore z powodu przekroczenia dopuszczalnego prądu (po co?). Przespaceruj się na mikrokontrolery.blogspot.com i poczytaj o filtrowaniu zasilania.
  • #6 14891069
    mandragor6
    Poziom 11  
    Witam
    Zgadka rozwiązana. Problem tkwił w konstrukcji dodatkowego obwodu pomiarowego.
    Na pomysł dodania dodatkowego obwodu pomiarowego napięcia wpadłem już po wykonaniu płytek. Dlatego potencjometr/dzielnik napięcia dodatkowego umieściłem na zaciskach wyjściowych. Potencjometr wpięty był między masę i wejście napięcia dodatkowego. A problemem był przewód masy, który przebiega obok transformatora chyba on wprowadzał zakłócenia, ponieważ przesunięcie potencjometru do masy zlokalizowanej przy samej płytce rozwiązało problem.

    Dziękuję wszystkim za uwagi co do programu i konstrukcji zasilacza.
REKLAMA