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

Mad Jaro 16 Cze 2011 23:28 15651 95
  • #61
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #62
    Mad Jaro
    Poziom 16  
    Jutro postaram się skleić ten układ i wrzucić coś konkretnego. Na razie nie miałem zbytnio czasu się tym zająć.

    Ale mam jeszcze jeden problem, jak pisałem wcześniej generując impulsy przez NE555 i pisząc program z obsługą tylko jednego timera wszystko wypadało pomyślnie i wyświetlało precyzyjnie 31-32.

    Natomiast, gdy wgrałem pełny program obsługujący dwa timery, wynik już zaczął się wachać i to sporo 10-50 różnie. A powinien wyświetlać 31-32.

    I w takim przypadku w ogóle nie wiem czy przy dwóch timerach będzie to działało...
  • #63
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #64
    Mad Jaro
    Poziom 16  
    Zrobiłem ten filterek z tym, że zamiast 220nF dałem 100nF bo nie miałem takiego. Reszta takie same parametry.

    Testowałem dzisiaj, niestety z marnym skutkiem zero na wyświetlaczu, zarówno przy impulsach z motocykla jak i tych z timera.

    Program w uC ten który ładnie liczył impulsy z generatorka sprawdzony.

    I teraz nie wiem czy mam coś źle podłączone czy coś innego. Z mojej płytki nie wylutowywałem diod tych co były wcześniej, tylko wlutowałem się za nie bezpośrednio do nogi INT0 procka z tym układem filtrującym. Chyba, że przez to tak pokazuje.

    Na Collector mam 0.51V (czyli prawidłowo podciągnięte przez 10k), na Emiter mam 0V i na Base mam 0V niezależnie czy podaje sygnał z generatora na wejście czy nie.
    Sygnał z generatorka ma około 6.5V.
  • Pomocny post
    #65
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #66
    Mad Jaro
    Poziom 16  
    Pomierzyłem trochę i okazało się, że po rezystorze 10k podciągającym kolektor mam już tylko 0.51V. Przed tym rezystorem mam 4.8V.
    Czyżby rezystor był walnięty ? Czy zmienić na inną wartość ?
  • #67
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #68
    excray
    Poziom 39  
    gajerz napisał:
    Na kolektorze przy napięciu bazy 0V stanie bez sygnału z generatora musisz mieć +Vcc. Jak masz miernik częstotliwości, to prześledź drogę sygnału. a jak nie, to sygnał z gen ok 10hz i prosty układ kondensator + tranzystor + dioda led i zobaczysz gdzie Ci miga. może masz jakiś czeski błąd w łączeniu, tranzystor uwalony, wyjście proca źle ustawione, albo za mały prąd bazy.

    [Atmega16] BASCOM szybki obrotomierz motocyklowy na INT0

    Sorki za paskudny schemat, ale na szybkiego w paincie, nie da sie lepiej.

    Ślicznie. Kondnsator naładuje się przez bazę a jak ma się rozładować? Dołóż opornik 2k2 albo jeszcze lepiej diodę 1N4148 katodą do bazy a anodą do masy inaczej powyższy układzik nie spełni swojej roli.
  • #69
    Mad Jaro
    Poziom 16  
    Ok, traznystor sprawny, resyztor sprawny. Podłączyłem bezpośrednio do INT0 pomijając wcześniejsze zabezpieczenia z płytki, w nich tkwił problem. Teraz mam na kolektorze 4.8V i takie też napięcie wchodzi na INT0.

    Z tym, że podłączając generator, wyświetla rożne wyniki i tylko gdy odłączam i podłączam napięcie do generatorka. Przykładowo jak podłączę generator to wyświetli się 18397 i gdy zasilania nie odłączę i ponownie podłączę taki wynik pozostaje. Gdy mieszam zasilaniem to za każdym razem uzyskuję inny wynik.
  • #70
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #71
    Mad Jaro
    Poziom 16  
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    To mam aktualnie w uC. Wcześniej na tym programie bez tej filtracji przy impulsach z generatora wyświetlał 31-32 stabilne.
  • #72
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #73
    Mad Jaro
    Poziom 16  
    Podłączyłem całość bez zmian z ciekawości do motocykla i wyniki mnie zaskoczyły.
    Otóż, wynik jest dość stabilny aczkolwiek nie wiedzieć dlaczego maleje gdy rosną obroty.

    Przy około 1300RPM pokazuje ~50000
    Przy 6000RPM około 12000


    Link
  • #74
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #75
    Mad Jaro
    Poziom 16  
    Wrzuciłem
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    działanie podobne do poprzedniego, tylko teraz dobrze było by jakby ktoś kto zna dobrze bascoma podpowiedział, gdzie umieszczać obliczenia i jak je zapisywać.
    Czy w pętli głównej, czy w przerwaniu a sam wynik wyświetlać w pętli głównej.

    Zauważyłem jeszcze, że na niskich obrotach około 1000RPM wynik bardziej skacze tj, 48000-51000, przy wyższych obrotach wynik jest stabilniejszy tak mi się wydaje.

    Pozostaje mi jeszcze uporać się ze wskazywaniem w obrotach/min i robić testy z dwoma timerami bo jak wcześniej pisałem miałem z nimi problemy.
  • Pomocny post
    #76
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #77
    Mad Jaro
    Poziom 16  
    Ok jutro postaram się to sprawdzić.

    Możesz mi jeszcze powiedzieć od czego zalezy to 36 000 000 ?

    Tak licząc trzeba będzie jeszcze zmienną wynikczas podzielić przez 2 ponieważ mam 2 impulsy na zapłon.

    50 000 = ok 1500 rpm
    36 000 000 / 50 000 = 720 rpm
    36 000 000 / 25 000 = 1440 rpm

    czyli mniej więcej coś takiego:

    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • #78
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #79
    Mad Jaro
    Poziom 16  
    Mam teraz wrzucony taki programik:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Nie wiem czemu teraz nie dzielę przez 2 tylko zwiększyłem na 60000000 i jest ok. Czyżby nie było 2 impulsów na zapłon. Ale jestem zadowolony jak na razie z tolerancji ±100RPM. Jeszcze albo mi się wydaje, albo to po prostu opóźnienie wskazówki obrotomierza. Po szybkiej przygazówce na LCD mam szybciej wynik niż na obrotomierzu wskazówkowym.

    Zauważyłem także, że poniżej 1000RPM czasem pojawia się wynik 20000RPM ale to nie stanowi problemu, ponieważ obroty jałowe to minimum 1300RPM.
    A i po zgaszeniu silnika wynik zostaje na wyświetlaczu, nie zeruje się.

    Teraz pozostaje mi jeszcze dopisać linijkę zapalającą LED po przekroczeniu określonej liczby obrotów, i testowaniu wszystkiego na dwóch timerach bo wcześniej coś się gryzły.
  • #80
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #81
    Mad Jaro
    Poziom 16  
    O jeden problem z głowy. Ale przy dwóch timerach i całym programie pojawiły się dodatkowe:

    Mam problem ze świeceniem diody LED po przekroczeniu obrotów, mam zrobiony warunek:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Warunek działa zaświeca i gasi tak jak powinien, ale gdy obroty dłużej są przekroczone powinna świecić światłem ciągłym, tymczasem na ułamek sekundy gaśnie co 1 sekundę.

    Domyślam się, że jest to spowodowane wyłączaniem przerwań co 1 sekundę, aby pobrać wartości z czujników DS18B20. Kompletnie nie mam pojęcia jak to obejść. Jeśli nie będę wyłączać przerwań to nie odczytam nic z DS'ów.

    Dodam, że temperatury muszę odczytywać często i w "tle" ponieważ mam porobione alarmy po przekroczeniu zadanych temperatur.
  • #82
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #83
    Mad Jaro
    Poziom 16  
    Niestety, nie pomaga.
    W sumie może jakoś to przeżyję w końcu obroty raczej rzadko przekraczają wskazaną wartość na ponad 1 sekundę. Ewentualnie odczyt z Dallasów zrobię co 2 lub 3 sekundy, wtedy nie powinno być problemów.

    Chciałbym jeszcze mieć możliwość zmiany przyciskiem wartości warunku przy jakim ma zapalać się LED. Ale to nie realne chyba przy jednym przycisku w dodatku gdy ten przycisk jest jeszcze wykorzystywany do przełączania case'ów.

    Chciałbym mieć tak, że gdy przytrzymam przycisk na tej wartości to zacznie migać, a potem pojedynczymi przyciśnięciami zmieniam wartość co 1000. Ponowne przytrzymanie zapisuje wartość.
  • #84
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #85
    emarcus
    Poziom 36  
    Mad Jaro napisał:

    Mam problem ze świeceniem diody LED po przekroczeniu obrotów, mam zrobiony warunek:

    Kod: vb
    Zaloguj się, aby zobaczyć kod




    Porównujesz text z wartością numeryczną!
    Patrz wyżej;
    -masz zdaje się zadeklarowane: " Dim obrmin2 as string..."
    Jak więc ma to działać?

    e marcus
  • #86
    Mad Jaro
    Poziom 16  
    Moja literówka oczywiście, że jest obrmin1:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • #87
    emarcus
    Poziom 36  
    Mad Jaro napisał:
    Moja literówka oczywiście, że jest obrmin1:


    Podejrzewam że masz dwa komplety programu;
    - jeden, bardziej rozbudowany, który testujesz w processorze,
    - drugi, fragmentaryczny służący do dyskusji na grupie.
    Problem jest że te dwie versje nie nakładają się na siebie.
    Musi być gdzieś w programie instrukcja zerująca zmienną "wynikczas', która jest brana ciągle do obliczania rpm przy każdym 'przewinięciu' pętli (co jest w zasadzie bez sensu), albo zwyczajnie zerujesz RPM przy przekroczeniu pojemności timera1 (przepełnieniu) co może być spowodowane gubieniem impulsów, albo występuja dwa impulsy jeden zaraz po drugim.
    Wyrzuć z programu zbędne (szkodliwe) instrukcje, a także popatrz na ten fragment:

    Code:


    Przeint0:
       Stop Timer1
       Wynikczas = Timer1
       Timer1 = 0
       Start Timer1
    Return



    Stosujesz "stop timer1" tylko po to aby odczytać jego zawartość i go wyzerować (?)! - troche bez sensu, to kosztuje czas i zmienia dokładność pomiaru,
    -możesz to przecież zrobić "w biegu bez strat".

    e mearcus
  • #88
    Mad Jaro
    Poziom 16  
    Masz rację na forum jest to tylko cześć okrojonego programu.

    Wklejam składowo pełny program, wyciąłem tylko poszczególne obliczenia. Może teraz będzie coś więcej wiadomo co może być przyczyną.

    Kod: vb
    Zaloguj się, aby zobaczyć kod
  • #89
    Mad Jaro
    Poziom 16  
    Jak zmusić diodę alarmu do migania nie używająć procedur waitms ?

    Mam teraz zrobine tak:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Ale dioda jedynie świeci. Wiem, że trzeba by wykorzystać do tego timer, ale nie za bardzo oriętuję się jak. Używam też tych timerów do innych celów tj. jak wyżej.

    Drugi problem, jest taki, że uśredniam sobie pomiar ADC (średnia z 10 ostatnich)
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Problem, w tym, że pierwszy wynik pojawia się dopiero po około 10 sekundach (bo co 1s wykonuje się pomiar z ADC). Chciałbym, aby te pierwsze pomiary były nie uśrednione, żeby można było zaraz po włączeniu odczytać ich wartość. A dopiero po tych dziesięciu pomiarach się uśredniały. Da się to jakoś zrobić ?
    Próbowałem wstawić warunek:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Ustawiając Flaga_1uruchomienie na 1 przed pętlą główną, ale efekt jest taki, że mam tylko przez ułamek sekundy pierwszy wynik nie uśredniony, a potem 0, aż wyliczy średnią z 10 i pojawi się wynik uśredniony.
  • #90
    tietom
    Poziom 12  
    Problem leży w tym że zaraz po pierwszym odczycie bez uśredniania wyników zerujesz flagę

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    a powinno być

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod