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

Miernik częstotliwości, Programowanie

lt640 05 Mar 2014 19:17 2958 29
REKLAMA
  • #1 13373255
    lt640
    Poziom 10  
    Miernik częstotliwości, Programowanie

    Stworzyłem taki schemat, jest on poprawny? Pin3 WE/WY jest to wejście sygnału częstotliwości ok 0-120Hz Docelowo będzie podłączony do PB0, Wyjście to Pin2 ma on być w stanie zwarcia do masy gdy częstotliwość na wejściu osiągnie zadaną częstotliwość. To by było na tyle. Przydałby mi się do tego procesora wsad, coś wyrzeźbiłem ale nie wiem w ogóle czy się nada. Załóżmy, że częstotliwość graniczna = 100Hz

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dziękuje za wszystkie porady
    Pozdrawiam
    Marcin
  • REKLAMA
  • #3 13373892
    lt640
    Poziom 10  
    nie, tzn, rozumiem że schemat mam zły.
  • #4 13373917
    dondu
    Moderator na urlopie...
    Wzór ten może być np. taki:

    2 = 3 +12 (wyrażenie nieprawdziwe)

    albo taki:

    2 = 3 - 1 (wyrażenie prawdziwe)

    czyli odpowiedź na zadane pytanie zależy od tego, co podstawimy za poszczególne niewiadome.

    Jak więc mamy odpowiedzieć na Twoje pytanie:

    lt640 napisał:
    Stworzyłem taki schemat, jest on poprawny?

    jeżeli nie pokazałeś na nim wartości elementów - mamy się domyślać?
  • #5 13374219
    M. S.
    Poziom 34  
    Poznaję ten kod po mnożniku.
    Moja f-miarka korzystała z dzielnika częstotliwości przez 10 lub nie. Dlatego wprowadziłem mnożnik. Kod zaś pochodzi z moich początków co poznaję po "Const Licznik = 22336".

    Schemat został zaś wzięty z czegoś innego.
    Podstawowa kwestia to taka, że zliczane impulsy powinny być podawane na 6 nogę - wejście licznika T0.
    Poszukaj kolego całego projektu, usuń mnożnik, a będziesz się cieszył f-miarką do prawie 4MHz.

    P. S. Na schemacie jest kwarc 16MHz, a w programie 8MHz.
    No i to jeszcze:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Config Portb.0 = 0 to ustawienie końcówki PB0 jako wejście.

    Kolega mocno początkujący jak mniemam.
  • #6 13374271
    lt640
    Poziom 10  
    Dobrze przepraszam.

    • R1 - R3 : 1kR 0.25W
    • C2, C4, C5 : 220nF (ceramiczny)
    • C3 - 0.1μF
    • C1 - 0.33µF
    • C6 - 1000uF 16V (elektrolityczny)
    • T1 - BD437, BD441 lub inny NPN

    Dodano po 7 [minuty]:

    Jestem mocno początkujący, schemat jest mój. Tylko ten program z tego forum bardzo źle przeze mnie przerobiony :cry: Ogólnie w elektronice nie powiem, że jestem bardzo dobry (co widać) ale sporo potrafię, tylko te procesory[..]

    Chodzi o ten kod?
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #8 13375061
    el2010tmp
    Poziom 25  
    dondu napisał:
    R1 - nie wystarczy rezystor pull-up w pinie mikrokontrolera?

    Niech kolega nie namawia do smażenia transoptora :)
  • REKLAMA
  • #9 13375112
    dondu
    Moderator na urlopie...
    el2010tmp napisał:
    dondu napisał:
    R1 - nie wystarczy rezystor pull-up w pinie mikrokontrolera?

    Niech kolega nie namawia do smażenia transoptora :)

    W jaki sposób namawiam proponując zmianę R1 = 1kΩ na pull-up o co najmniej 20kΩ?
  • #10 13375135
    el2010tmp
    Poziom 25  
    dondu napisał:
    W jaki sposób namawiam proponując zmianę R1 = 1kΩ na pull-up o co najmniej 20kΩ?

    No tak, przy zasilaniu transoptora z pinu poprzez rezystor pull-up zamiast z Vcc. Źle zrozumiałem :)
  • #11 13375198
    SylwekK
    Poziom 32  
    Tak przy okazji to staraj się rysować nieco czytelniej schematy... Nie przeraża Cię ta pajęczyna po lewej stronie procka??
  • #12 13375322
    lt640
    Poziom 10  
    dondu napisał:


    C2 - w jakim celu?
    Gdzie jest rezystor diody LED? ransoptora?

    R1 - nie wystarczy rezystor pull-up w pinie mikrokontrolera?


    Czyli R1 mam wyrzucić, a w programie ustawić na tym wejściu stan wysoki, tak?
    A w transoptorze ten rezystor na anodzie dorzucić? Jakiej wartosci? C2 wyrzucić?

    UP
    Postaram się poprawić czytelność schematu
  • Pomocny post
    #13 13375332
    SylwekK
    Poziom 32  
    Co do R1 - tak, wyrzuć i podciągnij wewnętrznie końcówkę do plusa. C2 jest tu do niczego nie potrzebny, rezystor musisz dobrać w zależności od napięcia jakie będziesz podawał na diodę (ze znanego wzoru R=U/I).
  • #14 13375483
    lt640
    Poziom 10  
    50mA czyli rezystor powinien być 240Ω. A odnośnie do wejścia sygnału to w bascomie dopisać na początku np "set PORTB.0" Czy to nie o to chodzi?
  • #15 13375618
    SylwekK
    Poziom 32  
    Jeśli będzie sterował napięciem np. 5V to od tego napięcia odejmujesz spadek napięcia na diodzie i dopiero dzielisz przez prąd diody. W praktyce ja zawsze biorę ciut większy rezystor - w tym przypadku dla 5V możesz spokojnie użyć nawet 330-470om.

    Tak, podciągniecie wejścia to Set PortX.Y tylko wg Twojego schematu to będzie port D, a nie B, czyli Set PortD.1, W ogóle coś namieszałeś w tej konfiguracji z portami w programie - posprawdzaj z czego tak naprawdę korzystasz i przypisz odpowiednie piny.
  • Pomocny post
    #16 13375858
    M. S.
    Poziom 34  
    Cytat:
    Chodzi o ten kod?


    To mój kod. JESZCZE RAZ NAPISZĘ - impulsy zlicza licznik0 więc musisz podać je na pin o alternatywnej funkcji "T0". Inaczej miernik nie będzie mierzył. Schemat i program to jedna całość. Nie można do danego programu dorabiać dowolnego schematu!
  • #17 13376293
    lt640
    Poziom 10  
    To, że program i schemat to jedna całość to akurat wiem :), Napisałem dla przykładu "set PORTB.0". Schemat Poprawiłem, w kodzie tylko ustawienia pinów, nie wiem czy dobrze go okroiłem z wyświetlacza. Jam pozbyć się zewnętrznego kwarcu w kodzie? co trzeba pozmieniać?
    EDIT
    Miernik częstotliwości, Programowanie
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #18 13377091
    M. S.
    Poziom 34  
    Cytat:
    Jam pozbyć się zewnętrznego kwarcu w kodzie? co trzeba pozmieniać?


    Zaprogramować fusebity na żądaną częstotliwość zegara wewnętrznego pamiętając, że na wewnętrznym taktowaniu pomiar nie będzie dokładny.

    Przeliczyć wartość początkową umieszczoną w zmiennej Licznik.

    Ponadto warunek:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    powoduje, że jak raz ustawi się jedynka na Portc.0 to będzie tam trwać niezależnie od zmiany częstotliwości na wejściu.

    Wypadałoby też zmienić to:
    Kod: text
    Zaloguj się, aby zobaczyć kod
    , ale akurat w tym programie nie ma to znaczenia.
  • REKLAMA
  • #19 13377564
    lt640
    Poziom 10  
    M. S. napisał:
    Cytat:
    Jam pozbyć się zewnętrznego kwarcu w kodzie? co trzeba pozmieniać?


    Zaprogramować fusebity na żądaną częstotliwość zegara wewnętrznego pamiętając, że na wewnętrznym taktowaniu pomiar nie będzie dokładny.

    Przeliczyć wartość początkową umieszczoną w zmiennej Licznik.

    Ponadto warunek:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    powoduje, że jak raz ustawi się jedynka na Portc.0 to będzie tam trwać niezależnie od zmiany częstotliwości na wejściu.

    Wypadałoby też zmienić to:
    Kod: text
    Zaloguj się, aby zobaczyć kod
    , ale akurat w tym programie nie ma to znaczenia.

    Jednak zostane przy kwarcu zewnętrznym, i jeżeli w kodzie mam crystal = 11059200 to rozumiejąc mam użyć o częstotliwości 11059200Hz.
    Kod: text
    Zaloguj się, aby zobaczyć kod
    o to chodziło? :)
  • #20 13379485
    Konto nie istnieje
    Poziom 1  
  • #21 13380063
    lt640
    Poziom 10  
    emarcus napisał:
    założona na początku wartość 22336 odnosi się wyłącznie do taktowania 8MHz.

    Właśnie wartość licznika 22336 odnosi się do taktowania 11.0592 MHz, bo nie wiedziałem co jeszcze tam zmienić i zmieniłem tylko $crystal=11059200 na 8000000 nie ingerując w dalszą część kodu pod względem taktowania.
    Jest na to jakiś ogólny wzór, żeby to wyliczyć?

    emarcus napisał:

    1. Nie ma potrzeby zatrzymywania liczników aby odczytać ich zawartość.
    2. Stopowanie i startowanie timera pracującego z prescalerem wiąże się z pewnymi (małymi zrersztą) niedokładnościami odliczonego czasu, - nie resetowany prescaler; -za każdym razem ta sekunda ma inną 'długość'.
    3. Timer1 może pracować w trybie CTC, więc nie ma potrzeby każdorazowo wpisywać wartość początkową do jego rejestru.
    4. Wszelkie obliczenia oraz dysplay wyniku winny być umieszczone w programie głównym, a ich wykonywanie uwarunkowane flagą stawianą w przerwaniu odliczającym czas jednej sekundy.
    Wtedy program jest bardziej skonsolidowany, przerwania będą krótkie i łatwiej jest odszukać ewentualnie popełnione błędy.

    Przy założonej dokładości (+/-1 Hz) i przedziale pomiarowym do 100 Hz wewnętrzny oscylator 8MHz jest dostatecznie dokładny./ Zastosowanie tu zewnętrznego rezonatra kwarcowego nie będzie miało praktycznego wpływu na uzyskany wynik.

    ad.1-3 Mam odpowiednie linijki usunąć czy je w jakiś sposób zmodyfikować, coś dodać?
    ad.4 Kompletnie nie wiem jak to rozumieć :(
  • #22 13380522
    Konto nie istnieje
    Poziom 1  
  • #23 13380951
    lt640
    Poziom 10  
    Wielkie dzięki za programy, przydały się. Z każdą chwilą coraz więcej rozumiem. Wymodziłem nowy kod, tylko znowu ta niepewność, prosiłbym o uwagi (bo na pewno będą i na pewno coś jest źle)
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #24 13381863
    yokoon
    Poziom 29  
    Witam.
    Zmień zapis Load Timer0=250 na Load Timer0,250
  • #25 13382756
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #26 13382821
    lt640
    Poziom 10  
    Kod: text
    Zaloguj się, aby zobaczyć kod

    emarcus napisał:
    bez konieczności zliczania przepełnień. Podobnie, odmierzanie czasu 1 sec. stosując Timer1 również nie wymagałoby zliczania przepełnień.

    Gdybym chciał jednak mierzyć załóżmy do 1kHz to wymaga aby zliczać przepełnienia?

    Dodano po 30 [minuty]:

    w złym obliczeniu 1 sek wartość wynosiła 61630, przy prawidłowym obliczeniu wynosi 34 286 uwzględniając czas 1sek, częstotliwość taktowania 8MHz i prescaler 256.
  • Pomocny post
    #27 13383034
    Konto nie istnieje
    Poziom 1  
  • #28 13383937
    lt640
    Poziom 10  
    Dzięki wielkie za poprawienie mnie, dużo mi to wyjaśniło, nie widziałem jak mogłbym to zrobić bardziej zwięźle, ale teraz już widzę. Linijki kodu określające wyświetlacz mogę ale nie muszę wyrzucać? I jeszcze jedno, zmiany na wyjściu mogą być najszybciej co sekundę? Jeżeli tak to chcąc, aby reakcja na zmiany częstotliwości była szybsza to muszę zmienić czas pomiaru? to co omyłkowo zrobiłem w ostatnim kodzie.
    Jeszcze raz bardzo dziękuje, dużo się nauczyłem.
  • #29 13384547
    Konto nie istnieje
    Poziom 1  
  • #30 13387790
    lt640
    Poziom 10  
    Własnie myślałem żeby tak zrobić, dokładność ±10Hz mogę zaakceptować. Spróbuje to zmodyfikować i niedługo wrzucę tutaj do sprawdzenia. Muszę zaprojektować płytkę, wyfrezować i polutować, zobaczę efekty i wtedy się będę zastanawiać nad ewentualną zmianą. Jeszcze myślałem żeby zrobić to tak by przy czasie próbkowania 0.1sek wyniku nie mnożyć przez 10 tylko tak zostawić, bo w końcu nie potrzebuje częstotliwości, tylko określoną liczbę impulsów na określony czas (w tym wypadku 0.1sek)
REKLAMA