Prawdę mówiąc nie widzę sensu w realizacji dzielenia przez 40 sprzętowo. Ale jak pisałem, jeśli masz wolny timer, to do rejestru PER timera za pomocą którego realizujesz QDEC wpisujesz 39, wtedy co 40 impulsów wygeneruje ci przepełnienie, które możesz transmitować przez event system jako zegar dla drugiego timera, który w efekcie będzie zliczał co 40...
Problem jaki widzę to że czasem taki uklad drga minimalnie np 1-2 piki enkodera i jak to się trafi na progu przepełnienia, układ będzie ciagle w pętli przerwań.
(at)tmf Tak, gdy włączam tryb enkodera pokazuje mi naprzemiennie 0 i 1. Dziwna sprawa, bo jak robię ten sam projekt, ale z TIM3, to w trybie zewnętrznego licznika jest podobnie, a w trybie enkodera od razu po przekręceniu pokazują się wartości zbliżone do max. wartości przepełnienia timera. Spróbuje z tym filtrem.Jeżeli chodzi o wybór kondensatora...
No i w czym Twoja metoda jest lepsza od okresowego odczytu różnicy pomiędzy aktualną a poprzednią pozycją? W tym, że mniej obciąża procesor. Przerwanie wywoływanie jest tylko przy przepełnieniu timera. Dla enkodera o rozdzielczości 1000/obrót potrzeba 65535/4*1000 = ~16 pełnych obrotów enkodera by wywołać to przerwanie (pomijam tutaj małoprawdopodobne...
Dziękuję, o takie coś mi chodziło :) Napisałem wobec tego takie funkcje: [syntax=c]uint16_t pRegulator(uint16_t output, uint8_t actualValue, uint8_t desired_value, uint8_t kp) { int error = desired_value - actualValue; output += kp*error; return output; } void setActualValue(uint8_t evsysValue, uint8_t *actualValue) { *actualValue = evsysValue; } //...
W moim przypadku, chciałbym aby transfer przez DMA był realizowany przy każdej zmianie wartości CNT. To być może musiałbym wyzwalać jakieś przerwanie z wejść PC6 i PC7, bo tam jest podłączony enkoder. Sam Timer w trybie Encoder Mode może generować przerwanie i DMA request chyba tylko po przepełnieniu. Nie znalazłem żadnej innej możliwości. P.S. A czym...
Witam, zrealizowałem obsługę w przerwaniu od przepełnienia timera lecz nie do końca idealnie to działa. Dodałem regulacje precyzyjną i zgróbną wartości zadanej. Przy regulacji precyzyjnej generalnie działa wszystko dobrze, lecz przy regulacji zgrubnej gdy przycisk enkodera jest wciśnięty to zawrtośc zadana potrafi niekiedy skakać o duże wartości np....
Przyznam że niezbyt zrozumiały jest dla mnie ten program z obsługą enkodera, ciężko mi to ogarnąć wszystko po prostu. O co chodzi tak w skrócie z tym przerwaniem timera? Dodano po 3 Czytam teraz ciekawy artykuł o timerze 0, pisze że jego zadaniem jest zliczanie przychodzących do niego impulsów, jeśli to tak działa, to myślę że idealne rozwiązanie. Dodano...
Najdokładniej będzie zmierzyć czas pomiędzy impulsami z enkodera - możesz do tego użyć trybu input capture (ICP) timera1. Przy max. prędkości obrotowej masz ok. 100 zdarzeń na sekundę. Przy min. prędkości możesz zwiększać preskaler timera żeby wykluczyć przepełnienie bez "łapania" impulsu. Jeśli odstępy między impulsami z dekodera nie są identyczne,...
http://obrazki.elektroda.pl/1913082300_1... jako enkoderów uzywam czujników odbiciowych tcrt5000 ktore odbijaja wiazke na bialych paskach a tłumią na czarnych. Jak zliczam impulsy dizeje sie cos takiego jakby kilkakrotnie byl zczytywany ten sam sygnał. Moze przerwanie nie wraca do miejsca w ktorym zostało wywołane przepełnieniem timera...
Technicznie wygląda to tak: W każdym takcie zegara (np w 1/1000000 s - przy taktowaniu 1 MHz) zliczany jest jeden impuls. Timer 16-bitowy od 8-bitowego różni się tylko tym, że przepełnienie następuje po 65536 taktach a nie po 255. Ale żeby policzyć dokładnie jedną sekundę to musisz nadal odliczyć ten milion taktów. Jak widać zegar będzie leciał wiele...
No to wzór na prędkość jest taki: V=\frac{n}{Nt} n - ilość impulsów jakie naliczyłeś N - ilość impulsów na obrót enkodera t - czas w jakim naliczyłeś te impulsy Jeśli masz na przykład enkoder inkrementalny z ilością kroków 500 i w czasie 100ms naliczyłeś 374 impulsy to podstawiając do wzoru masz 500/(374*0.1) czyli 13,37 obrotów na sekundę. Zauważ,...
Połączyłem bezpośrednio enkoder do uC i po kilku obrotach lewo/prawo pozycja "0" a fizyczne "0" różnią się, nie jest to jakaś duża różnica ale, więc chyba muszą mieć wpływ. Ciekawe jak to jest możliwe?:) Rozrysuj te sygnały i zastanów się jaka sytuacja mogłaby to spowodować? W twoim przypadku zapewne winowajcą jest użycie wewnętrznego podciągania....
Co do wartości 4096 w ARR. To by mnie nie zdziwiło, haczyk jest w tym że wpisałeś do ARR 0x4096 (16534) a to już wyglądało "podejrzanie" :) Uprzedzam, że nie wiem czy w tej nocie jest coś ciekawego... po prostu pamiętałem, że był jakiś pdf o 32bit resolution timer. Tak czy siak idea jest taka, że jeden licznik (master) przy przepełnieniu wysyła sygnał...
Szanowni Forumowicze, mam problem z regulacją prędkości obrotowej silnika DC wyposażonego w enkoder za pomocą przerwań INT. Enkoder to czujnik Halla i odbiera impulsy z magnesu neodymowego na wale silnika (magnes 8-polowy). Prędkość kontroluję za pomocą generowanego PWM na atmedze podawanego na mostek L293DNE. Atmega pracuje na 1MHz, a licznik to Timer/Counter0...
W obu programach masz błąd. W pierwszym: Akurat kod tu nie ma wiele wspólnego zrobiłem to na dwa sposoby i za każdym razem inne wyniki Widać że jednak ma. Chyba to rozgryzłem Proszę mnie poprawić jak się mylę No teraz by było. Przerwanie Int nie dzieli przez 256 więc masz przerwanie co impuls. Tylko po co później to: [syntax=basic4gl]Lj = Li / 250[/syntax]...
Żeby przyspieszyć przetwarzanie możesz utrzymywać 2 zmienne: pozycja i delta. W przerwaniu INT0 robisz: push r_temp ; 2 in r_temp, SREG ; 1 push r24 ; 2 push r25 ; 2 lds r24, LOW(adr_delta) ; 2 lds r25, HIGH(adr_delta) ; 2 sbis PIND, 3 ; 1/2 sbiw r24, 2 ; 2/0 adiw r24, 1 ; 2 sts r24, LOW(adr_delta) ; 2 sts r25, HIGH(adr_delta)...
załączam program, ale to nie jest problem napewno tego.: spark2_nowy.h ioinit.h enkoder.h spi.c [syntax=c] static inline void SPI_SET_SS() { PORTB|=(1<<PB2); } static inline void SPI_RESET_SS() { PORTB&=~(1<<PB2);// SS -> PB2 } void SPI_master_init() { SPI_SET_SS(); SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPI2X);// (SPE) SPI Enable, (MSTR)Master...
T3 nie współpracuje z enkoderem. Analogiczna konfiguracja na T1 jak najbardziej działa poprawnie: [syntax=c]//GPIO //GPIOA RCC->AHBENR |= RCC_AHBENR_GPIOAEN;//zegar dla GPIO GPIOA->MODER |= (0<<0) | (3<<2) | (1<<4) | (1<<6) | (1<<8) | (2<<10) | (2<<12) | (2<<14) | (2<<16) | (2<<18); GPIOA->OSPEEDR...
Witam staram sie uruchomić sprzętową obsługe encodera w stm32F4. Generalnie całość już działa problemem okazuje się sam timer. Działa inkrementacja i dekrementacja timera jednakże licznik nie chce się przepełnić zarówno przy zliczaniu w górę i w dół timer dolicza do maksymalnej wartości zapisanej w rejestrze CNT. przy zliczaniu w góre (obrocie koła)...
No to chyba tak, jak kombinowałem ( tylko może źle to opisałem ). Wybrałem grupę interruptów PCINT, a potem wybrałem dwa interesujące mnie PCINT'y. I w następnej linii kodu ustawiłem flagę "I" komendą sei(). Czyli spełniłem trzy warunki GIMSK = (1<<PCIE); (albo GIMSK = 0b00100000;) -> Włączyłem przerwania PCINTx PCMSK = 0b00011000 ; (albo...
Witam! W wykonywanym projekcie zapędziłem w pewien logiczny róg. Projekt jest wykonywany na rodzinie AVR, ale to ma mniejsze znaczenie. Problem jest następujący, muszę zliczać maksima dwóch niezależnych przebiegów sinusoidalnych (pochodzącego z enkoderów optycznych - elementy myszy komputerowej z lat 90) o częstotliwości maksymalnej 5kHz. Formowanie...
Czesc, No niestety nie hula... probowałem tego. Myśle ze atmega jest zryta jakos... Mimo tego, ze mam obsługe przerwań i tak, wiem ze to musi działać bo skopiowałem to z mojego poprzedniego projektu, to mi się restartuje atmega. Zwrać na płytce nie ma. [syntax=c] #include <avr/io.h> // Załaduj bibliotekę input/output #include <avr/interrupt.h>...
https://obrazki.elektroda.pl/3252078300_... Poniższy artykuł przedstawia – krok po kroku – wykonanie niewielkiego, kieszonkowego oscyloskopu cyfrowego. Nie jest on tak dobry jak zwykły warsztatowy oscyloskop, ale z drugiej strony można zabrać go niemalże wszędzie. Poza tym – nie wszystkie projekty DIY muszą mieć sens....
Ok, z niechęcią pokażę jeszcze trochę kodu. Od razu wyjaśniam - ten kod to tylko taka tymczasowa partyzantka celem sprawdzenia i wykrycia takich sytuacji jak ta powyższa. Docelowo to będzie zupełnie inaczej zorganizowane. Dane są zbierane do RAMu przy pomocy DMA do podstawy 5-5ms/kratkę. Powyżej już są wyświetlane na bieżąco. Niemniej w obu przypadkach...
Witam. Nie mam już pomysłu na rozwiązanie mojego problemu. Program działa, ale przy przesuwaniu tekstu w tablicy do prawej AVR GCC generuje dużo mniejszy kod (1002 bajty) niż jeśli zakomentuję tę część pętli głównej programu (1366 bajtów). Kompilacja przechodzi bez warningów w obu wypadkach. Dodatkowo po zaprogramowaniu układu program nie wraca do głównej...
Na Mega328 z KB RAM uruchamianie OS nie bardzo ma sens. Zrób wielowątkowość opierając cały program o maszynę stanów. Zapomnij, że istniej delay. Owszem, krótkich delay (mikrosekundy) w AVR przeważnie nie da się przeskoczyć ale nie zawsze. Na 1-Wire, można obsłużyć USARTem. Nie ma żadnych delay i 1-Wire działa na przerwaniach. Masz więc już pierwszy...
https://obrazki.elektroda.pl/6687159300_... Każdy, kto rozważa przesiadkę z ośmiobitowego mikrokontrolera na coś mocniejszego i o większych możliwościach naraża się na pewien problem, który łatwo przegapić, bo przy ośmiu bitach pojawia się sporadycznie. Ale pomnóżmy liczbę bitów przez dwa, cztery, albo i osiem, i zaczynają się schody....
Nie wiem o co chodzi, support STM mi powiedział, żebym wgrał kod do ramu oraz wektor przerwań. Cały problem od początku: Zadanie programu jest następujące: ze sterownika sczytuję wartości enkoderów i zapisuję je do pamięci flash. (powinno to być wykonywane timerem co 10ms). Następnie odczytuję te wartości z flasha w celu odtworzenia ruchu i odpowiednie...
To niestety nic nie daje, bo właśnie o to chodzi aby podczas wykonywania przerwania od timer2(enkoder), gdy Timer0 się przepełni, procesor powinien zawiesić przerwanie (enkoder) i przejść do obsługi przerwaia od Timer0(czekaj). Chyba mnie źle zrozumiałeś.... zrób tak: Czekaj: Disable Timer1 N = 1 Counter0 = Czas Start Timer0 Enable Timer1 Return Przynajmniej...
przepełnienie timera przepełnienie zbiornika amica przepełnienie
połączenie kapilary sonda paliwa wyłączenie dioda świetlówka
philips senseo sterownik ładowarki akumulatora
Tryb diagnostyczny suszarki Electrolux EW8H358SP: C10-C13 Kody błędów C09, C14, C15 w suszarce Electrolux EW8H358SP