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

ADC i resetowanie prescalera

Jakub17 10 Lut 2018 11:26 504 5
  • #1 10 Lut 2018 11:26
    Jakub17
    Poziom 6  

    Witam

    Program dokonuje pomiaru temperatury na jednym wejsciu ATmega8, nastepnie przełącza się na inne wejście, dokonuje pomiaru który jest przeliczany na kąt ustawienia wału w silniku krokowym. Zmiany kąta dokonywane są za pomocą potencjometru. Wyniki pomiarów temperatury oraz kąt obrotu silnika wyświetlane są na wyświetlaczu LCD. Program działa. Pytanie moje jest takie:

    Dlaczego po przełączeniu na inny kanał przetwornika potrafi mi się zmienić czasami wartość, która nie jest w tej chwili mierzona. Tzn. ustawiając gałkę sterującą silnikiem krokowym, czasami nastąpi skok temperatury wyświetlanej na LCD albo wyświetlenie jakiś bzdur przy pierwszym pomiarze na nowym kanale, później wszystko wraca do normy. Silnik raczej nie zakłóca pracy przetwornika, bo jest z dala od układu.

    Algorytm mam taki:
    1. Dokonuje pomiaru.
    2. Wyłączam przetwornik
    3. Przełączam wejście na inne
    4. Dokonuję innego pomiaru.
    5. Wyłączam przetwornik.

    Myślałem, że może reset prescalera przetwornika mógłby pomóc, ale nie ma takiej możliwości chyba (dokumentacja nic o tym nie mówi, jest rejestr SFIOR ale do resetowania prescalerów timerów)

    Zeby nie rozciągać tematu zamieszczę tylko funkcję inicjalizującą ADC oraz funkcję dokonującą pomiarów. W main() po każdym wyłączeniu ADC dodaję też krótki delay przed włączeniem go na innym kanale, ale i tak nie pomaga.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 5
  • Pomocny post
    #2 10 Lut 2018 15:16
    excray
    Poziom 39  

    Po tym jak ustalisz wejście musisz dać kilka uS czasu na ustalenie się napięcia na wejściu ADC zanim wywołasz konwersję. Generalnie DS zaleca nawet odrzucenie pierwszego pomiaru po zmianie kanału.

    0
  • Pomocny post
    #3 10 Lut 2018 17:38
    atom1477
    Poziom 43  

    Problemem jest wyłączanie przetwornika.
    Przetworniki w ATMegach dają pierwszy pomiar błędny (wynika to z jakiejś wewnętrznej kalibracji przetwornika po włączeniu).
    Dlatego przetwornik trzeba włączyć raz.
    A później włączać i wyłączać jedynie konwersje, a nie cały przetwornik.

    Dodatkowo proponuję używać osobnej funkcji do pomiarów i osobnej do ustawiania ponów. Będzie przejrzyściej i kod będzie łatwiejszy w edycji. Będzie np. można użyć funkcji od pomiarów w innym miejscu.
    Ja mam tak. Na początku maina włączenie przetwornika:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    A funkcja pomiarów ADC:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I tam gdzie trzeba to sobie ją wywołuję, np. tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 22 Lut 2018 23:16
    Theotus
    Poziom 2  

    Powinieneś połączyć dwa powyższe rozwiązania , które zaproponowali koledzy.
    Po pierwsze odrzuć pierwszy pomiar. Ma to związek z metodą przełączania kanałów wejściowych przetwornika wewnątrz mikro. Zwłaszcza wtedy jeśli pomiary między wejściami mogą się znacznie od siebie różnić (pomiar jednego może wpłynąć na wartość drugiego).
    Po drugie, wykonaj kilka pomiarów (choćby np.5) i uśrednij. Po zakończeniu każdego pomiaru (z tych 5) możesz dać opóźnienie (równe czasowi wykonania pomiaru, można to obliczyć łatwo), co dodatkowo przybliży cię do pomiaru rzeczywistego.
    Zorientuj się w dokumentacji, czy ewentualne przerwania, które może masz w programie,mogą zakłócić pomiar. Mam w swoich kilku programach na ATmegach wprowadzone bloki zatrzymujące (przed pomiarem) i wznawiające (po pomiarze) przerwania.

    0
  • #5 23 Lut 2018 00:20
    ex-or
    Poziom 14  

    Theotus napisał:
    Mam w swoich kilku programach na ATmegach wprowadzone bloki zatrzymujące (przed pomiarem) i wznawiające (po pomiarze) przerwania.

    Przerwania to raczej nie mają wpływu na wynik pomiaru. Nie bardziej niż kod wykonywany poza przerwaniem. Więc nie wiem po co to.
    No chyba, że chodzi Ci o usypianie procka na czas pomiaru z wyłączeniem przerwań by zapobiec przedwczesnemu wybudzeniu.
    No właśnie. Nie było jeszcze o tym mowy: jeśli reszta programu na to pozwala, warto na czas pomiaru, dla zmniejszenia zakłóceń uśpić µC - jest to opisane w rozdziale "ADC Noise Canceller" datasheeta.

    0
  • #6 23 Lut 2018 11:55
    3099750
    Użytkownik usunął konto