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

[C] [atmega8] - Jak zmierzyć czas między zboczami narastającymi impulsów?

Miles! 29 Sty 2014 18:09 3090 10
  • #1 13236054
    Miles!
    Poziom 21  
    Witam,

    Chcę napisać kod, który realizowałby pomiar czasu pomiędzy impulsami (sygnał prostokątny o amplitudzie 5V). Zakres częstotliwości mierzonego sygnału będzie się zawierał w przedziale od 0 do maksymalnie 180 Hz. W internecie znalazłem artykuł, w którym zrealizowany jest podobny kod: http://mikrokontrolery.blogspot.com/2011/04/obrotomierz-diy.html

    Z tym, że ja potrzebuję pomiaru czasu pomiędzy każdym zboczem narastającym (pomiędzy 1 i 2, 2 i 3, 3 i 4 itd.). Wyświetlanie wartości nie jest mi potrzebne. Na podstawie pomiarów chcę tylko generować sygnał o odpowiednio zmniejszonym czasie między impulsami, ale najpierw chciałbym zrealizować przynajmniej sam pomiar. Jako, że programowaniem zajmuję się właściwie od kilku dni, to nie ukrywam, że sprawia mi to nie mały problem. Na razie wyczarowałem coś takiego:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jest ktoś, kto sprawdzi i ewentualnie poradzi co zmienić?
  • #3 13241526
    Miles!
    Poziom 21  
    Mikrokontroler pracuje z częstotliwością 1 MHz. Dokładność chciałbym uzyskać jak największą, aby przekłamania licznika po obróbce sygnału były jak najmniejsze. A rezultaty tego programu w sumie żadne... dodałem obsługę diody, by po wykonaniu pomiaru zaświeciła się na jakiś czas, ale nawet nie mrugnie.
  • #5 13248331
    Miles!
    Poziom 21  
    Hm... jest to ustawienie portu PB1 jako wyjścia (dla diody). W czym tkwi tutaj problem?
  • #7 13248668
    Miles!
    Poziom 21  
    Coś tam zaczęło się dziać. Dioda zaczęła mrugać, ale reaguje na wszystkie zakłócenia. Wystarczy, że zbliżę rękę do układu na odległość kilku centymetrów i się włącza. Co nie zmienia faktu, że na razie i tak jeszcze nie wiem czy program działa tak jak powinien, bo mrugająca dioda świadczy tylko o tym, że wyszedł z funkcji obsługi przerwań.

    Co z tymi zakłóceniami zrobić? To normalne zachowanie układu?

    edit:

    Dałem rezystor podciągający 10k do masy. Dioda już nie mruga po zbliżeniu dłoni. Dopiero po podłączeniu do VCC.
  • #8 13253423
    Miles!
    Poziom 21  
    Dalsza część zmagań.

    Jako generator impulsów zastosowałem zwykły switch, który zwiera pin ICP1 do VCC. I teraz rodzi się pytanie. Po jednym kliknięciu zmienna "koniec_pomiaru" powinna być równa 0 i tym samym dioda nie powinna się włączać. Natomiast jest inaczej. Pierwsze kliknięcie po uruchomieniu procesora powoduje załączenie się diody. Czyli tak jakbym generował więcej impulsów niż jeden. Czy to ma związek z odbijaniem się styków?

    Tak to teraz wygląda po dodaniu funkcji włączającej przerwania dla zbocza narastającego na ICP1 oraz obsługa (zabrzmiało jakby było to wielce skomplikowane) diody LED:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 13254013
    dondu
    Moderator na urlopie...
    Miles! napisał:
    Jako generator impulsów zastosowałem zwykły switch, który zwiera pin ICP1 do VCC. I teraz rodzi się pytanie. Po jednym kliknięciu zmienna "koniec_pomiaru" powinna być równa 0 i tym samym dioda nie powinna się włączać. Natomiast jest inaczej. Pierwsze kliknięcie po uruchomieniu procesora powoduje załączenie się diody. Czyli tak jakbym generował więcej impulsów niż jeden. Czy to ma związek z odbijaniem się styków?




  • #10 13255322
    Miles!
    Poziom 21  
    Dołożyłem kondensator i rezystor, teraz drgania styków nie wpływają negatywnie na pracę układu :) Dzięki!

    Mam z kolei inne pytanie. Nawiązując do projektu z obrotomierzem, na którym się wzorowałem. Co się stanie, gdy po wykryciu pierwszego zbocza narastającego, drugie zbocze wystąpi po dłuższym czasie? Załóżmy, że silnik akurat się zatrzymał po pierwszym zboczu. Przecież zmienna "ilosc_przepelnien" ma swoje ograniczenia i przepełnienia nie mogą być zliczane w nieskończoność. Co wtedy?
  • #11 13257160
    dondu
    Moderator na urlopie...
    Miles! napisał:
    Nawiązując do projektu z obrotomierzem, na którym się wzorowałem. Co się stanie, gdy po wykryciu pierwszego zbocza narastającego, drugie zbocze wystąpi po dłuższym czasie? Załóżmy, że silnik akurat się zatrzymał po pierwszym zboczu. Przecież zmienna "ilosc_przepelnien" ma swoje ograniczenia i przepełnienia nie mogą być zliczane w nieskończoność. Co wtedy?

    Musisz odpowiednio zmodyfikować program.
REKLAMA