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

Atmega8 [Bascom] - Błędny odczyt obrotów, zakłócenia od elektrozaworu

janoo0 02 Lut 2013 02:34 3789 14
  • #1 02 Lut 2013 02:34
    janoo0
    Poziom 10  

    Witam
    Od pół roku montuję i modyfikuję wielozadaniowy układ do samochodu osobowego, oparty o Atmega8 (program Bascom).
    Funkcje:
    -pomiar temperatury i ciśnienia oleju
    -pomiar składu mieszanki
    -pomiar temperatury cieczy chłodzącej
    -odczyt zerowego położenia przepustnicy
    -pomiar prędkości obrotowej silnika (pomiar czasu między impulsami zapłonowymi)
    -regulacja wolnych obrotów silnika (elektrozawór z Forda Focusa sterowany zmiennym wypełnieniem impulsu, w oparciu o sygnały prędkości obrotowej, położenia przepustnicy i temperatury cieczy chłodzącej)
    -wyświetlanie parametrów na LCD 2x16
    Mam spory problem z zakłóceniami generowanymi przez elektrozawór sterujący wolnymi obrotami silnika. Bez podłączonego elektrozaworu układ funkcjonuje poprawnie, po podłączeniu zaczyna niepoprawnie odczytywać prędkość obrotową silnika (odczyt skacze po różnych wartościach, czasami przekraczających 10000 obr/min przy obrotach ok 1000, czasami na dosłownie sekundę wskakuje poprawna wartość) Błędy zanikają po odłączeniu zasilania zaworu i pomiar przebiega poprawnie. Obstawiam przypadkowe przerwania generowane na wejściu sygnału z cewki INT1 lub wręcz ich zaniki co powoduje zliczenie niepoprawnej liczby taktów zegara. Przeczytałem parę tematów na temat zakłóceń spowodowanych np. przekaźnikami (cewka przekaźnika pracuje jak cewka elektrozaworu, tylko większa częstotliwość) Zastosowałem się do zaleceń (diody przepięciowe, kondensatory itp) ale problem nie znika. Proszę o pomoc, jestem samoukiem (inż. ale mechaniki :)) i możliwe , że popełniam trywialny błąd który wyłapiecie w 5 sekund. Czy dioda Zenera na elektrozaworze spełnia swoją funkcję, czytałem, że powinna być Schottky'ego? Ma to znaczenie?
    Załączam schemat mojego układu.
    Atmega8 [Bascom] - Błędny odczyt obrotów, zakłócenia od elektrozaworu

    0 14
  • #2 02 Lut 2013 05:20
    Robewit
    Poziom 25  

    Dioda Schottky'ego wcale by nie zaszkodziła. Nie napisałeś jaki prąd pobiera cewka. Zasil cewkę od strony anody diody na wejściu zasilacza i zwiększ kondensator na zasilaniu do 1000uF. Sygnały z cewki zapłonowej i do elektrozaworu wypadałoby odseparować galwanicznie np.: transoptorem.

    0
  • #3 02 Lut 2013 09:28
    shadow0013
    Poziom 34  

    Zasilanie AVCC przez dławik, poczytaj Link.

    0
  • #4 02 Lut 2013 11:17
    Jacek Rutkowski
    Poziom 24  

    Stosowanie transoptorów może pomóc ale będą problemy ze sterowaniem tranzystorem, który to na 99% jest powodem problemów. Przez pojemność bramka-źródło przedostają się szpilki do procesora powodując jego zakłócanie. Zastosuj bufor scalony do sterowania mosfetem lub tranzystorowy zasilany z 12V np. taki:
    Atmega8 [Bascom] - Błędny odczyt obrotów, zakłócenia od elektrozaworu

    0
  • #5 02 Lut 2013 14:15
    paluch_gda
    Poziom 16  

    Też składam coś takiego tylko zastanawia mnie jedna rzecz. Jak dokonać pomiaru temperatury cieczy za pomocą DS18b20? Oryginalne czujniki wkręca się np. w blok głowicy a to? Na przewód chłodnicy i taśmą? Poza tym kolego janoo0 czy mógłbyś zapodać kawałek kodu który jest odpowiedzialny za pomiar prędkości obrotowej silnika? W moim przypadku mam dwa impulsy na obrót i moje rozwiązania nie za bardzo działają.

    0
  • #6 02 Lut 2013 14:23
    janoo0
    Poziom 10  

    Na wstępie dziękuję za zainteresowanie tematem.
    Po przeczytaniu odpowiedzi, pogooglowałem trochę i myślę że znalazłem odpowiedni układ TLP250 ( http://skory.gylcomp.hu/alkatresz/tlp250.pdf )
    Idealne połączenie waszych propozycji (scalony sterownik Mosfet z optoizolacją)
    Zamówiłem elementy, zaraz po montażu podzielę się wnioskami ale myślę, że to jest właśnie TO!!! :D
    PS shadow0013 nie zapomnę też o dławiku :)

    0
  • #7 02 Lut 2013 14:30
    dondu
    Moderator Mikrokontrolery Projektowanie

    Ten kondensator przy rezystorze pinu RESET powinien iść do masy, a nie do 5V:
    http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html

    Sterujesz tranzystorem bez rezystora na bramce.

    Przewody oraz ich ułożenie także mogą mieć znaczenie.

    ... w menu po prawej znajdziesz dział Zasilanie i zakłócenia.

    0
  • #8 02 Lut 2013 15:02
    janoo0
    Poziom 10  

    Do paluch_gda
    Jutro podrzucę kod i kilka plików o które się opierałem. Odnośnie czujnika to kupiłem coś takiego:
    http://www.dabtuner.pl/Czujnik_temperatury_Auto_Gauge-102.html
    Wybebeszyłem środek (rozwiercasz plastik i wyciągasz termorezystor) zostaje sama obudowa z gwintem 1/8 cala (popularny w motoryzacji). Wlałem do końcówki obudowy pastę termoprzewodzącą, wsadziłem DS-a z przylutowanymi przewodami i zalałem dwuskładnikowym klejem epoksydowym, np Distal.
    Czujnik wkręcasz jak masz gdzie, albo kupujesz coś takiego http://www.dabtuner.pl/Adapter_zlaczka_pod_czujnik_temperatury_cieczy_28_42mm-40.html
    (lub robisz coś sam, zawsze będzie taniej)
    Zakładasz na przewód do nagrzewnicy "mały obieg" bo tam płyn przepływa cały czas a do chłodnicy tylko jak termostat otworzy "duży obieg".
    W głowicy raczej nie znajdziesz zaślepionych kanałów wodnych, prędzej olejowe.

    Może napisz jaki to silnik (ile cylindrów, zapłon elektroniczny czy przerywacz) to prędzej coś wykombinujemy :D

    Dodano po 7 [minuty]:

    dondu napisał:
    Ten kondensator przy rezystorze pinu RESET powinien iść do masy, a nie do 5V:
    http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html


    Błąd rysunkowy, kondensator idzie do masy

    0
  • #9 02 Lut 2013 16:25
    paluch_gda
    Poziom 16  

    No w sumie to nie wpadłbym na rozwiercanie czujnika :) Silnik to 1.1 spi od seicento czyli 4 cyl. i zapłon elektroniczny.

    0
  • #10 03 Lut 2013 00:09
    M. S.
    Poziom 34  

    Przypomnę tylko, że istnieją tranzystory bipolarne npn, które też radzą sobie z wysterowaniem cewki. Czy na pewno musisz użyć MOSFET'a?

    0
  • #11 03 Lut 2013 08:34
    Jacek Rutkowski
    Poziom 24  

    Nie ma znaczenia jaki tranzystor zastosuje i tak nie uniknie przedostawania się zakłóceń od kolektora na bramkę tranzystora przez jego pojemność, jeśli nie zastosuje "sztywnego" bufora problem nie zniknie.

    0
  • #12 03 Lut 2013 12:47
    janoo0
    Poziom 10  

    Przesyłam fragment kodu dla "paluch_gda"

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    Program mierzy czas między impulsami zapłonowymi wywoływanymi na cewce zapłonowej poprzez wywoływanie przerwania Int1. Następuje skok do podprogramu Licz_czas, startuje Timer0 i resetuje flagę Zez_pom (flaga Pom_zak jest zresetowana więc program główny nie jest wykonywany). Zlicza do 256 (8 bit), po każdym przepełnieniu odpala podprogram Licz_przep i do zmiennej Nr dodaje swoją pełną wartość 256. Przy następnym przerwaniu Int1 na skutek zresetowanej flagi Zez_pom w podprogramie Licz_czas przechodzi do częći Else zatrzymuje Timer0 i ustawia flage Pom_zak. Po ustawieniu flagi rusza program główny, w tym momencie zmienna Nr określa całkowitą liczbę taktów zegara zliczonych między przerwaniami Int1 (zliczane w przepełnieniach Timer0 do zmiennej Nr + resztka z Timer0 zapisana do zmiennej Temp) i definiuje "odcinek czasu" między przerwaniami Int1.
    Teraz liczymy ile takich "odcinków czasu" wystąpiłoby w ciągu minuty (bo wynik chcemy mieć w obr/min)
    W ciągu sekundy zegar wykonuje 8000000 taktów (częstotliwość rezonatora), więc w ciągu minuty wykonuje 60*8000000=480000000 taktów. Wartość 480000000 dzielimy przez nasz "odcinek czasu" (Nr, takty zliczone między przerwaniami Int1) i otrzymujemy ile takich "odcinków czasu" zmieściłoby się w jednej minucie.
    U mnie w 4-ro cylindrowym silniku z jedną cewką zapłonową na dwa obroty wału (pełny cykl pracy) na jednej cewce generowane są 4 takie "odcinki czasu" (iskra przeskakuje po raz na każdej ze świec), więc na 1 obrót wału przypadają 2 "odcinki czasu". Dzielimy więc wartość Nr (liczba "odcinków czasu" w 1 minucie) przez dwa i otrzymujemy prędkość obrotową w obr/min.
    W Twoim przypadku silnik posiada 2 cewki zapłonowe (jedna obsługuje cylindry 1,4 a druga 2,3) i na każdej z tych cewek impuls "odcinek czasu" generowany jest 2 razy na dwa obroty wału, czyli jeden raz na każdy obrót wału. Więc Ty podepniesz się pod jedną z cewek i pominiesz w programie linijkę
    Nr = Nr / 2
    i powinno działać :D

    Dodano po 11 [minuty]:

    PS
    Rezystor 5kOhm przez który podaję impulsy z cewki na Atmega najlepiej dobrać eksperymentalnie (potencjometr ustawiasz na 10 KOhm i zmniejszasz oporność, aż program zacznie funkcjonować)
    !!! zbyt niski opór zakłóci działanie cewki, więc dobrze żeby był możliwie duży!!!
    Oczywiście cały układ funkcjonuje przy cewce sterowanej masą (stałe zasilanie 12v, masa podawana impulsami), ale z tego co wiem to większość układów zapłonowych jest tak sterowanych.
    Idę na rower, bo mamy ładną pogodę :D
    Pozdrawiam

    0
  • #13 16 Kwi 2013 01:30
    paluch_gda
    Poziom 16  

    Wziąłem się w końcu za ten obrotomierz lecz mam pewien problem. Nie mogę użyć Timer0 bo używam go do przerwań w menu i obsługi przycisków. Pozostaje mi timer1 który jest 16bitowy i liczy do 65536. I teraz wystarczy preskaler na 256?

    Pamięć mi się kończy - mam zegar z ustawianiem czasu, 3 temp., woltomierz, a to wszystko w przełączalnym menu na 4 ekrany - chyba czas na atmege32 :)

    0
  • #14 16 Kwi 2013 05:21
    zumek
    Poziom 39  

    paluch_gda napisał:
    ...chyba czas na atmege32 :)

    Jeżeli brakuje Ci tylko pamięci programu, to "wstaw" ATMega328p, a nie będziesz musiał zmieniać PCB.

    0
  • #15 19 Wrz 2015 09:43
    janoo0
    Poziom 10  

    Temat przestarzały, czas przenieść do archiwum.

    0