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

[ATTiny13][BASCOM] Obrotomierz , pomiar okresu

paavo91 26 Lut 2011 19:00 8086 37
  • #1 9208115
    paavo91
    Poziom 19  
    Witam. Chcę zmierzyć obroty, powiedzmy, że będzie to sygnał prostokątny. Po osiągnięciu określonej liczby rpm chcę zapalić diodę LED.
    Cienko u mnie z programowanie, o ile zapalanie i gaszenie diód było dla mnie proste to jak dochodzą timery,przerwania to wymiękam :/

    Poniżej kod w bascomie:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Na pewno tutaj jest tragedia bo zbierałem po trochę z różnych programów ale ostatecznie nie doszedłem do końca. Program o ile się nie mylę powinien zareagować na zbocze narastające na INT0 odpalić timer i zliczyć czas do następnego zbocza narastające. Tak się chyba mierzy okres. Później zamienić to na częstotliwość i na obr.
    Proszę o pomoc co w tym kodzie trzeba poprawić. Dodam tylko, że obroty jakie chcę mierzyć to 9-11 tys obr/min. W tym przedziale zależy mi na dokładności.
    Dziękuje.
  • #2 9209817
    Moyshaa
    Poziom 14  
    Najprościej chyba liczyć impulsy przez jakiś okres czasu, np. przez 1s i później pomnożyć to przez 60 i masz wynik. Ewentualnie jak impulsy są np 3 na obrót, albo coś na tej zasadzie to odpowiednio przeliczyć. Jak 1s to za dużo to próbuj przez 20ms. Sam ustal czas przez jaki chcesz liczyć.

    Im dłużej będziesz liczył tym dokładniejszy będziesz miał pomiar (przy założeniu, że obroty są wolno zmienne).

    Jeżeli potrzebujesz pomiaru obrotów które są bardzo bardzo szybko zmienne to wtedy faktycznie musisz zamiast liczyć impulsy przez jakiś czas, liczyć czas pomiędzy impulsami. Ale nie wydaje mi się..

    Zobacz sobie stronę. Z której pochodzi program z załącznika.
  • #3 9209912
    paavo91
    Poziom 19  
    Znam ten program. Niestety to mi nie pomoże. Obroty będą się szybko zmieniać i muszę tą zmianę wychwycić. Wyliczyłem, że czas trwania impulsy może wynieść 6us.

    Co do kodu to jeszcze doszedłem do wniosku, że po liczeniu przez timer muszę go chyba wyzerować bo się przepełni kiedyś, ale nie wiem jak to w kodzie ma być.
  • #4 9210640
    Moyshaa
    Poziom 14  
    No dobra, to Ci nie pomogę bo BASCOMA nie znam. Zastanawiam się tylko nad logiką zagadnienia... Zapalasz diodę gdy przekroczysz jakieś obroty i co jeszcze ma się dziać w programie? W jaki sposób chcesz wyłapać zmianę obrotów? Szukam powodu, dla którego jest tak istotne uzyskanie wyniku co te 6us.

    Na ile przebieg jest szybko zmienny? O ile % jest się w stanie zmienić przez 1ms?

    Bo jeżeli tylko na kilka %, to jeszcze raz sugeruję zastanowienie się nad najprostszą metodą..

    Podczas 1ms zliczysz ok 166 takich impulsów to dokładność na więcej niż 98%, czyli już dość sensowna. I wynik masz uaktualniany 1000 razy na sekundę.

    ---

    Jeśli Cię to nie przekonuje, to tylko dopowiem Ci, że robiąc to po twojemu, żeby uzyskać jak największą rozdzielczość pomiaru, musisz mieć jak najmniejszy prescaller, no i dobrze mieć jakąś częstotliwość zegarową która jest potęgą dwójki. Bo to można na czas przeliczać bez zaokrągleń.
  • #5 9210693
    paavo91
    Poziom 19  
    No więc tak. Układ ma w zasadzie działać w zakresie obrotów 9000-11000/s .
    Jeśli zrówna i przekroczy ustaloną wartość to dioda ma się zapalić. Prócz tego może w przyszłości dodam jedno zadanie również zależne od obrotów.
    Na razie chodzi mi tylko o zapalenie diody. Zależy mi na szybkiej reakcji procesora bo to będzie się szybko zmieniać(odkręcanie manetki przy motocyklu). Wydaje mi się po prostu, że 1s to za wolno, żeby to liczyć bo przecież z 8k do 10k to momentalnie skoczą obroty jak odkręcę manetkę. Chcę to zrobić dokładnie, choć może przesadzam, jakoś nie siedzę w temacie i nie rozumiem do końca niektórych programów,pętli,liczenia itp.
    6us wyliczyłem, że tyle może trwać okres impulsu. A właśnie okres chcę mierzyć.
    Dzięki.
  • #6 9211370
    SylwekK
    Poziom 32  
    Wg mnie też najlepszą metodą będzie w tym przypadku mierzenie ilości impulsów w odcinku czasu. Przede wszystkim dla pewności zwiększ zegar w tiny13 na 9600000 (przy okazji, jesli już to nie 1000000 jak u Ciebie tylko 1200000). Układ będzie pracował nieco szybciej i myślę, że bez problemu zrobisz pomiar.
  • #7 9211493
    Moyshaa
    Poziom 14  
    Ile jest impulsów na obrót wału?

    Bo żeby 6us dało obroty 11krpm musiało by ich byc 900. Skoro to motor to chyba mało prawdopodone..
  • #8 9211498
    paavo91
    Poziom 19  
    Sugerujesz, żeby np. mierzyć impulsy przez 100ms i później pomnożyć to razy 600 żeby otrzymać wynik w obr/min? Choć wcale nie jest powiedziane że muszę przeliczać na obr/min bo nie będę tego wyświetlał na LCD ale z ciekawości chciałbym sprawdzić czy się zgadza z obrotomierzem wskazówkowym.

    Dlaczego sugerujesz takie częstotliwości zegara? Co przeszkadza przy 10MHz? I czy tiny13 może pracować na wewnętrznym zegarze 12MHz?

    EDIT:
    Silnik jest 2-cylindrowy. Z impulsatora idą 2 sygnały, dające informację do CDI kiedy ma się pojawić iskra. Tłoki pracują naprzemiennie więc wezmę sygnał z 1 kabla i to mi chyba da ilość obrotów. Pomyliłem się? Albo to trzeba jeszcze podzielić przez 2 bo przecież po pracy jest wydech i dopiero praca.
  • #9 9211671
    Moyshaa
    Poziom 14  
    paavo91 napisał:
    Sugerujesz, żeby np. mierzyć impulsy przez 100ms i później pomnożyć to razy 600 żeby otrzymać wynik w obr/min?


    Dokładnie to sugerujemy. Ale z tym 6us to się BARDZO pomyliłeś i to zmienia postać rzeczy, bo przy 2 impulsach na obrót przez 100ms przy ok 11krpm impulsów będziesz miał np 36.
    36x300 = 10800rpm z dokładnością +-300rpm... przy 10 pomiarach na 1s.
    A to wątpię, żeby Cię zadowalało.

    Dopiero zwiększenie czasu pomiaru do 1s da dokładność 30rpm, ale to już za rzadki pomiar.

    Więc faktycznie pozostaje Ci tylko mierzenie czasu pomiędzy impulsami.. W C bym Ci pomógł, w BASCOMIE niestety nie potrafię.

    Sorry za zamieszanie ale wprowadziłeś mnie w błąd...
  • #10 9211700
    paavo91
    Poziom 19  
    Ale jeśli 1obr=2 impulsy to one jednak idą dwoma różnymi przewodami do modułu. Więc czemu nie mogę liczyć za pomocą jednego z nich?Chyba, że się znowu myle.
    Zależy mi na dokładności 100obr/min. Ja nie mam o C żadnego pojęcia i wątpię żebym się nauczył od tak. A choćby to była dla Ciebie pestka to co mi z tego kodu jak go nie zrozumiem :/
  • #11 9211749
    Moyshaa
    Poziom 14  
    Możesz liczyć za pomocą jednego z nich... Nie znam się na silnikach mechanicznych. Nie wiem jak to jest rozwiązane.

    Ale dla rozwiązania "liczenie impulsów" jeżeli jest 1 impuls to jeszcze gorzej, bo przy 100ms będzie ich o połowę mniej więc dokładność będzie jeszcze dwukrotnie niższa.

    Więc jedynie "liczenie czasu pomiędzy impulsami". Powodzenia życzę..

    I tylko przypominam, że:
    Cytat:
    żeby uzyskać jak największą rozdzielczość pomiaru, musisz mieć jak najmniejszy prescaller, no i dobrze mieć jakąś częstotliwość zegarową która jest potęgą dwójki. Bo to można na czas przeliczać bez zaokrągleń.


    ---

    Jak już mówiłem BASCOMA nie znam więc moja pomoc się tu kończy, ale zobacz sobie: link.
  • #12 9211832
    Fredy
    Poziom 27  
    Przecież liczniki T0 i T1 mogą pracować jako liczniki zewnętrznych impulsów które wchodzą na wejścia T0 lub T1.
    Wystarczy więc skonfigurować np licznik T1 (16bitowy) do pracy z zewnętrznymi impulsami a potem tylko robić start Timer1, wait, stop timer 1 i odczyt Timera w którym będzie wynik. To najprostsza metoda i najbardziej naturalna i pewna.
  • #13 9211852
    paavo91
    Poziom 19  
    Dobra ale jak długo ma trwać wait? Zależy mi żeby jak najkrócej trwało, bo zmiany będą szybkie. Poza tym Tiny13 jak podaje DS ma tylko timer T0-8bitowy.
  • #15 9211883
    paavo91
    Poziom 19  
    Moyshaa, dzięki za link. Ostatecznie pisze, że ten kod działa ale drażni mnie to, że nie rozumiem w jaki sposób tutaj mierzony jest okres(od rising do rising) może dlatego, że komentarzy mało :(

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Spotkałem się też z teorią, że okres zmierzę od poziomu H do L. Przecież to bzdura. Okres jest od poziomu H do kolejnego poziomu H.
    Nie można więc po prostu przy rising odpalić timera i zatrzymać go przy kolejnym rising?
    Dziękuję za pomoc!

    Kod proszę umieścić w znacznikach code!
    Robak
  • #16 9230387
    paavo91
    Poziom 19  
    Witam ponownie. Chciałem odświeżyć temat. Mianowicie napisałem kod który będzie zliczał ilość impulsów w czasie 1 sek i zapalał diodę jeśli przekroczy limit. Nie mogę dostać się teraz do motocykla więc postanowiłem sygnał brać z wentylatorka CPU. Wyczytałem, że tam jest wyjście OC więc podciągnąłem do + przez 1kohm i z kolektora sygnał dałem na T0.

    Poniżej kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Problem w tym że dzieją się dziwne rzeczy. Dioda pali się bez podłączonego wiatraka, czasem zgaśnie na chwile potem znów się zapali. Nie wiem co jest grane :/
  • #18 9231395
    paavo91
    Poziom 19  
    Dzięki za info tak też zrobie. Mam nadzieje, że to pomoże bo w tej chwili dioda nie zapala mi się w ogóle. Wcześniejsze mruganie diodą i losowe błyski były spowodowane podpiętym programatorem na płytce stykowej.
    Dodam jeszcze, że do zasilania attiny dałem kondensator 470nF mam nadzieję, że to nie za dużo?

    EDIT: Timer0 jest jako licznik więc na co mi prescaler?...
  • #19 9232631
    Konto nie istnieje
    Poziom 1  
  • #20 9232710
    SylwekK
    Poziom 32  
    paavo91 napisał:
    Timer0 jest jako licznik więc na co mi prescaler?...

    Upsss... racja. Biorąc to nawet na chłopski rozum to by było bezsensowne. Sorki... jakiś zastój w głowie :)

    Licznik wykorzystaj do odmierzania odcinków czasu w przerwaniu, a impulsy możesz przecież programowo liczyć na dowolnym pinie w tym czasie. Z programikiem do odczytu zbocza impulsu chyba nie będziesz miał problemu...
    Pozdrawiam
  • #21 9234040
    paavo91
    Poziom 19  
    Poprawiłem na 9,6MHz.
    Wywaliłem enable interrupts i prescaler(kolega powyżej mnie zmylił).
    Na tą chwilę chciałbym przy użyciu T0 zmierzyć ilość impulsów podanych w czasie 1 sek. Później przerobiłbym to na pomiar okresu bo w tej chwili nie wiem jak to zrobić.

    Cóż więc brakuje w tym kodzie?
    Jak wiatrak się kręci to w ciągu 1s musi nabić te 2 impulsy a po zatrzymaniu palcem wiatraka powinno zgasnąć. Niestety nie działa.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Czy w kodzie powinno być Start Counter0 zamiast Start Timer0? Skoro zadekarowałem w configu że to licznik to muszę napisać mimo tego counter?
  • #23 9234228
    paavo91
    Poziom 19  
    Niestety nie działa. Kurde czujnik w tym wiatraczku może padnięty. Spróbuję na innym.
  • #24 9234288
    Konto nie istnieje
    Poziom 1  
  • #25 9234322
    paavo91
    Poziom 19  
    Zaraz, zaraz. Czyli jak chcę liczyć impulsy to nie muszę podawać ich na T0? Bo przecież INT0 i T0 to dwa różne piny. Jak podam na INT0 to mogę wtedy użyć tego pinu do zliczania impulsów? To będzie zliczanie programowe tak?

    Po wielu testach napisałem coś takiego i jest JEDYNY kod w którym cokolwiek się dzieje chociaż po części dobrze.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Wgrałem to do procka. Efekt taki, że jak nie podam impulsu z wiatraka to dioda nie świeci czyli dobrze. Jak podam na Int0 to dioda swoją pracą przypomina diodę od HDD lub routera czyli losowa mruga sobie. Gdy zatrzymam palcem wiatrak dioda cały czas świeci lub cały czas nie świeci. Zależnie chyba od tego w którym momencie się zatrzyma.
  • #26 9236751
    Konto nie istnieje
    Poziom 1  
  • #27 9236839
    paavo91
    Poziom 19  
    Faktycznie bo przecież zmieniłem sposób liczenia. W takim razie czy ten kod pozwala liczyć okres impulsu? Nijak z żadnego kodu nie mogę się doczytać na chłopski rozum kiedy on mierzy czas od Rising do Rising.
    Bo skoro liczy okres to zamiana na obroty będzie wyglądała tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Głupek ze mnie zapomniałem, że fuse bity się zmienia. Ustawiłem na 1,2MHz.
    Dalej coś nie teges.
  • Pomocny post
    #28 9238366
    Konto nie istnieje
    Poziom 1  
  • #29 9238392
    paavo91
    Poziom 19  
    Dzięki e marcus za wyjaśnienie, już bardziej ogarniam.
    Co do abstrakcyjnej "2". Wpisałem liczbę większą od 0. Stwierdziłem, że skoro będzie się obracał to na pewno będzie równy lub większy 2. Jak zatrzymam palcem to będzie 0.

    Niestety nie wiem dlaczego to nie działa.
  • #30 9307789
    Mad Jaro
    Poziom 16  
    Udało Ci się może uruchomić ten program ?
REKLAMA