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

Atmega16L - Dwa sygnały PWM i odczyt z użyciem ADC

amcio89 12 Maj 2013 18:40 2619 12
REKLAMA
  • #1 12299533
    amcio89
    Poziom 9  
    Witam,

    ostatnio rozpocząłem zabawę z mikrokontrolerami AVR i próbuje wykonać konduktometr. Niestety aby taki układ mógł działać poprawnie konieczne jest zasilanie elektrod pomiarowych prądem przemiennym. Ponieważ chce aby mój układ był możliwie najprostszy, zasilam elektrody pomiarowe z mikrokontrolera za pomocą sygnału PWM, dzięki czemu raz na jednej elektrodzie jest 5 V natomiast na drugiej GND i tak na zmianę. Cały układ działa na zasadzie dzielnika napięcia. Zmieniając jednak ciągle polaryzacje i robiąc pomiar za pomocą przetwornika ADC otrzymuje na wyświetlaczu LCD dwa wyniki, czego winą najprawdopodobniej jest dzielnik napięcia. I dlatego szukam pomocy.
    Z góry dziękuję za odpowiedź i pomoc.

    Pozdrawiam
  • REKLAMA
  • #2 12299609
    BlueDraco
    Specjalista - Mikrokontrolery
    Łańcuch result ma dwa bajty, a Ty piszesz do niego 4 bajty - ciekawe, co zamazujesz. To, co potem z nim wyczyniasz, jest dziwne i mało sensowne.

    Startujesz pomiar AD w pętli i zaraz odczytujesz śmieci z rejestru ADC, nie czekając na gotowość przetwornika. To opóźnienie 10 ms przydałoby się po wystartowaniu, a przed odczytem.

    *5 / 10 to to samo, co / 2
  • #3 12299638
    amcio89
    Poziom 9  
    Dzięki za cenne informacje i zaraz poprawiłem (kod poniżej), niestety dalej to nie rozwiązuje mojego problemu. Otrzymane wyniki z przetwornika są poprawne bo np. otrzymuje albo 5 V albo 0 V na zmiane - wynika to z zmiany polaryzacji. Jak jednak zrobić aby otrzymaywać jednen wynik. Bardzo proszę o pomoc
  • #4 12299717
    excray
    Poziom 41  
    Musisz zsynchronizować przetwornik z PWM. Timer w momencie zmiany polaryzacji OC0 może Ci generować przerwanie o ile tylko go o to poprosisz. Moim zdaniem powinieneś w tym przerwaniu sprawdzić czy został ustalony interesujący Cię stan, np że na PB3 jest akurat stan niski, i w tym przerwaniu wtedy wyzwalać przetwornik ADC. Oczywiście czas konwersji ADC musi być krótszy aniżeli czas 1-go cyklu PWM.

    EDIT> Właśnie zauważyłem że korzystasz z dwóch oddzielnych timerór do generowania tego przebiegu. Masło maślane.
  • REKLAMA
  • #5 12299969
    amcio89
    Poziom 9  
    A w jaki sposób mogę wygenerować 2 sygnały PWM za pomocą jednego timera? Z góry dziękuję za odpowiedź!
  • #6 12300126
    ZbeeGin
    Poziom 39  
    amcio89 napisał:
    A w jaki sposób mogę wygenerować 2 sygnały PWM za pomocą jednego timera?

    Korzystając z Timer1, który posiada dwa wyjścia OC1A i OC1B. Oba można ustawić za pomocą bitów COM1A1+COM1A0 oraz COM1B1+COM1B0 tak by pracowały w przeciwfazie. Warunek jest jeden: oba rejestry OCR1A i OCR1B ładujesz tą samą wartością.

    Myślę jednak, że idea takiego sterowania elektrod i bezpośredni pomiar przez ADC jest błędna.
  • REKLAMA
  • #7 12300197
    amcio89
    Poziom 9  
    Zastosowałem rozwiązanie z przerwaniem, no i z potencjometrem działa więc na elektrodach zapewne też będzie działać. Teraz spróbuje rozwiązać problem z wspólnym timerem.

    A w jaki inny sposób mógłbym rozwiązać problem? Oprócz stosowania prądu przemiennego do zasilania elektrod, tzn. aby stosować DC
  • REKLAMA
  • Pomocny post
    #8 12300263
    ZbeeGin
    Poziom 39  
    amcio89 napisał:
    A w jaki inny sposób mógłbym rozwiązać problem?

    Rozmontowałem kiedyś prosty konduktometr f-my Crouzet. Zrobili to najprościej jak się dało: Sygnał prostokątny z procesora przepuścili przez prosty układ RC by przenieść poziom "0" i otrzymać przebieg bipolarny (±2.5V). Drugą elektrodę podłączyli do zwykłego półokresowego detektora diodowego, potem przez jeden stopień wzmocnienia do ADC w procesorze. Wzmocnienie było dodatkowo regulowane kluczem 4066. I tak mierzyli już napięcie DC.
  • Pomocny post
    #9 12300289
    excray
    Poziom 41  
    amcio89 napisał:
    A w jaki sposób mogę wygenerować 2 sygnały PWM za pomocą jednego timera?

    Korzystając z przerwania od porównania bądź przepełnienia i "ręcznego" zmieniania stanu pinów na przeciwny. Przy okazji w takim przerwaniu mógłbyś uruchamiać ADC co drugi cykl co by rozwiązałoby Twój problem. Oczywiście czas do następnego przerwania musi być dłuższy niż czas przetwarzania ADC.
  • #10 12300387
    amcio89
    Poziom 9  
    ZbeeGin a jesteś w stanie narysować mi tego taki poglądowy schemat, ponieważ dopiero zaczynam zabawę z tego typu układami. Do tego jak byś mógł mi napisać przykładowe podzespoły jakie powinienem użyć. Z góry dziękuję i tak już mi dużo pomogliście.
  • Pomocny post
    #11 12300727
    excray
    Poziom 41  
    Przykładowy program realizujący przedstawiony przeze mnie sposób.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 12300848
    Konto nie istnieje
    Poziom 1  
  • #13 12300867
    amcio89
    Poziom 9  
    To forum i ludzie są rzeczywiście niesamowici. Udało mi się zrobić ten układ. Nadal mnie jednak ciekawi rozwiązanie ZbeeGin. A pomysł excray także na pewno wypróbuje aby znaleźć to najlepsze rozwiązanie. ZbeeGin jak tylko będziesz mógł to prosiłbym o taki poglądowy schemat. Z góry dziękuje wam wszystkim :)
REKLAMA