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.

Przetwornik ADC w pętli -

mglowinski93 09 Lis 2015 23:26 1077 13
  • #1 09 Lis 2015 23:26
    mglowinski93
    Poziom 6  

    Witam,
    chciałem zrobić cykliczny odczyt wartości napięcia na mikrokontrolerze ATmega32.
    Kod PRAWIE działa, aby odświeżyć pomiar muszę wgrać panownie program do ATmegi.
    Gdzie może być problem?

    Kod: c
    Zaloguj się, aby zobaczyć kod
    [/tex]

    0 13
  • #3 09 Lis 2015 23:51
    mglowinski93
    Poziom 6  

    Jak w takim razie zrobić automatyczny odczyt wartości?

    0
  • #4 10 Lis 2015 09:20
    Samuraj
    Poziom 35  

    W pętli głównej po odczycie danych z przetwornika ADC przed delay dodaj raz jeszcze Start Conversion ustawiając ADSC w rejestrze ADCSRA.

    0
  • #5 10 Lis 2015 09:27
    mglowinski93
    Poziom 6  

    Niestety, nie pomogło;-/

    0
  • Pomocny post
    #6 10 Lis 2015 09:35
    Samuraj
    Poziom 35  

    Zainicjuj tak przetwornik ADC

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 10 Lis 2015 09:50
    mglowinski93
    Poziom 6  

    Niestety, też nic;-/

    0
  • #8 10 Lis 2015 09:54
    Samuraj
    Poziom 35  

    A częstotliwość procesora ustawiona prawidłowo :?:
    Pomrugaj diodą w pętli i zobacz czy te 500ms co masz ustawione to rzeczywiście 500ms.

    0
  • #9 10 Lis 2015 10:03
    mglowinski93
    Poziom 6  

    Próbowałem też coś takiego,

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ale bezskutecznie ;-/

    Dodano po 26 [sekundy]:

    @samuraj
    dobry pomysł, jak wrócę do domu to sprawdzę i dam znać

    0
  • #10 10 Lis 2015 19:23
    mglowinski93
    Poziom 6  

    Problem rozwiązałem w sumie dzięki samurajowi. Dziękuje

    Konfiguracja ADC :

    Code:
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0); //Podział 8MHz przez 64 (zakres musi byc miedzy 50kHz a 200kHz)
    
    ADMUX |= ((1 << REFS0)|(0<< REFS1)); //Vref to napięcie zasilania
    ADMUX |= (0 << ADLAR); // wynik przesuniety do lewej, caly wynik znaczacy w ADCH, ostatnie bity (po przecinku) w ADCL
    ADMUX |= ((0 << MUX1)|(0<< MUX2)|(0 << MUX3)|(0<< MUX4)|(0<<MUX1)); //Ustawiamy ADC0 jako aktywne
    ADCSRA |= (1 << ADATE); // to wlacza przetwornik w tryb dzialania ciaglego
    ADCSRA |= (1 << ADEN); // to wlacza przetwornik
    ADCSRA |= (1 << ADSC); // start przetwarzania od tego momentu adc mierzy w kolko


    zmieniłem też
    Kod: c
    Zaloguj się, aby zobaczyć kod
    na
    Kod: c
    Zaloguj się, aby zobaczyć kod
    , choć nie wiem co to za różnica:)

    dodatkowo zmieniłem opóźnienie z 500 ms na 1 ms i wszystko zaczęło pięknie działać

    0
  • #11 10 Lis 2015 21:31
    2675900
    Użytkownik usunął konto  
  • #12 11 Lis 2015 08:59
    mglowinski93
    Poziom 6  

    Piotrus_999 napisał:
    pewnie prędkość procka była inna niż w F_CPU. Delay czekał pewnie w nieskonczoność.


    Co masz na myśli? Wydaje mi się, że po prostu czekał za długo, a nie w nieskończoność. To też może być dobry temat. Częstotliwość pracy ATmegi była ustawiona na 8MHz. Nie mam pojęcia dlaczego _delay_ms(500) trwał tak długo

    0
  • Pomocny post
    #13 11 Lis 2015 09:19
    ZbeeGin
    Poziom 38  

    Tak w zasadzie to ciągłe przetwarzanie z jednego kanału najlepiej zrealizować w przerwaniach. Można wtedy pokusić się o napisanie takiego handlera, który nie tylko będzie kolekcjonował dane, ale też je przetwarzał - proste filtrowanie czy uśrednianie. Wtedy otrzymywana wartość będzie bardziej realna niż bezpośrednie dane w których mogą występować chwilowe fluktuacje.

    Poza tym można całkowicie z tego programu wyeliminować wolne i pamięciożerne operacje na zmiennych typu float. O czym niejednokrotnie się pisało na tym forum.

    0
  • #14 11 Lis 2015 10:20
    2675900
    Użytkownik usunął konto