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.

Moje rozwiązanie obsługi impulsatora obrotowego.

11 Sty 2011 21:46 12394 38
  • Poziom 15  
    Dlaczego mnie to interesuje?
    Mimo długiego poszukiwania i dyskusji z kolegami nie uzyskałem "gotowego" rozwiązania na obsługę tego urządzenia. Uzyskane rozwązania miały pewne wady, które przedstawię. Zamówiłem układ AVT-5042 Link. I opis Link. Okazało się, że kręcąc gałką impulsatora, liczba na wyświetlaczu zmieniała się niekiedy o dwie jednostki. Innym niedogodnym mankamentem było to, że przekręcając trochę i powracając do pozycji stabilnej, licznik wskazywał warość o 1 większą lub mniejszą (w zależności w którą stronę wykonałm ten ruch). Następnie sprawdziłem działanie takiego impulsatora, którego mam w mikrofalówce. I tam też można "zwiększyć/zmniejszyć" wartość licznika mimo tego, że pozycja końcowa pokrętła jest taka sama jak na początku.
    Przy tych urządzeniach nie ma to większego znaczenia - zawsze się wreszcie ustawi porządaną warość. Ale gdyby taki impulsator określał pozycję ruchomych części maszyny? Wiem, że impulsator nie do tego służy, ale zasada działania enkoderów do tego przeznaczonych opiera się na tej samej zasadzie. Chodzi o kod Graya wykorzystywany w impulsatorach i enkoderach.

    Pewne rozwiązanie.
    I teraz moje rozwiązanie. Na początek wykres.
    Moje rozwiązanie obsługi impulsatora obrotowego.
    Grube pionowe przerywane linie oznaczają stabilną pozycje i nadana im jest pozycja umowną liczbą "5". Pomiędzy pozycjami stabilnymi występują trzy pośrednie stany wyjść impulsatora. Czyli od pozycji stabilnej do następnej występują cztery "kroki" w kodzie Graya. "Szlaczki" na wykresie symulują drgania styków impulsatora. Mój kod programu sprawdza stan styków w zależności w jakim stanie aktualnie jest "znacznik impulsatora", czyli przykładowe "5".
    Dodanie lub odjęcie zawartości licznika odbywa się, gdy następuje zmiana "znacznika impulsatora" z wartości 2 na 5 (w dół) lub z wartości 8 na 5 (w górę). Takie rozwiązanie przypomina działanie bramki schmitta. Dodanie lub odjęcie wartości licznika następuje w końcowej fazie kręcenia impulsatorem (tuż przed wskoczeniem w stabilną pozycję). Drgania styków przy zwieraniu i rozwieraniu nie mają wpływu na prawidłową pracę. Najlepiej zobrazować to sobie można patrząc na wykres, zaczynając od środka wykresu ze "znacznikiem imulsatora" o wartości "5". Przesuwając się w lewo - znaczy kręcimy w lewo, w prawo - kręcimy w prawo. Osiągając pozycję "5", znów znajdujemy się w środku wykresu - więcej nie potrzeba.

    Kod programu w Bascom-ie:

    Cytat:
    'Pobieranie próbki wejść
    Temp10 = Pind
    In0 = Temp10.3 'przycisk impulsatora
    In1 = Temp10.4 'kanał In1 impulsatora
    In2 = Temp10.5 'kanał In2 impulsatora

    'Obsługa impulsatora
    Select Case Stan_imp
    Case 2:
    If In1 = 1 Then
    Stan_imp = 5
    If Czas > 0 Then ' - licznik
    Czas = Czas - 1
    End If
    End If
    If In2 = 0 Then Stan_imp = 3
    Case 3:
    If In1 = 1 Then Stan_imp = 4
    If In2 = 1 Then Stan_imp = 2
    Case 4:
    If In1 = 0 Then Stan_imp = 3
    If In2 = 1 Then Stan_imp = 5
    Case 5:
    If In1 = 0 Then Stan_imp = 6
    If In2 = 0 Then Stan_imp = 4
    Case 6:
    If In1 = 1 Then Stan_imp = 5
    If In2 = 0 Then Stan_imp = 7
    Case 7:
    If In1 = 1 Then Stan_imp = 8
    If In2 = 1 Then Stan_imp = 6
    Case 8:
    If In2 = 1 Then
    Stan_imp = 5
    If Czas < 99 Then ' + licznik
    Czas = Czas + 1
    End If
    End If
    If In1 = 0 Then
    Stan_imp = 7
    End If
    End Select


    Fragment tego kodu można zasymulować i zawiera niewiele taktów zegara. Ponaddto, nie zatrzymuje działania programu. Wiadomo, że musi on działać w pętli.
    Zastosowany kod z resztą programu obsługującego impulsator i jego przycisk (można nim krecić i przyciskać gałkę) plus obsługa dwóch wyświetlaczy 7-seg. (multipleksowanie), a do tego wszystkiego odliczanie czasu w tył - taki minutnik, wykonuje się ok 16 000 razy na sekundę przy prędkości zegara 8 MHz.

    Prędkość działania całego programu.
    Ten impulsator ma 24 stabilne pozycje na 1/obr (obrót). Miedzy stabilnymi pozycjami występują 4 różne stany jego wyjść, czyli w sumie 96 stanów na 1/obr.
    Próbkowanie z prędkością 16 000/sek pozwala na max prędkość 166,6 obr/s (16 000/96=166,6), czyli 10 000 obrotów na minutę. Ręcznie nie ma szns na uzyskanie takich prędkości.

    Pytanie końcowe:
    Czy jest inny sposób na obsługę takich impulsatorów i enkoderów - znaczy łatwiejszy?
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 32  
    Nie analizując kodu doradzilbym sprawdzić na innym impulsatorze albo ten co masz rozebrac i wyczyścić, gdyż bardzo czesto przyczyną może właśnie być zabrudzenie a nie sam program.
    Druga sprawa zamias analizować aktualne stany na wyjściach A i B analizuj nadchodzące zbocza. Po napotkaniu zbocza na wejściu A sprawdź stan na wejściu B w zalezności jaki jest ten stan masz lewo lub prawo kręcone. To algorytm w większości impulsatorów. Natomiast dalszym rozwinięciem jest analiza wszystki zboczy na wejsciach A i B i w tym przypadku to nawet brudne w połowie będą działać aczkolwiek program robi sie nieco bardziej skomplikowany.
  • Poziom 15  
    Witam i zapraszam do dyskusji.
    Do asembler:Impulator jest nowy- zamówiony wraz z całym osprzętem (tylko w częściach). Program wgrany w prosesor. Po złożeniu tego okazało się, że program sobie nie radzi - popełnia błędy, o których pisałem.

    Ja zmieniłem zastosowanie tego Kit-u, a co za tym idzie cały program napisałem na nowo. Stworzyłem program, który mi perfekcyjnie obsługuje impulsator, który zapewnia mi poprawne działanie (nawet przy prędkości 10 000obr/min)

    Mój program sprawdza poszczególne zmiany stanów od pozycji stabilnej do następnej stabilnej i wtedy dodaje lub odejmuje wartość licznika. Czyli efekt zmiany stanu licznika następuje tuż przed wskoczeniem impulsatora w sąsiedni stabilny punkt. Powtarzam: licznik się zmieni, gdy wyjścia A i B zmienią stany w odpowiedniej kolejności. Gdybym polegał na zmianie zboczy, to drgania styków wprowadziły by program w błąd. Określając kierunek przy pierwszych (drugich, trzecich i następnych...) napotkanych zboczach, objawia się tym, że licznik zwiększy lub zmniejszy swoją wartość, chodź do zmiany fizycznej pozycji impulsatora nie dojdzie- co jest istotne w pozycjonowaniu ruchomych części maszyn. Mój program nie dopuszcza zmian stanu licznika, gdy próbuję go "oszukać". Wszystkie minimalne (czy większe) ruchy pokrętła nie zmienią stanu licznika, gdy wrócę fizycznie do tej samej pozycji gałki. I jeszcze jedno. Mój kod nie zatrzymuje się i nie czeka na potwierdzenie ustalonego stanu styków, nie odlicza też czasu potrzebnego na ustabilizowanie się styków (kto wie ile trwa taki czas?).

    Moje pytanie.
    Czy mój algorytm" jest minimalnym rozwiązaniem, czy są prostsze rozwiązania?

    Do asembler: Może podasz swoje rozwiąznie - tylko nie prgram. Po prostu opisz.

    No i zapraszam całą rzeszę użytkowników jakie mają rozwiązania.
  • Moderator Mikrokontrolery Projektowanie
    Tak, są znacznie prostsze rozwiązania. Swego czasu w podobnym temacie pokazałem swoje, nieskromnie mówiąc chyba najprostsze jakie widziałem :) Twój problem pewnie wziął się z tego, że impulsatory występują w różnych wersjach, dających pomiędzy kliknięciami (stanami stabilnymi) 1, 2 lub 4 zmiany stanu w kodzie Graya. Rozwiązanie jest proste - zamiast kombinować, dzieli się stan przez 1, 2 lub 4 :)
  • Poziom 15  
    Jestem świadomy, że impulsatory występują w różnych wersjach. Ten co posiadam ma 4 stany między "kliknięciami".
    TMF - proszę wytłumacz mi to na konkretnym przykładzie, zakładając że mam zmienną LICZNIK, która powinna się zmienić o jeden w wyniku "przeskoczenia" tego typu impulsatora.
  • Poziom 38  
    Przyłączę się- bo wczoraj zacząłem się bawić z czyms podobnym.
    Impulsator też z AVT- 24 impulsy na obrót i przycisk.
    Mocno podejrzewam że taki sam.
    I nie udało mi się zaobserwować na oscyloskopie kilku przejść sygnału przy zmianie pozycji.
    Co prawda dodałem 10nF równolegle do oporników do +.
    Pavlik- skąd ten przebieg?
  • Moderator Mikrokontrolery Projektowanie
    Pavlik71 napisał:
    Jestem świadomy, że impulsatory występują w różnych wersjach. Ten co posiadam ma 4 stany między "kliknięciami".
    TMF - proszę wytłumacz mi to na konkretnym przykładzie, zakładając że mam zmienną LICZNIK, która powinna się zmienić o jeden w wyniku "przeskoczenia" tego typu impulsatora.


    Ale co konkretnie? Impulsator daje na jeden przeskok od 1 do 4 impulsów w zależności od typu. Więc dzielisz wynik przez ilość impulsów i już. Zauważ, że dla np. impulsatora dającego 4 imp/krok, w wyniku uzyskasz dla przeskoków 0-3 zawsze 0, a dla 4 masz 1. I to cała tajemnica :) Natomiast co do kodu - uprościć to można robiąc prosty dekoder kodu Graya (w którym pracuje impulsator) na kod binarny. Do tego można wykorzystać ex-or.
  • Poziom 38  
    tmf a czy swój kod mógłyś nieco bardziej skomentować?
    Code:

    //tmf
    unsigned char i=0;
       
        if((PINC & _BV(PC0))==0) i++;
        if((PINE & _BV(PE7))==0) i^=3; // convert gray to binary
       
        unsigned char enc_last=EncoderState & 3;
       i-=enc_last;
        enc_last+=i;
            EncoderState&=0xFC;
        EncoderState|=enc_last;
       
        if(i & 1)
        { // bit 0 = value (1)
        if(i & 2) NoOfPulses--; // bit 1 = direction (+/-)
        else NoOfPulses++;
        }

    Bo jest tak zakręcony ze krótszy chyba być nie może.
  • Moderator Mikrokontrolery Projektowanie
    Code:

    //tmf
    unsigned char i=0;
       
        if((PINC & _BV(PC0))==0) i++;  //PC0 i PE7 to piny do których podłączony jest enkoder
        if((PINE & _BV(PE7))==0) i^=3; // Konwersja kodu Graya do zwykłego binarnego
       
        unsigned char enc_last=EncoderState & 3; //Tylko 2 bity są istotne
       i-=enc_last;   //Poprzednia pozycja enkodera, potrzebne do określenia kierunku
        enc_last+=i; //Do ostatniej dodajemy bieżącą
            EncoderState&=0xFC;
        EncoderState|=enc_last; //EncoderState było potrzebne w moim programie, tu można to wywalić i wykorzystać enc_last deklarując ją koniecznie jako static
       
        if(i & 1)
        { // bit 0 zawiera wartość przesunięcia (0 brak, 1 zmiana o jedną pozycję
        if(i & 2) NoOfPulses--; // bit 1 - określa kierunek, lewo/prawo
        else NoOfPulses++; //NoOfPulses zawiera sumaryczną pozycję enkodera od ostatniego odczytu. Każdy odczyt powinien zerować tą zmienną, żeby mieć deltę
        }
  • Poziom 38  
    Czy to:
    Code:

    if((PINC & _BV(PC0))==0)

    Można zastąpić tym:
    Code:

    if(bit_is_clear(PORTC,0))
  • Poziom 38  
    Czy deklaracja z podstawieniem
    Code:

    unsigned char enc_last=EncoderState & 3; //Tylko 2 bity są istotne

    wewnątrz kodu a nie na początku jest zwykłym zwyczajem pisania kodu czy raczej wpisania w kod ad hoc tego co akurat jest potrzebne?
    Pytam bo nie wiem jakie są dobre zwyczaje pisania w C.
    Czy Twój kawałek kodu można zamknąć w funkcji?
    I wykorzystać w przerwaniu np. co 1ms?
    Zakładając że nie potrzeba debouncingu?
  • Moderator Mikrokontrolery Projektowanie
    To właściwie jest oddzielna funkcja, którą należy okresowo wywoływać. Albo przez pooling, albo z przerwania generowanego przez encoder i wtedy można ją jeszcze dodatkowo uprościć. Co do operacji, którą pokazałeś - w moim programiezmienna EncoderState na starszych bitach przechowuje inne wartości, np. stan przycisku enkodera itd. Stąd takie nieco dziwne operacje. Chodzi o to, żeby przepełnienie z dodawania nie zmieniało bitów innych niż 0 i 1. Można to rozwiązać bardziej elegancko stosując modulo lub po prostu robiąc pola bitowe (tylko to implikuje adresowanie indeksowe i w tym przypadku nieco wydłuża wygenerowany kod assemblerowy). Jeśli enc_last zrobisz jako static uchar to te operacje z EncoderState można sobie odpuścić. Debouncing w przypadku enkoderów generalnie nie jest potrzebny w ogóle, chyba, że każda zmiana stanu ma generować jakieś zdarzenie. Zazwyczaj pooling co pare ms sam w sobie stanowi formę debouncingu wystarczającą.

    Dodano po 2 [minuty]:

    A, jeszcze twoje pytanie o deklarację z podstawieniem. Nie, to nie jest typowe dla C, gdyż w oryginalnym standardzie języka deklaracje musiały występować na początku i nie mogły być umieszczone w dowolnym miejscu ciała funkcji. Dopiero nowsze standardy wprowadziły taką możliwość, analogicznie do C++. Także stosowanie tego jest kwestią gustu, ale o ile to możliwe dla czytelności lepiej jednak deklaracje używanych zmiennych umieszczać w jednym miejscu na początku, a potem tylko definicje.
  • Specjalista techniki cyfrowej
    janbernat napisał:
    Czy to:
    Code:

    if((PINC & _BV(PC0))==0)

    Można zastąpić tym:
    Code:

    if(bit_is_clear(PORTC,0))

    Tak, ale nie będzie działać.
  • Moderator Mikrokontrolery Projektowanie
  • Poziom 15  
    Witam.

    janbernat napisał:
    Przyłączę się- bo wczoraj zacząłem się bawić z czyms podobnym.
    Impulsator też z AVT- 24 impulsy na obrót i przycisk.
    Mocno podejrzewam że taki sam.
    I nie udało mi się zaobserwować na oscyloskopie kilku przejść sygnału przy zmianie pozycji.
    Co prawda dodałem 10nF równolegle do oporników do +.
    Pavlik- skąd ten przebieg?


    Na początek wyjaśnijmy sobie co nazywamy krokami, impulsami i stanami wyjść impulsatora.
    Impulsator przysłany z AVT ma 24 stabilne pozycje na obrót - czuć te stabilne pozycje przy kręceniu nim (dentycznie jak kółko w myszce). Między stabilnymi pozycjami występują 4 (cztery) różne kombinacje wyjść A i B. Tworzą one dwubitowy kod Graya. Kręcąc powoli w jedną stronę (przyjmijmy, że w prawą) od pozycji stabilnej do następnej stabilnej na wyjściach A i B mamy:
    A B -u mnie na wykresie In1, In2 (wyjścia impulsatora)
    1 1 - pozycja stabilna
    0 1
    0 0
    1 0
    1 1 - następna pozycja stabilna

    Kręcąc w drugą stronę:
    A B
    1 1 - pozycja stabilna
    1 0
    0 0
    0 1
    1 1 - następna pozycja stabilna

    Aby to zbadać wystarczy użyć "piszczka" w mierniku i powoli kręcić, albo podpiąć coś swiecącego na wyjścia impulsatora.
    A przebieg (wykres), to już moja wizualna interpretacja zachodzących zmian. Na tym przebiegu zaznaczyłem występowanie dragań styków (symbolicznie po jednym drgnięciu), stąd te wąskie fragmenty na wykresie.

    Moje rozwiązanie obsługi impulsatora obrotowego.

    tmf - nadal nie rozumiem o co chodzi. Dwubitowy kod Graya przyjmuje wartości od 0 do 3 (zamieniając go w binarny). Teraz tak: mając poprzednią wartość impulsatora np.0 i aktualny 1, rozumiem, ze należy dodać 1 (jeden) do licznika. I w drugą stronę: mając poprzednią wartość impulsatora np. 2 i aktualny 1 odejmujemy 1 od licznika.
    Jak realizujesz funkcję gdy wartość impulsatora zmienia się z 3 na 0 i na odwrót z 0 na 3?
    Wartość licznika podzielona przez 4 pokazuje nam aktualną liczbę "kliknięć" impulsatora.
    Tu też mam pewien problem (pod warunkiem, ze tak to działa). Kręcąc w prawo wyświetlana liczba zmieni mi się, gdy program "dobije" do liczby podzielnej przez 4. W drugą stronę - wyświetlana liczba zmieni się o jeden prawie natychmiast, bo wynik dzialenia przez 4 i liczba całkowita z tego dzielenia zmieni się na mniejszą o 1.

    Wytłumacz mi to opisowo, bo inaczej do końca życia będę używał mojego rozwiązania :)
  • Moderator Mikrokontrolery Projektowanie
  • Poziom 15  
    Nie znam tego języka programowania. Nawet nie wiem jak go nazwać. Dlatego nie rozumiem 3/4 części (oprócz słów kluczowych). Ale przecież można wszystko wytłumaczyć słowami. Wtedy każdy sobie to zrobi na swój sposób, w jakim kolwiek programie.
  • Poziom 38  
    Zgadza się- taki sam impulsator.
    Tylko trzeba było przełączyć oscyloskop na roll i baaardzo powoli kręcić impulsatorem.
    Język w jakim napisał to tmf nazywa się "Wysokie C"
    Przy pewnej dozie cierpliwości, z pomocą kilku książek i internetu da się to przetłumaczyć na "zwykłe C"
    Potem na "rozwlekłe C".
    A potem to już z górki.
  • Poziom 15  
    Ale można też opisać słowami zasadę działania algorytmu, tak jak często to jest opisywane w notach aplikacyjnych. Oprócz tekstu podawane są tam wzory i umowne dane. Przykładem takiego opisu jest generowanie sygnału DTMF w procesorach ATMELA-a. Zero kodów, zero programów, po prostu czysty opis.Link. Przytoczyłem ten link, bo właśnie na tym dokumencie robię generator DTMF. Okazuje się, że mogę zrobić tą generację bardziej dokładnie (2x dokładniej). Dlatego chciałbym wytłumaczenia mi zasady działania obsługi impulsatora słowami, bo wtedy każdy mógł by to zaaplikować do swojego programu.
  • Specjalista techniki cyfrowej
    tmf napisał:
    Niby czemu? Jak rozumiem makro bit_is_clear daje true jeśli bit jest wyzerowany, czyli robi dokładnie to samo co wcześniejsza instrukcja.

    Bo PORTC i PINC to co innego.
  • Poziom 32  
    Pavlik71 napisał:
    Do asembler: Może podasz swoje rozwiąznie - tylko nie prgram. Po prostu opisz.



    Code:

    FLIMP1A   EQU R15,7

    IMPULSATOR
       JNB FLIMP1A
                 JR IMP1A
       JBI PORTIMP1A
       JR IMP1ARET
        ;ZMIANA ZBOCZA Z 0 NA 1
       SET
       LD KLA,GLOSNIEJ
       JBI PORTIMP1B
       LD KLA,CISZEJ
       JR IMP1B

    IMP1A     CLT
       JBI PORTIMP1A
        ;ZMIANA ZBOCZA Z 1 NA 0

    IMP1B   BLD FLIMP1A

    IMP1ARET RET
  • Poziom 15  
    Ile taki kod zawiera bajtów i ile taktów zegara zajmuje?
    Na asemblerze też się nie znam, ale ufam, że działa dobrze. W moim temacie chodziło o zaprezentowanie najlepszego (krótkiego i wydajnego kodu) i o znalezienie tego tematu następnym poszukującym, męczącym się z tym problemem. Ja wcześniej nie znalazłem zadowalającej odpowiedzi, szukając w necie. Dlatego zrobiłem taki dla przyszłych "walczących" z tym czymś. Mam nadzieję, że to będzie dobry wątek, aby przyszli "konstruktorzy" mogli z niego skorzystać.
    Na koniec, było by fajnie, gdyby zasada obsługi była opisana słowami - takimi jak ja to pisałem na początku.

    Czy Twój kod można oszukać "fizycznie"? Mam na myśli powolne przekręcanie gałką impulsatora i w momencie zmiany wartości licznika wrócić do pozycji wyjściowej?
  • Poziom 32  
    22 bajty zajmuje
    wykonuje sie 4-9 taktów
    1.Wykrywam zbocze sygnału A
    2.Porównuje sygnał B '1' lewo '0' prawo
    Działa na impulsatorach "normalnie zwartych" jak ja to nazywam czyli sygnały na siebie nachodzą albo wewnętrzna budowa impulsatora na duższe styki niż przerwy miedzy stykami.
  • Poziom 15  
    A kiedy następuje zmiana licznika? Na początku kręcenia, czy tuż przed wskoczeniem w następny stabilny stan (mam na myśli 4 wartości kanałów A i B między stabilnymi pozycjami impulsatora)? I czy program zachowuje się tak samo, gdy kręci się w prawo i w lewo?. I ostatnie ważne pytanie, czy kręcąc chaotycznie i ustawiając impulsator w pozycji wyjściowej, to będę miał tą samą wartość, co przed kręceniem?
  • Poziom 32  
    Zmiana nastepuje po wykryciu zbocza. Stan licznika bedzie wzrastał lub malał o jeden po przejsciu wszytkich 4 stanów.
    A jak ma sie zachowywać?
    Spojrz na wykres czytajac go od przodu czy od tyłu jest taki sam.
    Kręcąc chaotycznie mozesz nie miec tej samej wartosci.
  • Poziom 15  
    asembler napisał:

    1.Wykrywam zbocze sygnału A
    2.Porównuje sygnał B '1' lewo '0' prawo

    I tu jest pies pogrzebany. Wyobraźmy sobie, że styk kanału A ma drgania (bo musi drgać). Wtedy program zmieni mi licznik o tyle ile zarejestrował zboczy. Druga opcja to taka, że wychylę impulsator troszeczkę, tak aby nastąpiło zbocze kanału A. Licznik zwiększy mi się o jeden(a może o więcej). Wracam gałką do popzycji wyjścowej mam warotość licznika inną niż na początku., Może jestem upierdliwy, ale chicałbym profesjonalnego rozwiązania problemu.
  • Poziom 32  
    Nie wiem jak to wykombinowałeś
    Ja ten programik umieszczam w przerwaniu od licznika ktore to przerwanie jest zawsze chociaz jedno w moich programach.( zegar liczniki programowe ,opóźnieniai t.p.)
    Profesjonalnie to trzebaby troszkę ten programik rozbudować ake wtedy nie jest najprostszy. A miało być prosto.
    Bardziej skomplikowany programik ma ponad 100 bajtów ale zato dzialają wszystkie rodzaje impulsatorów a nawet częściowo uszkodzony (brudne)
    Nie możesz wychylic troszeczkę bo wtedy zadziala tylko jedno zbocze opadające na przykład jak cofniesz to zbocze nie bedzi eopadające ale narastające, wiec program nie zareaguje. Czyli zeby zwiekszac/zmiejszac musisz dośc znacznie ruszać a impulsatory są własnie tak skonstruowane zeby ten ruch był odczuwalny w odróżnieniu od enkoderów które mają nawet 10000 imp na obrót.
  • Poziom 15  
    asembler napisał:
    Kręcąc chaotycznie mozesz nie miec tej samej wartosci.


    A mój program ma ta właściwość, że działa do pewnej prędkości (10 000/obr/min) i chaotyczność nie ma znaccenia. Ważne jest aby nie przekroczyć w tej chaotyczności tej prędkości, którą podałem.Szkoda, ze nie mam już tego urządzenia, bo bym nakręcił film.
  • Poziom 38  
    Wydaje mi się że program kol.tmf da się przetłumaczyć na Bascom.
    Code:

    void tmf_impulsator(void)//podprogram albo funkcja w Bascomie
    {
       uint8_t i=0;//deklaracje dim na początku programu
       static uint8_t enc_last;   

        if(bit_is_clear(PINC,4)) i++;//sprawdzenie czy impulsator się ruszył 'if pinc.4=0 then
        if(bit_is_clear(PINC,5)) i^=3; // convert gray to binary- tak samo jak na bramce XOR
       i-=enc_last;//i=i-enc_last
        enc_last+=i;//enc_last=enc_last+i

        if(i & 1)
        { // Na bicie 0 sprawdzamy czy coś się zmieniło //bit 0 = value (1)
           if(i & 2)// na bicie 1 sprawdzamy kierunek//bit 1 = direction (+/-)
          {
          NoOfPulses++;// NoOfPulses=NoOfPulses+1
          if (NoOfPulses>=96) NoOfPulses=0;//pozycji jest 24 a potem od pozycji 0
          PORTB=0xfe;//sygnalizacja kierunku- prawo
           }
          else
          {
          NoOfPulses--;
          if (NoOfPulses<0) NoOfPulses=96+NoOfPulses;//a jak w lewo to też ma podawać pozycję
          PORTB=0xfd;//sygnalizacja kierunku- lewo
           }
       }
    }

    Program ten jest wywoływany w głównej pętli w przerwaniu od TIMER2 co 16ms.
    Dla 1ms też sprawdzałem ale nie ma takiej potrzeby- tak szybko impulsatorem nie da sie kręcić.
    Wykonywanie chaotycznych ruchów nie powoduje żadnych błędów.
    Zmienne trzeba zdeklarować na poczatku programu w Bascomie- jakieś deklaracje zmiennych lokalnych tam są ale nie wiem dokładnie.
    Mam nadzieję że tmf za takie próby przetłumaczenia na Bascom się nie obrazi.
    To On jest autorem tego programu- ja tylko próbuję to interpretować.