Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega16] BASCOM szybki obrotomierz motocyklowy na INT0

17 Gru 2010 20:20 15699 95
  • Poziom 16  
    Z racji tego, że raczkuję w BASCOM potrzebował bym podpowiedzi od was jak zabrać się za funkcję która ma za zadanie:

    - zliczać impulsy z portu (INT0)PORTD.2 i przeliczać je na obroty (1 impuls = 1 obrót)
    - na wyświetlaczu LCD ustawiać za pomocą przycisku wartość obrotów przy których zapali się dioda LED (wartość ustawiana byłaby poprzez przytrzymanie przycisku 3 sekundy, po czym wartość zaczęła by migać i pojedynczym przyciśnięciem zmieniała by się co 500 RPM (w przedziale od 1000 do 14000). Ponowne przytrzymanie przycisku na danej wartości przez 3 sekundy zapisuje wartość.

    *Dioda LED sterowana tranzystorem BC547B przez port PORTD.1
    *Przycisk PORTD.5
  • Użytkownik usunął konto  
  • Poziom 16  
    Dzięki za podpowiedzi.

    Prace na razie stanęły w miejscu bo jak się okazuje atmega8515 prawdopodobnie nie ma wbudowanego przetwornika ADC, który jest mi bardzo potrzebny.

    Będę chyba zmuszony zrobić na nowo płytkę z megą16. Chyba, że macie jakiś inny pomysł ?
  • Poziom 16  
    A więc prace w końcu ruszyły, uC zmieniony na Atmega16

    Po sprawdzeniu oscyloskopem moje impulsy wyglądają następująco - prostokąt o amplitudzie 14,7V (napięcie nie zmienia się, rośnie lub maleje jedynie częstotliwość, gdy rosną lub maleją obroty):

    [Atmega16] BASCOM szybki obrotomierz motocyklowy na INT0

    Na porcie INT0 mam dzielnik napięcia oraz zabezpieczenie w postaci dwóch diod podciągniętych jedna do +5 druga do GND.
    Teraz jak najłatwiej zliczać te impulsy oraz przeliczać na obroty ?
  • Poziom 16  
    Byłbym wdzięczny za jakieś chociaż kawałki kodu, łatwiej mi jest się uczyć analizując kod (co skąd się bierze) łatwiej zapamiętać.
  • Poziom 27  
    W przerwaniu daj jakąs zmienną np licznik typu word.

    Kod: vb
    Zaloguj się, aby zobaczyć kod



    A w głównym programie wystarczy tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    ZNacznie łatwiej i wygodniej zastosować któryś Timer jako licznik a nie wejście INT0.
  • Poziom 16  
    Z tym, że płytkę mam już wykonaną i impulsy podaję pod port INT0
  • Poziom 27  
    Mad Jaro napisał:
    Z tym, że płytkę mam już wykonaną i impulsy podaję pod port INT0


    możesz to zliczać w przerwaniach INT0 , trochę pod górkę ale może być.
  • Poziom 16  
    Powertowalem trochę forum i rzucił mi się w oczy taki kodzik:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 16  
    Czy ten kod nadał by się do zliczania impulsów z INT0, ewentualnie co trzeba by zmienić ?
  • Poziom 36  
    Mad Jaro napisał:
    Czy ten kod nadał by się do zliczania impulsów z INT0, ewentualnie co trzeba by zmienić ?


    Nie.
    Po pierwsze:
    Nie możesz liczyć na dokładny pomiar czasu stosując Start/Stop Timer przy użyciu prescalera o wartości różnej od jeden. Wartość timera może zostać incrementowana już po jednym ticku zegara albo nawet po 100; 150; 193 itd. tickach zegara taktującego uC. Nie resetujesz prescalera startując Timer0.
    Dalej;
    Nigdzie w opisie nie ma nawet wzmianki odnośnie źródła pochodzenia impulsów; Jeżeli pochodzą one z encodera to wymagane będzie znać jego rozdzielczośc, którą należy wykorzystać we wzorze na obliczenie RPM. Jeżli jednak masz 1 (jeden) impuls na obrót wału, to praktycznie nie ma możliowości pomiaru czasu stosując Timer0 bez zliczania przepełnień - masz tylko ok. 8 ms przedział czasu na impuls; pomijając już aspekt przypadkowości startu Timera0 w odniesieniu do prescalera. Jaka więc byłaby dolna granica pomiaru obrotów?

    Jeszcze jedna uwaga (prawdopdobnie nie ostatnia); jeżeli źródłem impulsów jest autentyczny encoder, to nie ma potrzeby na podciąganie portu i stosowania debounce, inaczej ten aspekt nie może być pominięty w projekcie.

    e marcus
  • Poziom 16  
    Impulsy zbierane sa z jednej z 2 cewek zaplonowych(2 cylindry na cewke), wchodza do komputera zaplonowego i z niego wedruja prosto na ekektroniczny licznik (stad pobieram impuls).

    Znam jedynie przebieg tych impulsow ktory to podawalem wyzej z oscyloskopu.

    Dolna granica pomiaru to okolo 1000RPM gorna granica okolo 15000RPM.
  • Poziom 16  
    Jako, że w dalszym ciągu mam problemy z napisaniem kodu, a sezon już powoli się zbliża prosiłbym was o pomoc.

    Temat trochę złudny, ale tak naprawdę ma to być obrotomierz do motocykla.

    Priorytetem jest bardzo szybka reakcja wyniku. (przewidywany również shiftlight) Jak wiadomo w motocyklu bardzo szybko obroty zmieniają się.

    Sygnał podaję bezpośrednio na wejście INT0. Niestety potrzebuję pomocy czy mierzyć czas miedzy impulsami, czy mierzyć ilość impulsów w czasie? Zależy mi na dokładności i szybkości pomiaru.

    Z przerwaniami mam pierwszy raz doczynienia, fajnie jakby coś od strony kodowej się pojawiło.
  • Moderator Mikrokontrolery Projektowanie
    Mad Jaro napisał:
    ... tak naprawdę ma to być obrotomierz do motocykla.
    ...
    Priorytetem jest bardzo szybka reakcja wyniku....

    Zastanów się czy nie warto wykorzystać w tym procesorze Timera pracującego w trybie Capture Mode:

    [Atmega16] BASCOM szybki obrotomierz motocyklowy na INT0

    Znajdziesz w nim dodatkowo wbudowany układ redukujący szumy sygnału wejściowego oraz detektor zbocza.

    Poniżej przykład zaczerpnięty stąd: http://www.qsl.net/pa3ckr/bascom%20and%20avr/interrupts/index.html
    Nie wiem czy działa - nie znam Bascom-a.

    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Poziom 16  
    Jak pisalem wyzej procesor zostal zmieniony na atmega16, prosilem moderatorow o zmiane w temacie ale nic sie nie zmienilo.
  • Poziom 16  
    Kurczę nie wiem jak to ugryźć.

    Zastanawiam się czy ten Capture Mode zdał by egzamin u mnie, ponieważ impulsy podaje bezpośrednio na port INT0 i tak mam już skonstruowana płytkę. Więc muszę się już tego trzymać.



    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Napisałem coś takiego, nie wiem czy wybrałem dobrze ustawienie zbocza wg. wykresu z oscyloskopu jakie powinno być ?

    Nie wiem tez czy w pętli głównej jest wszystko ok. Domyślam się, iż jeśli tam jest Wait 1 to wynik będzie się odświeżał co 1 sek, a to niestety zdecydowanie za dużo.

    Proszę o jakieś wskazówki.
  • Poziom 16  
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Prośba wielka o sprawdzenie czy idę w dobrym kierunku ?

    Próbuję robić tak jak pisał xury w przerwaniu INT0 inkrementuję zmienną Licznik typu word. Timer0 ustawiony mam na przerwania co 4ms, 1s i 100ms którym chce zliczać częstotliwość i zerować zmienną.
  • Poziom 16  
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Ale dziwnie gdy chce przepisać licznik na obr i pomnożyć przez 10 wyskakuje mi błąd
  • Poziom 16  
    Ok na numerycznych poszło bez problemu, potem przepisałem sobie na tekstową.

    Mam jeszcze pytanie co do zbocza, które było by najlepsze wnioskując po wykresie czy opadające czy narastające ?

    Popołudniu spróbuje to wszytko skomplikować wrzucić do proca i przetestować na motocyklu.

    Przepisałem to sobie mniej więcej tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    UPDATE:
    Niestety, podłączałem się do motocykla - zero efektu na LCD tylko 0.

    Próbowałem także, wyrzucać zerowanie licznika i ręcznie symulować impulsy zwierając do masy, podciągając wcześniej do + przez 10k.

    Próbowałem także brać impulsy z wentylatora komputerowego też nic.
    Może gdzieś w programie jest problem.
    Dla pewności wrzucę cały kod taki jak mam teraz wgrany do proca:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Specjalista automatyka domowa
    Podaj schemat bo może coś nie tak z podłączeniem.
    Jeszcze kilka spraw.
    Podciągnij programowo INT0
    Robisz dziesięć pomiarów, a wyświetlasz tylko jeden. Możesz z tym coś zrobić np. zwiększyć czas "łapania" lub cześciej wyświetlać.
    Zrezygnuj z array, bo mi w symulatorze coś nie chciało to działać. Zamiast tego użyj drugiej zmiennej typu byte.
    Proponowałbym też zrezygnować z funkcji format i wyświetlać wynik w postaci liczby a nie tekstu.
  • Poziom 16  
    [Atmega16] BASCOM szybki obrotomierz motocyklowy na INT0
    Tutaj jest fragment schematu podłączenia wejść impulsów.

    Nie wiem czym można by najłatwiej symulować te impulsy bo za każdym razem latać do motocykla i bezsensu odpalać i gasić to trochę nie zdrowo.

    Czy impulsy z wentylatora też powinien wyłapać?

    Skleciłem taki najprostszy program, podciągnołem int0, wywaliłem funkcje format, wynik wyświetlam w postaci liczby. Nie bardzo rozumie to "array".



    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • Specjalista automatyka domowa
    Array to tablica. Nie wiedząc czemu nie mogłem namierzyć drugiego elementu tablicy "Dziel(2)" w symulatorze, przez co nie działało. Zamiast tego użyj drugiej zmiennej Byte i sprawdź Twój program, bo w symulatorze działa prawidłowo. Oczywiście wywal Format i całą konwersję do tekstu, bo jest nie potrzebna. Do symulowania impulsów możesz sobie zbudować jakiś generatorek lub coś w tym stylu. Jeśli masz oscyloskop to zbadaj przebiegi impulsów z motocykla, bo może gdzieś tam źle masz podłączone.
  • Poziom 16  
    Kurcze próbuje już na rożne sposoby i zawsze mam 0. jedynie, gdy dam na low level, to wyświetla mi jakieś 26600 nie wiadomo skąd.

    Cały czas próbuje na impulsach z "żółtego" przewodu od wentylatora komputerowego.

    Może podrzucił byś Ty jakiś kod który Twoim zdaniem powinien zadziałać.
  • Poziom 16  
    Wykonałem dziś generatorek impulsów na NE555.

    [Atmega16] BASCOM szybki obrotomierz motocyklowy na INT0

    Niestety nadal mam ten sam efekt - wynik zerowy.
    Ma może ktoś jakiś pomysł co z tym zrobić.