[BASCOM] najszybsza czestotliwość przerwania ?
[BASCOM] najszybsza czestotliwość przerwania ?
Witam
Bardzo proszę o pomoc bo już trochę kończy mi się cierpliwosc.
Napisałem program obsługi encodera , działa na zasadzie cyklicznego sprawdzania
stanu dwóch wejść portu i prostego sprawdzenia stanu z tego cyklu i cyklu poprzedniego. Całość działa wspaniale , nie gubi impulsów i jest bardzo stabilna , ale po zmierzeniu czasów działania , zdziwiłem się że naszybszy czas działania procedury (nawet pustej)wynosi 7us. Używam kwarc 14745190 mhz.
Próbowałem w każdym przerwaniu ustawiać wartość timera na np 200 żeby wywołał przerwanie po 55 cyklach zegara , ale to nic nie daje , ten cza 7us stoi jak drut.
Wszelkie próby użycia compare1a też spoczeły na niczym - zawsze mam ten sam czas
przerwania (compare działa mi jakby dopiero od pewnych dużych wartośći).
Wiem jednak że może być szybciej , prosta pętla -
main:
portd.7 = not portd.7
go to main
generuje przebieg o okresie 500ns
Może ktos cos poradzi , bo wszystko co zrozumiałem po przeczytaniu not aplikacyjnych nie działa.
Pozdrawiam
Kenny
Bardzo proszę o pomoc bo już trochę kończy mi się cierpliwosc.
Napisałem program obsługi encodera , działa na zasadzie cyklicznego sprawdzania
stanu dwóch wejść portu i prostego sprawdzenia stanu z tego cyklu i cyklu poprzedniego. Całość działa wspaniale , nie gubi impulsów i jest bardzo stabilna , ale po zmierzeniu czasów działania , zdziwiłem się że naszybszy czas działania procedury (nawet pustej)wynosi 7us. Używam kwarc 14745190 mhz.
Próbowałem w każdym przerwaniu ustawiać wartość timera na np 200 żeby wywołał przerwanie po 55 cyklach zegara , ale to nic nie daje , ten cza 7us stoi jak drut.
Wszelkie próby użycia compare1a też spoczeły na niczym - zawsze mam ten sam czas
przerwania (compare działa mi jakby dopiero od pewnych dużych wartośći).
Wiem jednak że może być szybciej , prosta pętla -
main:
portd.7 = not portd.7
go to main
generuje przebieg o okresie 500ns
Może ktos cos poradzi , bo wszystko co zrozumiałem po przeczytaniu not aplikacyjnych nie działa.
Pozdrawiam
Kenny
Sprawdzałem już w c
Wiadomo C , a szczególnie dobre kompilatory robia cuda. Jednak myśle że mój problem leży złym ustawieniu procesora. Nie wiem dlaczego nie działa mechanizm compare , który ma za zadanie sprawdzać wartość timera i generować przerwanie jesli jest równa wartości komparatora. Jesli zmieniam wartość kompare to od 1 do około 100 czas przerwania nie ulega zmianie , pózniej zaczyna się wydłużać.
Dzięki za odpowiedz.
Dzięki za odpowiedz.
Uzyj samych przerwań
masz tu przykład od razu dodam ze NIE jestem autorem kodu Autorem jest Luciano ze strony MSC electronic
Kod różni się troszkę od oryginału ale niewiele, zmieniłem na potrzeby własne.
Link do tematu na forum MCS
http://www.mcselec.com/index2.php?optio ... pic&t=2695
masz tu przykład od razu dodam ze NIE jestem autorem kodu Autorem jest Luciano ze strony MSC electronic
Kod różni się troszkę od oryginału ale niewiele, zmieniłem na potrzeby własne.
Kod: Zaznacz cały
' The TTL encoder A signal is connected to PB1
' The TTL encoder B signal is connected to PB0
' If the count goes in the wrong direction swap A B.
'
' This code uses the pin change interrupt
'
$regfile = "ATtiny2313.DAT"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 16
$framesize = 32
'dimension variables
Dim New_value As Byte
Dim Old_value As Byte
Dim Direction As Byte
Dim Encoder_count As Word
Config Portd = Output
Portd = 0
'Set data direction of PORTB
'INPUTS = PB7,PB6,PB5,PB4,PB3,PB2,PB1,PB0
Ddrb = &B00000000
'Enable internal pull-up resistors on the inputs PB1,PB0.
Portb = &B00000011
'Wait that PORTB stabilizes before we enable the pin change interrupt
Waitms 10
'Set the mask of the Pin change interrupt on PB1,PB0
Pcmsk = &B00000011
'Set interrupt vector PCINT
On Pcint Pcint_isr
'Clear Pcint flag set while the PORTB was stabilizing.
Set Eifr.5
'Enable Pcint (Pin Change Interrupt)
Gimsk.5 = 1
'Global Interrupt Enable
Enable Interrupts
' ===================================================================
Waitms 100
New_value = Pinb
Old_value = New_value
Encoder_count = 0
Do
Reset Portd.4
Reset Portd.3
Print Encoder_count
Loop
End
' =============================================
' Interrupt routine
Pcint_isr:
New_value = Pinb
Direction = Old_value.0 Xor New_value.1
If Direction = 1 Then
Set Portd.3
Reset Portd.4
Incr Encoder_count
Else
Set Portd.4
Reset Portd.3
Decr Encoder_count
End If
Old_value = New_value
' Clear Pcint flag (Pin Change Interrupt flag)
Set Eifr.5
ReturnLink do tematu na forum MCS
http://www.mcselec.com/index2.php?optio ... pic&t=2695
kszumek, jednym z lepiej działających programów jest ten który ja dodałem autora Luciano z MCS forum, Uzuwa samych przerwań jest bardzo szybkie, zobacz jeszcze na stronę: http://mirley.firlej.org/obsluga_impulsatora
Jego rozwiązanie tez jest dobre, ale dużo wolniejsze warte jednak sprawdzenia.
Jelsi możesz wklej swoją wersie kodu
Widze ze autor dawno zapomniał o swoim problemie i o poście na forum.
Jego rozwiązanie tez jest dobre, ale dużo wolniejsze warte jednak sprawdzenia.
Jelsi możesz wklej swoją wersie kodu
Widze ze autor dawno zapomniał o swoim problemie i o poście na forum.
Witam
najważniejszą dla mnie sprawą w tym programie jest
szybkość działania i dekodowanie wszystkich 4 zboczy x4
ponieważ będzie to służyło do odczytu położenia wału silnika dc
na razie działa to na zmodyfikowanej wersji tego:
http://www.mcselec.com/index.php?option ... &Itemid=57
jednak tu tracę na rozdzielczości ponieważ tu mam x2
(program działa tylko na 2 zboczach jednego kanału)
chciałbym coś wykombinować aby działało to dalej na przerwaniach (choć niekoniecznie ) jednak dekodowało wszytkie 4 zbocza
choć myślę że dobrze napisany algorytm dekodowania programowo
też powinien zdążyć to obsłużyć
maxymalna częstotliwość impulsów z enkodera to około 50 khz
czy ten algorytm Luciano potrafi zdekodować wszystkie 4 zbocza?
pozdrawiam
najważniejszą dla mnie sprawą w tym programie jest
szybkość działania i dekodowanie wszystkich 4 zboczy x4
ponieważ będzie to służyło do odczytu położenia wału silnika dc
na razie działa to na zmodyfikowanej wersji tego:
http://www.mcselec.com/index.php?option ... &Itemid=57
jednak tu tracę na rozdzielczości ponieważ tu mam x2
(program działa tylko na 2 zboczach jednego kanału)
chciałbym coś wykombinować aby działało to dalej na przerwaniach (choć niekoniecznie ) jednak dekodowało wszytkie 4 zbocza
choć myślę że dobrze napisany algorytm dekodowania programowo
też powinien zdążyć to obsłużyć
maxymalna częstotliwość impulsów z enkodera to około 50 khz
czy ten algorytm Luciano potrafi zdekodować wszystkie 4 zbocza?
pozdrawiam
Jedyna możliwość to raczej wymiana enkodera niż jakieś sztuczne dorabianie mnożnika. Przerwanie można uzyskać max co ok. 0.5*f_cpu
Co do idei sztucznego pomnażania impulsów którą autor wątku próbuje tutaj zastosować to tak samo jak z ideą mikrokroku w silniku krokowym - w zasadzie to oszustwo i nie ma nic wspólnego z rzeczywistością
Jedyną poprawną metodą zwiększenia dokładności jest wymiana enkodera. Rozdzielczość można sobie zrobić i milion impulsów na obrót.
Poza tym ja nie rozumiem do końca czy mierzymy prędkość + kierunek czy tylko prędkość, bo jak tylko prędkość to wystarczy wykorzystać jedno wyjście enkodera kwadraturowego i liczyć ilość impulsów w ciągu sekundy i z tego wyjdzie prędkość wału. Podpinamy się pod wejście przerwania i zliczamy. Nie wydaje mi się żeby była to kwestia kompilatora że się nie da szybciej zliczyć iż 7us (o ile nas zegar nie ogranicza)If edge or toggle interrupt is selected, pulses that last longer than one clock period will generate an interrupt. Shorter pulses are not guaranteed to generate an interrupt.
Co do idei sztucznego pomnażania impulsów którą autor wątku próbuje tutaj zastosować to tak samo jak z ideą mikrokroku w silniku krokowym - w zasadzie to oszustwo i nie ma nic wspólnego z rzeczywistością
Witam
właśnie odwrotnie
tu prostsze będzie napisanie odpowiedniego algorytmu
niż wymiana enkoderów oryginalnie osadzonych na silniku
pozatym to nie jest żadne sztuczne dorabianie mnożnkia
wszystkie fabryczne sprzęty rozpoznają 4 zbocza
a max częstotliwość impulsów to jakieś 50 Khz
czyli mamy z 200 rozkazów na obsługę przerwania
ja nie mierzę prędkości tylko przemieszczenie poprzez zliczanie obrotów
czyli pomiar odbywa się w 2 kierunkach
a co do sinika krokowego to masz racje ale tylko w połowie
sterowniki z mikrokrokiem po prostu kulturalniej pracują
nie mają takich drgań momentu przy niskich obrotach
tu nie chodzi o zwiększenie rozdzielczości tylko kulturę pracy silnika
no i jeszcze jedno nie ja jestem autorem tematu tylko się podpiąłem
pozdrawiam
właśnie odwrotnie
tu prostsze będzie napisanie odpowiedniego algorytmu
niż wymiana enkoderów oryginalnie osadzonych na silniku
pozatym to nie jest żadne sztuczne dorabianie mnożnkia
wszystkie fabryczne sprzęty rozpoznają 4 zbocza
a max częstotliwość impulsów to jakieś 50 Khz
czyli mamy z 200 rozkazów na obsługę przerwania
ja nie mierzę prędkości tylko przemieszczenie poprzez zliczanie obrotów
czyli pomiar odbywa się w 2 kierunkach
a co do sinika krokowego to masz racje ale tylko w połowie
sterowniki z mikrokrokiem po prostu kulturalniej pracują
nie mają takich drgań momentu przy niskich obrotach
tu nie chodzi o zwiększenie rozdzielczości tylko kulturę pracy silnika
no i jeszcze jedno nie ja jestem autorem tematu tylko się podpiąłem
pozdrawiam
Zapodaj jakiś linkkszumek pisze:wszystkie fabryczne sprzęty rozpoznają 4 zbocza
Jak chcesz rozpoznawać x4 to musisz jeden podpiąć pod INT0, drugi pod INT1 i na początek ustawić na zbocze narastające, po nadejściu przerwania przerzucić się na opadające i tak dla obu wejść (pod warunkiem że w momencie zboczy na drugim wejściu przerwania otrzymasz stały poziom logiczny). Lub w momencie nadejścia przerwania od jakiegoś zbocza na pierwszym wejściu przestawić wykrywanie zbocza w drugim wejściu na przeciwne zbocze niż do tej pory. Ponieważ masz zawsze stan ustalony na INT0 gdy nadchodzi zbocze na INT1 to możesz tą właściwość wykorzystać do wykrywania momentu kiedy trzeba zmieniać na które zbocze ma przerwanie reagować.
Wtedy powinieneś uzyskać swoje x4
proszę bardzo
http://www.allegro.pl/item819966672_ste ... kazja.html
"Rozdzielczość enkodera - min. 2x max. 4x 1"
wklep w google servonapęd i zobacz jakikolwiek fabryczny sprzęt a się przekonasz
pozdrawiam
http://www.allegro.pl/item819966672_ste ... kazja.html
"Rozdzielczość enkodera - min. 2x max. 4x 1"
wklep w google servonapęd i zobacz jakikolwiek fabryczny sprzęt a się przekonasz
pozdrawiam