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

[ATtiny45][C/Avr Studio4] Komparator dziwnie się zachowuje.

hrabia86 25 Lut 2011 20:57 1605 7
REKLAMA
  • #1 9204035
    hrabia86
    Poziom 11  
    Witam
    Debugowałem swój program w AVR Studio4 i działa tak jak chcę, natomiast po wczytaniu go do procka dzieją się następujące rzeczy:
    Pod komparator mam podpięte dwa zewnętrzne napięcia, jedno to Uref a drugie to napięcie które się zmienia w zależności od warunków zewnętrznych. Komparator mam tak skonfigurowany że zgłasza przerwanie przy każdej zmianie wartości bitu ACO. ACO ma wartość 1 gdy U > Uref i ma wartość 0 gdy U < Uref.
    Pod port B mam 2 diody (czerwoną(PORTB.2) i zieloną(PORTB.3)). Poprawnie chcę aby układ działał w następujący sposób: Gdy U > Uref to czerwona świeci przez 60 sek. Gdy U < Uref to zielona świeci przez 60 sek.
    Problem jest następujący:
    Przy zmianie napięć na wejściu komparatora (nie ważne czy to wariant 1 czy 2) następuje sekwencja świecenia obu diod, jednej po drugiej (w odstępach 60 sek). Wszystko wygląda na to że komparator generuje po 2 przerwania a w sumie powinno być jedno tak ? Jak zachowuje się komparator skonfigurowany w taki sposób ?? Jak uniknąć podwójnych przerwań ??

    Zmagam się z tym już jakiś czas i nie mogę znaleźć rozwiązania. Na początku to która dioda ma się zaświecić decydowałem testując bit ACO w funkcji if(). Później zrezygnowałem z tego i napisałem ręczną procedurę na zmiennych ale efekt jest nadal taki sam. Z góry dziękuję za pomoc i pozdrawiam.
  • REKLAMA
  • #2 9204254
    ZbeeGin
    Poziom 39  
    Komparator w układzie nie posiada pętli histerezy, a powinien ją mieć w takim przypadku. Niestety datasheet o niej milczy, a ze schematu blokowego jak i z opisów też nie wynika by w ogóle była.
    Na symulacji wszystko jest idealnie bo są symulowane stabilne warunki. W rzeczywistości komparator przy zbliżonych wartościach U i Uref (ułamki V) może przerzucić się kilka razy, i stąd seria przerwań.
  • REKLAMA
  • #3 9204522
    hrabia86
    Poziom 11  
    Masz rację. Przed chwilą sprawdzałem mój układ ręcznie zmieniając mu warunki zewnętrzne i faktycznie, przy dużej idealizacji układ działa poprawnie, tak jak chce. W takim przypadku co zrobić aby pozbyć się tych wahań napięcia które generują rząd niepotrzebnych przerwań ?? Użyłem już instrukcji wyłączenia obsługi przerwania od AC podczas czasu (60 sek) w którym mają świecić diody, ale jeżeli dobrze coś kojarzę to chyba w takim przypadku nie obsłużone przerwania czekają w kolejce...

    Czy zastosowanie pojemności dołączonych do nóżek AC coś pomoże ? Liczyć się należy w tedy ze spowolnieniem reakcji ale załóżmy że szybka praca nie jest wymagana.
  • #4 9204653
    janbernat
    Poziom 38  
    Żądanie obsługi przerwania też można wykasować.
    Sama pojemność nie wystarczy- potrzebny jest też rezystor.
    Chyba że źródło sygnału ma wystarczającą oporność.
  • #5 9204815
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #6 9210086
    hrabia86
    Poziom 11  
    Dobry pomysł z tą dodatkową flagą. Muszę się zastanowić w jaki sposób mógłbym go wykorzystać.
    Jeszcze jedno pytanie. Padło hasło "kasowanie przerwań", rozumiem to jako programowe zerowanie flagi wystąpienia przerwania od komparatora (ACI), czy mam rację ?? Jeżeli nie to jak wykonuje się takie kasowanie przerwań ? Co jeśli wystąpi kilka przerwań po sobie ? Czy Attiny to w jakiś sposób zapamiętuje i jednokrotne wyzerowanie bitu ACI nic tu nie da ??
  • #7 9211107
    janbernat
    Poziom 38  
    Flagę sygnalizującą wystąpienie przerwania kasujesz wpisąjąc do niej 1.
    Tak dziwnie- bo przecież już jest w niej 1- ale tak to w Atmelach się robi.
    Flaga jest jedna- jeśli w trakcie obsługi przerwania pojawi się kilkakrotnie to te przerwania pozostaną nieobsłużone.
    Tę flagę możemy wykorzystać do "obsługi" przerwania w pętli głównej.
    Czyli- sprawdzamy czy jest, kasujemy i coś robimy w programie.
    Zyskujemy na czasie bo nie mamy prologu i epilogu.
    Ale pętla musi się wtedy wykonywać na tyle szybko żeby nie pominąć żadnej zmiany flagi.
  • REKLAMA
  • #8 9545453
    hrabia86
    Poziom 11  
    Problem rozwiązałem w prosty sposób. Mianowicie w mojej aplikacji chodziło głównie o porównywanie sygnału na wbudowanym w Attiny komparatorze. Dlatego aby uniknąć problemów z oscylacją sygnału na wejściu komparatora przepuściłem sygnał przez mostek Greatz'a z filtrem pojemnościowym :) Takie proste rozwiązanie wystarczyło aby uporać się z problemem od strony technicznej. Warto dla pewności było jeszcze wprowadzić bufor który w momencie gdy wystąpi przerwanie od komparatora, przez czas ok 1-2 s pobierze z jakimś okresem pewną liczbę próbek z wyjścia komparatora ( bit ACO) i dopiero na podstawie sumy tych próbek można podjąć dalsze działania.
    Dziękuję wszystkim za pomoc. Pozdrawiam
REKLAMA