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

[Atmega32][C] zamiana wyników z dwóch kanałów ADC

Nowinil 27 Gru 2011 07:38 1587 7
REKLAMA
  • #1 10307630
    Nowinil
    Poziom 9  
    Nie wiem dlaczego zamienia mi wyniki z odczytu pomiaru przetwornika AC.
    We wcześniejszej funkcji mam inicjalizację rejestrów ADMUX i ADCSRA
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Stosuje napięcie referencyjne zewnętrzne dlatego bity REFS1 i REFS2 rejestru ADMUX ustawiłem na 0 oraz ADLAR(porządek bitowy wyniku) na 0
    Funkcja do ustawiania rejestrów wywoływana jest jednorazowo.
    Pod spodem mój program do obsługi dwóch kanałów.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie wiem dlaczego miesza wyniki. Próbowałem odczytywać ADCW ale to także nie przynosi oczekiwanych rezultatów. Macie jakieś sugestie jak rozwiązać ten problem bo docelowo chciałbym obsługiwać więcej kanałów ADC.
  • REKLAMA
  • #2 10308011
    excray
    Poziom 41  
    Spróbuj tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 10308315
    Nowinil
    Poziom 9  
    Próbowałem zmianą na ADC ale nadal robi jakąś zamianę. Próbowałem osobno wyświetlać kanały do wszystko jest ok. Po podłączeniu kolejnego kanału wynik przesuwa o 1. Czyli powinno być 1:zerowy kanał, 2:pierwszy kanał, 3:trzeci kanał to jest 1:trzeci kanał , 2:pierwszy kanał 3:drugi kanał. Doprowadzenia przewodów sprawdziłem.
  • Pomocny post
    #4 10308353
    excray
    Poziom 41  
    To nie tylko zmiana na ADC. Przeczytaj uważnie kod któy Ci podałem. Jest tam jeszcze jedna zmiana.
  • #5 10308387
    Nowinil
    Poziom 9  
    Dzięki działa poprawnie:)
    Po zmianie
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i usunięciu ustawiania bitu ADIF działa według założeń.
    Mógłbyś jeszcze wytłumaczyć na czym to polega bo wydawało mnie się, że trzeba czekać na koniec konwersji czyli robiąc warunek
    while(ADCSRA&(1<<ADIF);
  • REKLAMA
  • #6 10308429
    excray
    Poziom 41  
    Przecież czekasz. Przeczytaj uważnie o bicie ADSC w manualu. Ten bit ustawiasz sam ale procek po zakończeniu konwersji go zeruje. Więc normalnie ustawiasz bit i sprawdzasz czy dalej jest ustawiony. Jeśli nie - to konwersja została zakończona.
    Jeśli chcesz korzystać z ADIF musisz napisać: while(~(ADCSRA&(1<<ADIF)); bo bit ADIF jest ustawiany dopiero po konwersji. A na dodatek sam musisz go później wyzerować. Zbędny galimatias.
  • REKLAMA
  • #7 10308464
    Nowinil
    Poziom 9  
    Oki ale co się dzieje z bitem ADIF (znacznik zakończenia konwersji)?? trzeba go gdzie zerować?? Z nocie jest napisane, że zakończenie operacji przetwarzania powoduje ustawienie znacznika ADIF. Czyli jak ustawimy nową konwersje czyli bit ADSC ustawimy w stan wysoki to automatycznie ustawia(kasuje) nam bit ADIF na 0??

    Macie jakiś dobry patent na uśrednianie wyników z kilku kanałów??
    Do jednego pomiaru sumowanie kilku pomiarów i podzielenie przez liczbę pomiarów ale nie wiem jaki warunek zastosować żeby działało to dla wszystkich trzech kanałów.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Macie jakieś propozycje żeby zrobić to dla 2 i 3 kanału żeby zgrać to w jedną całość??
  • #8 10310786
    excray
    Poziom 41  
    Nowinil napisał:
    Oki ale co się dzieje z bitem ADIF (znacznik zakończenia konwersji)?? trzeba go gdzie zerować?? Z nocie jest napisane, że zakończenie operacji przetwarzania powoduje ustawienie znacznika ADIF. Czyli jak ustawimy nową konwersje czyli bit ADSC ustawimy w stan wysoki to automatycznie ustawia(kasuje) nam bit ADIF na 0??

    W mikroprocesorze są dzięsiątki bitów które się zerują bądź ustawiają w zależności od tego co się w środku dzieje. Czy wszystkie musisz kasować bądź ustawiać? Nie. Dlatego że tak powiem olej bit ADIF. Chyba że włączysz przerwanie od ADC ale wtedy to już inna bajka. Po pierwszej konwersji bit ADIF zostanie ustawiony i tak już zostanie do końca działania mikroprocesora ale to Ci w niczym nie przeszkadza.
    Nowinil napisał:
    Macie jakiś dobry patent na uśrednianie wyników z kilku kanałów??
    Do jednego pomiaru sumowanie kilku pomiarów i podzielenie przez liczbę pomiarów ale nie wiem jaki warunek zastosować żeby działało to dla wszystkich trzech kanałów.

    Yyy? Rozwiń temat bo nie bardzo rozumiem. Chcesz mieć trzy wyniki uśrednione z trzech kanałów czy jeden z uśrednienia tych trzech kanałów? Nie wiem w czym problem ale możesz poczytać w necie o "średniej kroczącej". Może coś Ci to pomoże.
REKLAMA