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

[Atmega16] BASCOM szybki obrotomierz motocyklowy na INT0

Mad Jaro 17 Gru 2010 20:20 17283 95
  • #1 8881222
    Mad Jaro
    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
  • #2 8881365
    Konto nie istnieje
    Konto nie istnieje  
  • #3 8895242
    Mad Jaro
    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ł ?
  • #4 9121978
    Mad Jaro
    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 ?
  • #6 9127906
    Mad Jaro
    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ć.
  • #7 9128106
    Fredy
    Poziom 27  
    W przerwaniu daj jakąs zmienną np licznik typu word.

    Kod: text
    Zaloguj się, aby zobaczyć kod



    A w głównym programie wystarczy tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    ZNacznie łatwiej i wygodniej zastosować któryś Timer jako licznik a nie wejście INT0.
  • #8 9133454
    Mad Jaro
    Poziom 16  
    Z tym, że płytkę mam już wykonaną i impulsy podaję pod port INT0
  • #9 9133852
    Fredy
    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ć.
  • #10 9136685
    Mad Jaro
    Poziom 16  
    Powertowalem trochę forum i rzucił mi się w oczy taki kodzik:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #11 9155449
    Mad Jaro
    Poziom 16  
    Czy ten kod nadał by się do zliczania impulsów z INT0, ewentualnie co trzeba by zmienić ?
  • #12 9158302
    Konto nie istnieje
    Poziom 1  
  • #13 9158632
    Mad Jaro
    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.
  • #14 9262910
    Mad Jaro
    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.
  • #16 9265993
    dondu
    Moderator na urlopie...
    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: text
    Zaloguj się, aby zobaczyć kod
  • #17 9266347
    Mad Jaro
    Poziom 16  
    Jak pisalem wyzej procesor zostal zmieniony na atmega16, prosilem moderatorow o zmiane w temacie ale nic sie nie zmienilo.
  • #19 9275980
    Mad Jaro
    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: text
    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.
  • #20 9515450
    Mad Jaro
    Poziom 16  
    Kod: text
    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ą.
  • #22 9517686
    Mad Jaro
    Poziom 16  
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Ale dziwnie gdy chce przepisać licznik na obr i pomnożyć przez 10 wyskakuje mi błąd
  • #24 9518748
    Mad Jaro
    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: text
    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: text
    Zaloguj się, aby zobaczyć kod
  • #25 9521868
    xury
    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.
  • #26 9522446
    Mad Jaro
    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: text
    Zaloguj się, aby zobaczyć kod
  • #27 9522787
    xury
    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.
  • #28 9523327
    Mad Jaro
    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ć.
  • #29 9539692
    Mad Jaro
    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ć.
REKLAMA