Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wskazówkowy obrotomierz - Obrotomierz wskazówkowy na Atmega8

konkretny25 12 Lut 2013 14:26 14727 58
  • #1 12 Lut 2013 14:26
    konkretny25
    Poziom 10  

    Witam szanownych kolegów.
    Chciał bym poruszyć po raz n-ty problem obrotomierza samochodowego. Jednakże pozwoliłem sobie stworzyć do tego osobny temat ze względu na odmienność konstrukcji tegoż chyba najstarszego przyrządu pomiarowego. Mam nadzieję, iż moderatorzy będą tego samego zdania i nie usuną tematu.

    Chciał bym samodzielnie wykonać obrotomierz samochodowy, który wskazywał zmierzoną prędkość obrotową przy pomocy wskazówki, jak to jest zrobione w "prawdziwych" samochodach. Mój do takowych nie należy ze względu na swój wiek.

    Wg informacji z różnych czasopism motoryzacyjnych najbardziej przyjemne dla użytkownika są obrotomierze w których wskazówka jest wychylana silnikiem krokowym. Takie obrotomierze dają pomiar najbardziej stabilny, wskazówka nie drga, jest nieczuła na wibracje samochodu i t.d. Cóż, teraz kolej na obliczenia.

    W moim aucie jest benzynowy silnik z rozrządem gaźnikowym. Impulsy pomiarowe postanowiłem uzyskiwać z cewki zapłonowej. Z dyskusji jakie są na elektrodzie dowiedziałem się, iż takie silniki dają 4 impulsy na jeden obrót wału napędowego silnika. Postanowiłem, iż skala pomiarowa mojego obrotomierza będzie do 9000 obr/min. Zapewne zakres ten z pewnością wystarczy nie tylko mi ale i wielu innym kolegom z elektrody. Natomiast rozdzielczość wybrałem co 100 obr/min. Z taką rozdzielczością wskazywał obrotomierz w nowym aucie mojego znajomego. Być może, iż to jest zbyt dokładnie, ale nic nie stoi na przeszkodzie by to zmienić programowo.
    Czyli 9000obr/min -> daje 150 obr/sek -> daje 600Hz przy założeniu 4 impulsów na obrót wału. Jeżeli teraz weźmiemy Atmega8 i zrobimy przerwanie co 0.3 sekundy do otrzymamy 180 impulsów przy 9000 obr/min. Czyli spokojnie możemy wykorzystać do tego timer0 pozwalający zliczyć maksymalnie 256 impulsów.
    Silniki krokowe, jakie są dostępne na allegro mają 200 kroków na jeden obrót, czyli 1.8 stopnia na jeden krok. Jeżeli mamy pomiar do 9000 obr/min z rozdzielczością 100 obr/min to daje nam to dokładnie 90 kroków do wykonania przez silnik aby wskazać 9000 obr/min od 0 obr/min. Przy 1.8 stopni/krok i 90 krokach daje nam to wychylenie 162 stopni. Na kolana nie powala, ale może być.

    Sprawdziłem eksperymentalnie, ze posiadany przeze mnie silnik krokowy potrafi obracać się płynnie przy szybkości przełączania kroków nie częściej niż co 3ms. Czyli żeby wykonać 90 kroków do pełnego wychylenia potrzebuje 270ms. Przerwanie mamy co 300ms, czyli powinno działać.

    No ale jak zrobiłem to wszystko na Atmega8 obrotomierz nie działa. Jak podam sygnał z generatora funkcyjnego (przebieg prostokątny, amplituda 5V, częstotliwość płynnie zmieniam w przedziale 35Hz - 600Hz) to silnik zaczyna drgać i nie reaguje na zmianę ilości odczytywanych impulsów. Chociaż jak zrobiłem pomiar na LCD to wszystko działa. Wyświetlacza pokazuje prawidłowy odczyt impulsów i spokojnie daje sie przeskalować na obr/min. Przerwanie co 0.3 sekundy zwraca ilość zmierzonych impulsów. Program główny przelicza te impulsy na ilość kroków do wykonania przez silnik krokowy aby wskazówka zatrzymała się na właściwym odczycie obr/min i następnie procesor wykonuje potrzebną ilość kroków silnikiem.

    Zanim wkleję kod chciał bym usłyszeć wasze opinie odnośnie moich rozważań teoretycznych. Pisze w C, kod nie jest skomplikowany, walczę już z tym problemem jakiś czas i nie wydaje mi sie, by były jakieś błędy w kodzie. Tym nie mniej wszystko jest możliwe.

    Stawiam raczej na to że gdzieś mam błąd merytoryczny i dlatego nie ma co się dziwić że obrotomierz nie działa.

    Może założenia są złe? Może ktoś już robił taki obrotomierz?

  • #4 12 Lut 2013 17:56
    Tom1988p
    Poziom 16  

    Cytat:
    Z dyskusji jakie są na elektrodzie dowiedziałem się, iż takie silniki dają 4 impulsy na jeden obrót wału napędowego silnika.

    No to kolega źle się dowiedział. Z tego co ja wiem to w czterosuwowym silniku to jest 1 obrót palca (kopułka z 4 wyjściami) na dwa obroty wału. Czyli inaczej ujmując dwa razy wytworzy iskrę na obrót jeden wału.

  • #5 12 Lut 2013 18:25
    michalko12
    Specjalista - Mikrokontrolery

    konkretny25 napisał:
    jak to jest zrobione w "prawdziwych" samochodach


    W "prawdziwych" samochodach...?
    Poczytaj sobie o air core gauge

  • #6 13 Lut 2013 07:56
    konkretny25
    Poziom 10  

    Jeżeli chodzi o schemat to jest pewien kłopot. Nie robiłem tego układu na uniwersalnej płytce drukowanej czy coś podobnego. Jestem szczęśliwym posiadaczem zestawu ewaluacyjnego na którym chce najpierwsz zrobić, przetestować i mieć prawidłowo działający układ a później do niego zaprojektować dedykowaną płytke drukowaną. Tak więc układ połączeń będzie w opisie progamu. Atmega8 chodzi na zewnętrznym kwarcu 8MHz.

    Oto kod programu. Nic specjalnego: timer0 zlicza impulsy pracując jako licznik, timer1 co 0.3 sekundy te impulsy odczytuje i przekazuje do głownego programu. W glownym programie impulsy odczytane są dzielone przez 2 i mamy w wyniku ilość kroków do wykonania przez silnik krokowy. Silnik podlączony jest do młodszych 4 bitów pordu D. Gdy mamy ilość kroków do wykonania no to silnik jest obracany aż wykona zadaną ilość kroków. Rzecz jasna silnik nie jest podłączony bezpośrednio do portu D lecz przez ULN2803. Myśle, że tak oczywistych rzeczy nie musze chyba mówić. Biblioteka do obsługi wyświetlacza pozostała jeszcze z czasów testowania programu na LCD 2x16.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeżeli chodzi o rzeczywistą ilość impulsów na obrót wału (cztery czy dwa) to upierać się nie będe. Być może jest ich rzeczywiście tylko dwa a nie cztery, jak ja przeczytałem na elektrodzie. Lecz jeżeli tak jest to nie tłumaczy to odmowy działania obrotomierza, bo obrotomierz powinien działać na stole laboratoryjnym i dopiero po zamontowaniu w aucie pokazywac obroty dwa razy mniejsze niż być powinno.

    Co do możliwości zastosowania serwomechanizmu to oczywiście taka możliwość była przeze mnie rozważana. Zwłaszcza że posiadam różne serwa przy okazji zabawy z modelarstwem i robotyką. Ale obrotomierz chce zrobić na silniku krokowym, a nie na serwie, wyświetlaczu tekstowym LCD, lub LED, lub graficznym LCD. Napewno istnieje wiele rozwiązań problemu pomiaru prędkości obrotowej. Ja chce zrobić na silniku krokowym i na tym problemie proponuje się skupić.

    Air core gauge - prosze o jakiś link. Na youtube zobaczyłem, iż jest to obrotomierz wskazówkowy i tyle.

  • #8 13 Lut 2013 08:13
    konkretny25
    Poziom 10  

    Ok, poczytałem sobie o tym air core gauge. Ciekawe. Ale żeby wykonać to w moim aucie potrzebuje specjalnego układu scalonego oraz mechanizm wykonawczy do wychylenia wskazówki. Nie ma ani jednego ani drugiego i nie są one w moim zasięgu. Inwestować w jakieś trudnoosiągalne elementy elektroniczne nie zamierzam. Wykonanać takie cewki też nie mam jak.
    Dlatego pozostańmy przy Atmega8 i silniku krokowym.

  • #9 13 Lut 2013 09:10
    michalko12
    Specjalista - Mikrokontrolery

    Dwa PWMy wystarczą, żeby tym sterować nie potrzeba żadnych specjalnych scalaków. Nie namawiam, chciałem tylko pokazać jak to jest zrobione w rzeczywistości, że nie są to silniki krokowe. Zobaczymy jak rozwiążesz problem synchronizacji / zerowania wskazówki po wyłączeniu zasilania.

  • #10 13 Lut 2013 09:25
    konkretny25
    Poziom 10  

    michalko12 napisał:
    Zobaczymy jak rozwiążesz problem synchronizacji / zerowania wskazówki po wyłączeniu zasilania.

    Widze ze kolega nie zadał sobie trudu przeczytać chociaż komentarze zawarte w treści programu.
    Otóż jestem świadom tego, że najczęściej po wyłączeniu silnika poprzez przekręcenie kluczyka w stacyjce, zasilanie obrotomierza będzie odłączane wcześniej, niż wskazówka zdąży powrocić do 0. Można to rozwiązać na wiele sposobów, naprzykład:
    - pozostawić zasilanie na obrotomierzu ciągle, niezależne od położenia kluczyka w stacyjce. Dość niefortunne rozwiązanie wg mnie, bo akumulator nie jest bezdenny.
    - zrobić sprzężenie zwrotne do Atmega poprzez pomiar położenia rzeczywistego wskazówki. Przerost formy nad treścią moim zdaniem.
    - zrobić procedure inicjalizacji obrotomierza, polegającą na gwarantowanym cofnięciu wskazówki do 0 każdorazowo przy włączaniu zasilania. I to właśnie mam zrobione. Za każdym razem jak obrotomierz jest uruchamiany silnik wykonuje 90 kroków wstecz, czyli nawet jak odłączyć zasilanie przy ostatnim odczycie 9000rmp wskazówka powróci do 0 przy następnym uruchomieniu. Dopiero po wykonaniu procedury inicjalizacji Atmega zacznie zliczać impulsy pomiarowe i sterować silnikiem. Oczywiście, to wszystko działa pod warunkiem ze silnik nie "gubi" kroków. Ale gdyby gubił to cała zabawa w ogóle byłaby pozbawiona sensu.

  • #12 13 Lut 2013 09:42
    konkretny25
    Poziom 10  

    Na 0 obr/min jest mechaniczne ograniczenie. Wskazówka nie może wskazać mniej niż 0 obr/min. Czyli jak ona zatrzyma sie na 10, a silnik wykona 90 to już od 80 kroku wskazowka zostanie zahamowana i silnik po prostu nie obroci się dalej. Na szczęście nie ma on takiego momentu obrotowego by przez to uszkodzić wskazówke lub coś innego.

    Dlaczego silnik krokowy? Bo mam. Bo spotkalem sie z publikacjami, że wykorzystuje się silniki krokowe do tego typu zadań. Bo chce zrobić jakiś sensowny własny projekt na silniku krokowym. Pomyślałem, że będzie to niezłe doświadczenie z tymi silnikami i niebanalny problem kostrukcyjy. Powodów jest wiele.

    P.S. a zeby mieć 100% pewności można zrobić jeszcze ograniczenie mechaniczne na 9000 obr/min. Tym sposobem wskazówka nigdy nie wychyli sie ponad 9000 obr/min, nie wiem, w wyniku jakiegoś zakłócenia, wibracji czy coś. Czyli wykonując 90 kroków wstecz na początku silnik zawsze, gwarantowanie ustawi wskazówke na 0 obr/min.

  • #13 13 Lut 2013 11:48
    piotrva
    Moderator Mikrokontrolery

    konkretny25 napisał:
    Dlaczego silnik krokowy? Bo mam. Bo spotkalem sie z publikacjami, że wykorzystuje się silniki krokowe do tego typu zadań. Bo chce zrobić jakiś sensowny własny projekt na silniku krokowym. Pomyślałem, że będzie to niezłe doświadczenie z tymi silnikami i niebanalny problem kostrukcyjy. Powodów jest wiele.

    1. Bo mam - to nie jest powód - serwomechanizm kosztuje max 20zł
    2. Ja szczerze mówiąc raczej nie spotykałem się z wykorzystaniem silnika krokowego do ustawiania wskazówki...
    3 i 4 - jeśli ma to być projekt tylko naukowy, na którym chcesz się czegoś nauczyć, to ok, idź w tym kierunku, ale jeśli chcesz to umieścić w aucie to z silnikiem krokowym dałbym sobie spokój.

    UP: treści bez sensu, po konstruktywnych uwagach w poście poniżej wycofuję się z tego co powiedziałem powyżej.

    Poza tym Twoje zerowanie ma jedną wadę - nie wiesz na którym kroku stanął silnik, bo jeśli np. stanął na 4-tym, a Ty podczas zerowania podasz pierwszy, to wtedy pierwszy z 90-ciu kroków zostanie wykonany w prawo.

    Co do kodu to to nie ma sensu:
    Code:

    else PORTD=0x00;

    Silnik powinien być trzymany w swojej pozycji.

    A powiedz jeszcze jak dokładnie zachowuje się układ? I czy masz możliwość podpięcia dodatkowo LCD, żeby widzieć co się dzieje ze zmiennymi w programie?

  • #14 13 Lut 2013 13:15
    WOBI
    Poziom 19  

    piotrva napisał:
    1. Bo mam - to nie jest powód - serwomechanizm kosztuje max 20zł
    2. Ja szczerze mówiąc raczej nie spotykałem się z wykorzystaniem silnika krokowego do ustawiania wskazówki...
    3 i 4 - jeśli ma to być projekt tylko naukowy, na którym chcesz się czegoś nauczyć, to ok, idź w tym kierunku, ale jeśli chcesz to umieścić w aucie to z silnikiem krokowym dałbym sobie spokój.


    2. I tu się mylisz! Jak byś rozbierał liczniki samochodowe, to wiedziałbyś że część liczników ma wskazówki prędkościomierza, obrotomierza, wskaźnik paliwa itp wykonane na silnikach krokowych. Tak sie składa że naprawiam na co dzień liczniki samochodowe (i nie chodzi tu o cofanie liczników) i widzę jakie są konstrukcje i co producenci stosują do napędów wskazówek. Chociażby w skodzie Fabia są tylko małe silniczki krokowe do wszystkich wskazówek. Więc proszę nie wprowadzaj piszącego post, proszącego o pomoc i forumowiczów w błąd.

    Co do serwomechanizmu to nigdy nie uzyskasz tak płaskiego gabarytu (chodzi o cieńkość, grubość jak przy silniku krokowym) no chyba że kupisz mikro mechanizm ale to juz nie kosztuje 20zl, poza tym serwomechanizm ma błąd położenia kątowego zależny od kilku czynników np. temperatury, to nie jest precyzyjne urządzenie i będą problemy ze wskazaniem tej samej np. prędkości obrotowej przy różnych czynnikach występujących w samochodzie (błąd wskazania) Dlatego fabryki samochodów nie stosują takiego rozwiązania (chodzi też o trwałość itp) serwomechanizm na pewno nie przeżyje zakładanego czasu pracy w samochodzie, a serwisy miały by tylko urwanie głowy z naprawami liczników.

    konkretny25 napisał:
    Za każdym razem jak obrotomierz jest uruchamiany silnik wykonuje 90 kroków wstecz, czyli nawet jak odłączyć zasilanie przy ostatnim odczycie 9000rmp wskazówka powróci do 0 przy następnym uruchomieniu. Dopiero po wykonaniu procedury inicjalizacji Atmega zacznie zliczać impulsy pomiarowe i sterować silnikiem. Oczywiście, to wszystko działa pod warunkiem ze silnik nie "gubi" kroków. Ale gdyby gubił to cała zabawa w ogóle byłaby pozbawiona sensu.


    Kolego konkretny25 masz rację i dobrze myślisz, co do zerowania to liczniki fabryczne mają ogranicznik wskazówki na zerze i tak samo wykonują zerowanie cofając silnik do tyłu bo na tym polega zerowanie. Tylko jak sprawdzałem na oryginalnych licznikach tych kroków jest dużo więcej. Robiłem próby i jak pokręciłem wskazówkę nawet poza zakres skali to i tak po podaniu napięcia na licznik wskazówka wróciła na pozycje zerową. Po prostu tych kroków cofania jest dużo więcej i producent zakłada 360stopni kata obrotu, bo takie są te silniki krokowe w licznikach, a ogranicznik za pozycji zero i tak ogranicza na max czyli 360.

    Kolego konkretny25 masz dobry tok myślenia i prawidłowe rozumowanie i to sie chwali.

    Co do silnika czterosuwowego to dla jednego cylindra masz jak nazwa wskazuje (czterosuwowy) zapłon, iskrę raz na dwa obroty wału dla danego cylindra. Ilość zapłonów, iskry jest zależy od ilości cylindrów i nie zapominajcie że po za popularnym silnikiem 4 cylindrowym czterosuwowym są też 1 cylindrowe (np. kosiarka do trawy) 2 cylindrowe (np. fiat 126) 3 cylindrowe (np. Tico, Matiz) 6 cylindrowe, 8 czylindrowe i tak naprawdę ilość zapłonów na obrót wału jest zależny od ich ilości, od konstrukcji układy zapłonowego, czy jest jedna cewka i rozdzielacz czy jest bezrozdzielaczowy układ wielocewkowy.
    Dla Twojego silnika jak zakładam 4 cylindrowego z jedna cewką i rozdzielaczem to sa 2 zapłony na jeden obrót wału każdy co 180 stopni.
    Pozdrawiam

  • #16 13 Lut 2013 14:41
    konkretny25
    Poziom 10  

    Cytat:
    Poza tym Twoje zerowanie ma jedną wadę - nie wiesz na którym kroku stanął silnik, bo jeśli np. stanął na 4-tym, a Ty podczas zerowania podasz pierwszy, to wtedy pierwszy z 90-ciu kroków zostanie wykonany w prawo.

    Fakt. Tutaj przyznaje się bez bicia, że w programie trzeba koniecznie zastosować mechanizm pamiętania ostatniego wykonanego kroku tak, żeby koleny krok był wykonywany z pozycji bieżącej, a nie od pierwszego kroku. Nawet na początku miałem coś takiego zrobionego. Jednakże wobec niedziałającego programu zacząłem go stopniowo upraszczać, by zmusić układ do działania chociaż niedokładnego. Zeby wskazówka chociaż w przybliżeniu pokazywała zmierzone obroty. Ale program nie działał więc zacząłem od wersji najprostszej, którą stopniowo można później ulepszać. Więc obecnie jest tak, że jak trzeba wykonać obrót to silni się obraca, a gdy osiągnie zadną pozycję to sie zatrzymuje bez hamowania, po prostu stoi odłączony od zasilania którejkolwiek z cewek.

    Cytat:
    A powiedz jeszcze jak dokładnie zachowuje się układ? I czy masz możliwość podpięcia dodatkowo LCD, żeby widzieć co się dzieje ze zmiennymi w programie?.

    Silnik po prostu drga, wskazówka się nie obraca, częstotliwość drgań się nie zmienia. Podląd zmienych na LCD też probowałem, ale obsługa LCD wprowadza zakłócenia do programu głownego. Nie wiem, być może w bibliotekach do LCD są jakieś opóźnienia zrobione aby LCD działał prawidłowo, nie zagłębiałem się w to. Po prostu najpierw zrobiłem na LCD, zobaczyłem ze zmienne są jakie trzeba i odłączyłem LCD, bo z silnikiem nie chciał działać, jak powiedziałem.

    Cytat:
    Co do silnika czterosuwowego to dla jednego cylindra masz jak nazwa wskazuje (czterosuwowy) zapłon, iskrę raz na dwa obroty wału dla danego cylindra. Ilość zapłonów, iskry jest zależy od ilości cylindrów i nie zapominajcie że po za popularnym silnikiem 4 cylindrowym czterosuwowym są też 1 cylindrowe (np. kosiarka do trawy) 2 cylindrowe (np. fiat 126) 3 cylindrowe (np. Tico, Matiz) 6 cylindrowe, 8 czylindrowe i tak naprawdę ilość zapłonów na obrót wału jest zależny od ich ilości, od konstrukcji układy zapłonowego, czy jest jedna cewka i rozdzielacz czy jest bezrozdzielaczowy układ wielocewkowy.
    Dla Twojego silnika jak zakładam 4 cylindrowego z jedna cewką i rozdzielaczem to sa 2 zapłony na jeden obrót wału każdy co 180 stopni.
    Pozdrawiam.

    Możliwe, nie będe się kłócił. Najlepiej jak sprawdzę w aucie. Ale to nie ma znaczenia w obecnej chwili. Wystarczy zmienic współczynnik skalowania, być może zwiększyć czas pomiędzy przerwaniami, powiedzmy co 500ms, zeby Atmega zdążył zliczyć jakąś sensową ilość impulsów. To jest już kosmetyka, jak i w przypadku zamałej ilości kroków do zerowania.

    Cytat:
    Wobec konstruktywnych informacji i uwag wycofuję się ze swojego zdania - osobiście nie rozbierałem liczników w samochodach.
    Co do zerowania - też myślałem nad tym, żeby doradzić większą ilość kroków.

    Jak powiedziałem, mogę to zrobić, ale program działać nie zacznie. Na stole u mnie wskazówka zawsze ładnie wraca do 0, a później zaczyna drgać i to by było na tyle.

  • #17 13 Lut 2013 14:45
    michalko12
    Specjalista - Mikrokontrolery

    WOBI napisał:
    2. I tu się mylisz! Jak byś rozbierał liczniki samochodowe, to wiedziałbyś że część liczników ma wskazówki prędkościomierza, obrotomierza, wskaźnik paliwa itp wykonane na silnikach krokowych


    Jestem ciekaw czy potrafisz odróżnić silnik krokowy od air core gauge?

  • #18 13 Lut 2013 14:50
    konkretny25
    Poziom 10  

    Gwoli "wyjścia awaryjnego" czy mógłby szanowny kolega wskazać mi miejsce, w którym mogę dostać taki air core gauge, gdyby nie udało mi się zrobić to co chce na silniku krokowym?
    Myśle że najlepiej gdyby to były zegary od jakiegoś auta, ktore to można tanio kupić na allegro. Chciał bym wiedzieć jakiś konkretny model. Zeby ten element dał łatwo się wymontować i nadawał się później do użycia. Często jedna obudowa jest wspólna dla wielu podsezpołów i taki element można stosować tylko jako całość lub wyrzucić wszystko.
    Czyli czy wie szanowny kolega w jakim aucie są te air core gauge z zewnątrz nie do odróznienia od silnika krokowego?

  • #19 13 Lut 2013 14:59
    WOBI
    Poziom 19  

    kolego michalko12

    Po pierwsze nic nie wnosisz do tego postu. Puste post dla samych punktów
    Po drugie napisałem że część liczników posiada silniki krokowe więc oczywiste że inne posiadają air core gauge?
    A co do air core gauge to co to ma być za pytanie? nie wszystkie liczniki maja taki napęd zbudowany air core gauge, czytasz to co napisałeś. Post jest o silniku krokowym więc trzymajmy się tego i pomóżmy autorowi postu a nie wyskakujesz z głupimi pytaniami. Lubisz obrażać innych? Może moderator przemówi Ci do rozsądku..

    Co do głównego tematu wątku.

    Masz błąd w logice programu. Przecież w pętli głównej programu nie możesz sprawdzać tylko czy wartość obliczona step_in > step_out.
    Prawidłowo powinieneś pamiętać poprzednią wartość kroków jaka była wykonana, od tego odjąć nowa wartość zmierzoną i wykonać ilość kroków silnikiem, obliczona różnicą i tylko różnicą, która może mieć wartość - lub + (pamiętaj że będzie to tylko parę kroków), a silnik będzie wykonywał tylko parę kroków (do przodu i do tyłu zależnie od obliczonej wartości, różnicy), po wykonaniu kroków silnikiem nic już nie robisz tylko czekasz na kolejny pomiar i dopiero ponownie wykonujesz kroki silnikiem, a tak to co robi Twój program to właśnie drga wskazówką bo cały czas pętla głowna steruje krokami silnika.
    Zmień pętle główną by wykonywała się tylko raz po przerwaniu compare, zrób jakąś flagę ustawianą w tym przerwaniu i obsłuż ją w pętli głównej.

  • #20 13 Lut 2013 15:47
    michalko12
    Specjalista - Mikrokontrolery

    WOBI napisał:
    kolego michalko12
    Po pierwsze nic nie wnosisz do tego postu. Puste post dla samych punktów
    Po drugie napisałem że część liczników posiada silniki krokowe więc oczywiste że inne posiadają air core gauge?
    A co do air core gauge to co to ma być za pytanie? nie wszystkie liczniki maja taki napęd zbudowany air core gauge, czytasz to co napisałeś. Post jest o silniku krokowym więc trzymajmy się tego i pomóżmy autorowi postu a nie wyskakujesz z głupimi pytaniami. Lubisz obrażać innych? Może moderator przemówi Ci do rozsądku..

    Sam uważaj na to co piszesz, albo czytaj ze zrozumieniem. Zadałem ci proste pytanie, czy odróżniasz silnik krokowy od ACG? To jest obrażanie? Zamiast się odgrażać, to na dowód, że wiesz o co chodzi trzeba było napisać co to ACG i jak działa. Bo ja jakoś nie spotkałem się z silnikami krokowymi w licznikach, ale za to wiem, że wszyscy jak widzą ACG to mówią, że to silnik krokowy.

  • #21 13 Lut 2013 16:38
    WOBI
    Poziom 19  

    Nie będę wyjaśniał zasady działania ACG bo to nie temat tego postu i nie muszę nikomu nić udowadniać, ale Ty widocznie coś musisz koniecznie udowodnić tylko sam nie wiesz co. Nawet nie stać Cię na pisanie z dużej litery. widać brak szacunku do innych i do tego grozisz słowem "Uważaj". Ja odróżnieniu od Ciebie pisze z dużej litery i nie używam takich zwrotów.

    Może chodzi Ci że, są mylone air core gauge z krokowymi bo występują częściej w licznikach i nie wiem po co tak się zapierasz. Przyjmij do wiadomości że niestety nie wszystkie liczniki mają air core gauge, niektóre mają silniki krokowe więc się nie wypowiadaj w tym tonie bo nie masz racji. Pomoc trzeba piszącemu post a nie prowadzić zbędne spory o nic.

    Proszę to jest air core gauge z dwoma skrzyżowanymi cewkami 90st o czym piszesz z licznika Wskazówkowy obrotomierz - Obrotomierz wskazówkowy na Atmega8

    a to cztery silniki krokowe w innym liczniku i nie są to ACG!!! tylko specjalne silniki krokowe mają po 4 cewki, napewno są to silniki krokowe bo maja w środku przekładnie zębatą zwiększającą dokładność/(mniejszy krok silnika i dokładny), tą przekładnie napędza właśnie silnik krokowy a wszystkim steruje uC.

    Wskazówkowy obrotomierz - Obrotomierz wskazówkowy na Atmega8

  • #22 13 Lut 2013 17:37
    michalko12
    Specjalista - Mikrokontrolery

    OK, zwracam honor!!!
    Zauważyłem , że GM się w tym lubuje. Mimo wszystko, sterowanie ACG i kontrola nad nim są dużo prostsze niż SM. Nieważne. Niech autor próbuje.

  • #23 13 Lut 2013 21:23
    konkretny25
    Poziom 10  

    WOBI napisał:
    Co do głównego tematu wątku.

    Masz błąd w logice programu. Przecież w pętli głównej programu nie możesz sprawdzać tylko czy wartość obliczona step_in > step_out.
    Prawidłowo powinieneś pamiętać poprzednią wartość kroków jaka była wykonana, od tego odjąć nowa wartość zmierzoną i wykonać ilość kroków silnikiem, obliczona różnicą i tylko różnicą, która może mieć wartość - lub + (pamiętaj że będzie to tylko parę kroków), a silnik będzie wykonywał tylko parę kroków (do przodu i do tyłu zależnie od obliczonej wartości, różnicy), po wykonaniu kroków silnikiem nic już nie robisz tylko czekasz na kolejny pomiar i dopiero ponownie wykonujesz kroki silnikiem, a tak to co robi Twój program to właśnie drga wskazówką bo cały czas pętla głowna steruje krokami silnika.
    Zmień pętle główną by wykonywała się tylko raz po przerwaniu compare, zrób jakąś flagę ustawianą w tym przerwaniu i obsłuż ją w pętli głównej.

    Chwileczkę, czegoś nie rozumiem. Najpierw procesor wykonuje procedure inicjalizacji, w wyniku której silnik ustawia wskazówke na 0 i zmienna step_out również jest równa zeru. Czyli proceros wie, ze silnik jest na pozycji 0. Teraz następuje odczyt, powiedzmy ze 2000 obr/min, czyli step_in jest równa 20. Silnik więc wykonuje 20 króków jednocześnie z każdym krokiem zwiększająć step_out aż do zrównania się z step_in.
    Jak te dwie zmienne się zrównają Atmega wchodzi do pętli else i zatrzymuje silnik.
    Powiedzmy ze kolejny odczyt jest 1000 obr/min, czyli należy cofnąć wskazówkę o 10 kroków, step_in=10, step_out wciąż 20. Silnik cofa wskazówke jednocześnie zmniejszająć step_out wykonując pętle else if. Tak że program główny chyba działa tak własnie jak kolega sobie życzy. Cały czas sprawdzana jest relacja pomiędzy step_in a step_out i w przypadku wystąpienia różnicy pomiędzy tymi dwoma parametrami podejmowana jest akcja niwelowania tej różnicy w zależności od tego jaki jest jej znak.

    Jeszcze pytanie do kolegi: w jakich pospolitych samochodach do wychylania wskazówek jest stosowany air core gauge? Jak powiedziałem, jeżeli pomysł z silnikiem krokowym niestety sie nie uda to sprobóje to zrobic wlaśnie na tym. No i zapewne bede musiał na allego kupić zegary/liczniki z jakiegoś szrotu żeby stąd wykręcić air core gauge.

  • #24 13 Lut 2013 21:51
    kamyczek
    Poziom 33  

    michalko12 napisał:
    OK, zwracam honor!!!
    Zauważyłem , że GM się w tym lubuje. Mimo wszystko, sterowanie ACG i kontrola nad nim są dużo prostsze niż SM. Nieważne. Niech autor próbuje.


    Po czym to zauważyłeś ? Po silniku i płycie zegara ? Te z fotki kolegi to grupa VW stary pasat B4 , VW T4 itp . Silniki jak najbardziej krokowe ...

  • #25 13 Lut 2013 22:42
    WOBI
    Poziom 19  

    konkretny25 napisał:
    Jeszcze pytanie do kolegi: w jakich pospolitych samochodach do wychylania wskazówek jest stosowany air core gauge? Jak powiedziałem, jeżeli pomysł z silnikiem krokowym niestety sie nie uda to sprobóje to zrobic wlaśnie na tym. No i zapewne bede musiał na allego kupić zegary/liczniki z jakiegoś szrotu żeby stąd wykręcić air core gauge.


    Jak byś poczytał linki które podał michalko12 to jest tam wyjaśnione jak to działa.
    Są dwie cewki umocowane między sobą tak że są ułożone między sobą pod kątem 90stopni, w środku jest umieszczony na osi magnes stały. Pole magnetyczne wytworzone przez te cewki obraca tym magnes powodując obracanie wskazówki przymocowanej do tej osi. Kąt obrotu tego magnesu(osi, wskazówki) jest wynikiem różnicy prądów (pól wytworzonych przez te cewki). dlatego jest proste sterowanie, używa się najczęściej dwóch PWM do sterowania tymi cewkami. Po polsku można powiedzieć że budowa jest prawie taka sama jak woltomierz ilorazowy ze skrzyżowanymi cewkami.


    Wskazówkowy obrotomierz - Obrotomierz wskazówkowy na Atmega8

    Wskazówkowy obrotomierz - Obrotomierz wskazówkowy na Atmega8

    Wskazówkowy obrotomierz - Obrotomierz wskazówkowy na Atmega8

    konkretny25 napisał:
    Chwileczkę, czegoś nie rozumiem. Najpierw procesor wykonuje procedure inicjalizacji, w wyniku której silnik ustawia wskazówke na 0 i zmienna step_out również jest równa zeru. Czyli proceros wie, ze silnik jest na pozycji 0. Teraz następuje odczyt, powiedzmy ze 2000 obr/min, czyli step_in jest równa 20. Silnik więc wykonuje 20 króków jednocześnie z każdym krokiem zwiększająć step_out aż do zrównania się z step_in.
    Jak te dwie zmienne się zrównają Atmega wchodzi do pętli else i zatrzymuje silnik.
    Powiedzmy ze kolejny odczyt jest 1000 obr/min, czyli należy cofnąć wskazówkę o 10 kroków, step_in=10, step_out wciąż 20. Silnik cofa wskazówke jednocześnie zmniejszająć step_out wykonując pętle else if. Tak że program główny chyba działa tak własnie jak kolega sobie życzy. Cały czas sprawdzana jest relacja pomiędzy step_in a step_out i w przypadku wystąpienia różnicy pomiędzy tymi dwoma parametrami podejmowana jest akcja niwelowania tej różnicy w zależności od tego jaki jest jej znak.


    Niby logika jest dobra, ale napisałem byś zrobił flagę i tylko raz robił sterowanie silnikiem, raz na jeden pomiar i do tego pomiar powinien być dopiero odczytany po wykonaniu kroków silnika z ostatniego pomiaru. Zrób tak i zobacz jak działa.

  • #26 13 Lut 2013 23:23
    michalko12
    Specjalista - Mikrokontrolery

    kamyczek napisał:
    michalko12 napisał:
    OK, zwracam honor!!!
    Zauważyłem , że GM się w tym lubuje. Mimo wszystko, sterowanie ACG i kontrola nad nim są dużo prostsze niż SM. Nieważne. Niech autor próbuje.


    Po czym to zauważyłeś ? Po silniku i płycie zegara ? Te z fotki kolegi to grupa VW stary pasat B4 , VW T4 itp . Silniki jak najbardziej krokowe ...


    Nie napisałem, że te na zdjęciu są od GM. W necie wyszperałem cała listę tych silników używanych przez GM i na tej podstawie to napisałem.


    Cytat:
    Chwileczkę, czegoś nie rozumiem. Najpierw procesor wykonuje procedure inicjalizacji, w wyniku której silnik ustawia wskazówke na 0 i zmienna step_out również jest równa zeru. Czyli proceros wie, ze silnik jest na pozycji 0. Teraz następuje odczyt, powiedzmy ze 2000 obr/min, czyli step_in jest równa 20. Silnik więc wykonuje 20 króków jednocześnie z każdym krokiem zwiększająć step_out aż do zrównania się z step_in.
    Jak te dwie zmienne się zrównają Atmega wchodzi do pętli else i zatrzymuje silnik.
    Powiedzmy ze kolejny odczyt jest 1000 obr/min, czyli należy cofnąć wskazówkę o 10 kroków, step_in=10, step_out wciąż 20. Silnik cofa wskazówke jednocześnie zmniejszająć step_out wykonując pętle else if. Tak że program główny chyba działa tak własnie jak kolega sobie życzy. Cały czas sprawdzana jest relacja pomiędzy step_in a step_out i w przypadku wystąpienia różnicy pomiędzy tymi dwoma parametrami podejmowana jest akcja niwelowania tej różnicy w zależności od tego jaki jest jej znak.


    W kodzie zmienna imp zdefiniuj jako volatile.

  • #27 14 Lut 2013 09:35
    konkretny25
    Poziom 10  

    WOBI napisał:
    konkretny25 napisał:
    Jeszcze pytanie do kolegi: w jakich pospolitych samochodach do wychylania wskazówek jest stosowany air core gauge? Jak powiedziałem, jeżeli pomysł z silnikiem krokowym niestety sie nie uda to sprobóje to zrobic wlaśnie na tym. No i zapewne bede musiał na allego kupić zegary/liczniki z jakiegoś szrotu żeby stąd wykręcić air core gauge.


    Jak byś poczytał linki które podał michalko12 to jest tam wyjaśnione jak to działa.
    Są dwie cewki umocowane między sobą tak że są ułożone między sobą pod kątem 90stopni...

    Kolega nie zrozumiał mojego zapytania. Nie chodzi mi o wyjaśnienie zasady działania air core gauge. Oczywiście zapoznałem się z linkami kolegi michalko12, oceniam je jako ciekawe, zasada działania air core gauge jest dla mnie zrozumiała. Lecz teraz chodzi mi o problem typowo praktyczny i przyziemny. Otóż kolega napisał, że naprawiał dużo różnych liczników samochodowy. Zakładam więc, że kolega wie o nich wystarczająco dużo. Chciał bym wiedzieć w jakich zegarach pospolitych i tanich są użyte air core gauge. Informacja ta pozwoli mi na tani zakup takiego licznika np. na allegro i wykręcenia z niego air core gauge do eksperymentów i zabaw. Więc proszę podać po prostu: VW Polo, rocznik 95-99 czy jakos tak.

    WOBI napisał:

    Niby logika jest dobra, ale napisałem byś zrobił flagę i tylko raz robił sterowanie silnikiem, raz na jeden pomiar i do tego pomiar powinien być dopiero odczytany po wykonaniu kroków silnika z ostatniego pomiaru. Zrób tak i zobacz jak działa.

    Mógłby kolega nieco szczegółowo opisać o co chodzi? Nie jestem orłem jeżeli chodzi o programowanie, raczej nowicjuszem.

    michalko12 napisał:
    W kodzie zmienna imp zdefiniuj jako volatile.

    Proszę powiedzieć co ma być efektem tej zmiany?

  • #29 14 Lut 2013 10:53
    WOBI
    Poziom 19  

    •stosuj volatile do wszystkich zmiennych globalnych,
    •stosuj volatile zawsze dla zmiennych używanych w przerwaniach i poza nimi.
    Takie podejście zmniejszy ilość Twoich problemów w początkowej fazie nauki C. Później gdy już poznasz dokładniej język C, będziesz wiedział kiedy i jakie odstępstwa od tych zasad można lub należy robić.

    Poczytaj to Link do dobrego artykułu

    A co do kodu to tak na szybko wstawiona flaga i poprawione definicje zmiennych.
    Zauważ że zmienna i jest int, wystarczy bajt, dodatkowo w Twoim programie też może być zgubione i, do tego definiujesz tablicę 4 elementy jako integer a to zbędne, wystarczy 8 bitów, to samo dotyczy imp bo przecież timer0 jest 8bit. Zmienne Step to samo po co integer.

    Nie obsługujesz też przepełnienia Timera0 a powinieneś, jeśli wystąpi "przekrecenie" z 255 na 0 to powinieneś wpisywać do zmiennej imp wartość max 255. to niby nie nastąpi, ale powinno być takie ograniczenie w programie bo to jest podstawa programowania, dobra obsługa zmiennych i kontrolowanie by zmienne nie wykraczały po za zakres. O tym sie najczęściej zapomina, pomyśl co się stanie jak zmienna imp przekroczy zakres? to taka mała sugestia na marginesie.

    Zobacz czy to zadziała.

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #30 14 Lut 2013 11:49
    BlueDraco
    Specjalista - Mikrokontrolery

    Ja dorzucę parę zasad (na początek):

    - nie deklaruj zmiennych używanych wewnątrz jednej procedury jako globalnych (i, step_in i step_out powinny być zadeklarowane wewnątrz main)

    - używaj const do deklaracji stałych (chwilowo odpuścimy straszenie słowem PROGMEM, co jest dość istotne w AVR) - tablica STEP (w zasadzie zbędna)

    - nie nazywaj danych nazwami złożonymi z samych wielkich liter, bo w C przyjęło się używać takich nazw tylko dla symboli preprocesora

    - używaj typów o jawnie określonej długości - uint8_t, int8_t, int16_t, uint16_t

    - nie używaj volatile bez sensu - w programie powyżej ten atrybut powinny mieć tylko zmienne imp i flaga_pom.

    - nie używaj rozejść warunkowych bez potrzeby - zamiast if (i >3) i = 0; napisz i &= 3;, tak samo przy dekrementacji i;

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME