Enkoder 32bit poraz enty i servomotor PID
- tomaszdko
- Posty: 78
- Rejestracja: 06 gru 2018, 19:58
Enkoder 32bit poraz enty i servomotor PID
Kiedyś napisałem sterownik PID pod servomotor (bo w necie nic nie znalazłem prócz na stronie bascom ale był zbyt rozbudowany) . Z samym sterownikiem nie mam problemu bo chodzi poprawnie ale , no właśnie ale . Program był tworzony pod silniki z enkoderami 40 impulsów na obrót i wystarczył jeden timer ustawiony jako enkoder sprzętowy . Teraz mam silnik z tarczą 100 impulsów i przekładnią więc taki silnik trochę pokręci a timer musi zliczyć sporo i tu zaczyna się problem bo w projekcie mam śrubę o długości 1m . Timer nie da rady zliczyć takie ilości na całą długość . Wstawiłem dwa timery jako 32bit , wszystko piękanie do momentu kiedy trzeba zliczać w tył . Xmega nie ma rejestru 32bit . Jeśli przeliczy timer1 do 65535 impulsów to następuje inkrementacja timera2 o jeden a timer1 jest zerowany no i jest ok ale jeśli po inkrementacji timer2 cofniemy się enkoderem w tył to nie zmienia to timer2 a w timer1 będziemy mieć np 65530 ...i znowu damy w przód to automatycznie nastąpi inkrementacja timer2 co jest błędem bo w rzeczywistości timer1 nie zliczył od 0 do 65535 ...xmega zlicza poprawnie ale logika jest błędna :/ jak to rozwiązać !? ...Robiłem też programowe zliczanie na przerwaniach i chodzi ale ...znowu ale :/ ...wygląda jak by gubiło kroki bo enkoder na silniku i enkoder do pozycjonowania jak i procedura PID są na przerwaniach (możliwe że to miesza) bo na sprzętowym chodzi jak trzeba aaaa na sprzętowym zlicza mi inaczej niż na programowym . Zliczanie sprzętowe - silnik ma enkoder 100inp a zlicza mi 400 , enkoder sterujący ma 400inp a pokazuje po pełnym obrocie 1600 . Zliczanie programowe - zlicza 100 , enkoder sterujący zlicza 400 (nie wiem dlaczego tak jest)
-
- Posty: 2
- Rejestracja: 07 lis 2021, 15:21
Re: Enkoder 32bit poraz enty i servomotor PID
Miałem podobny problem i rozwiązałem go troszkę inaczej - nie łączyłem liczników w tryb 32 bitowy tylko skorzystałem z bitu DIR w rejestrze CTRLFCLR. Licznik pozostał 16 bitowy a ja finalna pozycję przeliczałem z aktualnej wartości licznika i zliczonej ilości przepełnień (tutaj kierunek zliczania "DIR" odpowiadał za zwiększenie lub zmniejszenie licznika).
-
- Posty: 2
- Rejestracja: 07 lis 2021, 15:21
Re: Enkoder 32bit poraz enty i servomotor PID
Miałem podobny problem i rozwiązałem go troszkę inaczej - nie łączyłem liczników w tryb 32 bitowy tylko skorzystałem z bitu DIR w rejestrze CTRLFCLR. Licznik pozostał 16 bitowy a ja finalna pozycję przeliczałem z aktualnej wartości licznika i zliczonej ilości przepełnień (tutaj kierunek zliczania "DIR" odpowiadał za zwiększenie lub zmniejszenie licznika).
- niveasoft
- Posty: 1239
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Enkoder 32bit poraz enty i servomotor PID
Przepraszam za to opóźnienie. Ze względów spamu i tym podobnych weryfikacji podlega pierwszy post nowego forumowicza na forum. Powinien tyczyć się Bascoma. Oczywiście nie śpię z komputerem ani nie jestem do niego przywiązany Dbam tylko o spokój bo zdarzały się reklamy lub boty i na razie się udaje.
Przy okazji witam.
Przy okazji witam.
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Enkoder 32bit poraz enty i servomotor PID
Witam - Tomek jutro wysyłka xmegi do Ciebie na maila wysłałem foto z info.
pozdrawiam Jacek.
pozdrawiam Jacek.
- tomaszdko
- Posty: 78
- Rejestracja: 06 gru 2018, 19:58
Re: Enkoder 32bit poraz enty i servomotor PID
Mam nocki i system 12h więc czasem nie mogę odpisać . Jacek jeszcze nie doszła paczka (pewnie w tym tygodniu będzie, jak coś to napisze maila).
Wracając do PID to nagrzebałem trochę i chodzi a nawet nie dla Xmega a dla arduino nano czyli bez użycia sprzętowego timera (tym lepiej bo taniej i wygodniej ale dla Xmega jeszcze przerobię i rozbuduję).
Dziwiło mnie czemu raz jest dobrze a raz delikatnie przestawia położenie . To tak jest jak się robi na stykówkach i drugi błąd to nie podciągnięty enkoder silnika rezystorami 4,7k pod "+".
Jeszcze dwa przypały , które wyszły to użycie nieodpowiedniego mostka H (mx1508 za słaby) i WAŻNE to sondy oscyloskopu miałem ustawione na x1 (zakłócało przebieg enkoderów).
Testowałem dobrą godzinę i teraz wygląda że jest igła tak jak trzeba.
Kod działa dla sterowania z enkodera zewnętrznego jak i rs232 (trzeba wybrać , który chce się użyć a niepotrzebny odhaczyć) . Muszę dorobić jeszcze sterowanie STEP/DIR.
Bartek możesz sprawdzić czy działa NoSaveTool by zoptymalizowac przerwania ? Mi nie pokazuje żadnych przerwań ale na innych programach wykrywa (nie zawsze).
Wracając do PID to nagrzebałem trochę i chodzi a nawet nie dla Xmega a dla arduino nano czyli bez użycia sprzętowego timera (tym lepiej bo taniej i wygodniej ale dla Xmega jeszcze przerobię i rozbuduję).
Dziwiło mnie czemu raz jest dobrze a raz delikatnie przestawia położenie . To tak jest jak się robi na stykówkach i drugi błąd to nie podciągnięty enkoder silnika rezystorami 4,7k pod "+".
Jeszcze dwa przypały , które wyszły to użycie nieodpowiedniego mostka H (mx1508 za słaby) i WAŻNE to sondy oscyloskopu miałem ustawione na x1 (zakłócało przebieg enkoderów).
Testowałem dobrą godzinę i teraz wygląda że jest igła tak jak trzeba.
Kod działa dla sterowania z enkodera zewnętrznego jak i rs232 (trzeba wybrać , który chce się użyć a niepotrzebny odhaczyć) . Muszę dorobić jeszcze sterowanie STEP/DIR.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $REGFILE = "M328PDEF.DAT"
- $CRYSTAL = 16000000
- $BAUD = 9600
- $HWSTACK = 100
- $SWSTACK = 100
- $FRAMESIZE = 100
- ENABLE INTERRUPTS
- '------------------------------------------------------------------------------------------------------------------
- '--------------------------------------------- UART ---------------------------------------------------------------
- '------------------------------------------------------------------------------------------------------------------
- CONFIG COM1 = 9600 , SYNCHRONE = 0 , PARITY=NONE , STOPBITS=1 , DATABITS=8 , CLOCKPOL=0
- OPEN "COM1:" FOR BINARY AS #1
- CONFIG SERIALIN0 = BUFFERED , SIZE = 30 , BYTEMATCH = 13
- DIM COM1 AS STRING*30
- DIM RS232 AS LONG
- ENABLE URXC
- '------------------------------------------------------------------------------------------------------------------
- '--------------------------------------------- INT1-SILNIK --------------------------------------------------------
- '------------------------------------------------------------------------------------------------------------------
- CONFIG INT1 = CHANGE
- ON INT1 SILNIK
- ENABLE INT1
- '-------------------------------------------------------------
- CONFIG PORTD.3 = INPUT 'ARDUINO NANO - D2
- CONFIG PORTC.3 = INPUT 'ARDUINO NANO - A2
- DIM POZYCJA_SILNIK AS LONG
- '------------------------------------------------------------------------------------------------------------------
- '--------------------------------------------- INT0-ENKODER -------------------------------------------------------
- '------------------------------------------------------------------------------------------------------------------
- CONFIG INT0 = CHANGE
- ON INT0 ENKODER
- ENABLE INT0
- '-------------------------------------------------------------
- CONFIG PORTD.2 = INPUT 'ARDUINO NANO - D3
- CONFIG PORTC.2 = INPUT 'ARDUINO NANO - A3
- DIM POZYCJA_ENKODER AS LONG
- '------------------------------------------------------------------------------------------------------------------
- '------------------------------------------- TIMER1 / DT ----------------------------------------------------------
- '------------------------------------------------------------------------------------------------------------------
- CONFIG TIMER1 = TIMER , PRESCALE = 1
- ENABLE TIMER1
- STOP TIMER1
- '------------------------------------------------------------------------------------------------------------------
- '------------------------------------------- TIMER0 / PWM ---------------------------------------------------------
- '------------------------------------------------------------------------------------------------------------------
- ' PD3 - OC2B; PB3 - OC2A;
- ' PD5 - OC0B; PB2 - OC1B;
- ' PD6 - OC0A; PB1 - OC1A;
- CONFIG TIMER0 = PWM ,PWM=ON , COMPARE_A_PWM = CLEAR_UP , COMPARE_B_PWM = CLEAR_UP ,PRESCALE = 1
- ENABLE TIMER0
- START TIMER0
- CONFIG PORTD.5=OUTPUT 'ARDUINO NANO - D5
- CONFIG PORTD.6=OUTPUT 'ARDUINO NANO - D6
- '------------------------------------------------------------------------------------------------------------------
- '--------------------------------------------ZMIENNE---------------------------------------------------------------
- '------------------------------------------------------------------------------------------------------------------
- DIM CEL AS LONG 'CEL GDZIE MA DOJSC
- DIM AKTUALNE AS LONG 'POLOZENIE AKTUALNE
- DIM ERROR AS SINGLE 'ROZNICA MIEDZY POLOZENIEM AKTUALNYM A CELEM
- DIM DT AS SINGLE 'OKRES POMIARU
- DIM ERROR_STARY AS SINGLE 'WARTOSC POPRZEDNIEGO ERROR , CYKL WCZESNIEJ
- DIM ZMIANA AS SINGLE 'ROZNICA MIEDZY ERROR_OLD A ERROR
- DIM ZBOCZE AS SINGLE
- DIM STREFA AS SINGLE
- DIM STREFA_1 AS SINGLE
- DIM STREFA_STARA AS SINGLE
- DIM P AS SINGLE , I AS SINGLE,, D AS SINGLE
- DIM K1 AS SINGLE , K2 AS SINGLE , K3 AS SINGLE
- DIM PID AS SINGLE
- DIM PID_1 AS SINGLE
- DIM PID_STARY AS SINGLE
- DIM PID_WYJ AS LONG
- DIM PID_WYJ_A AS LONG
- DIM PID_WYJ_B AS LONG
- K1= 22 '11 22 'USTAWIENIA DLA PID DOBRAC POD SILNIK
- K2= 0.95 '0.8 0.8
- K3=0.01 '0.01 0.001
- DT=2000 'DOMYSLNE DT PRZY PRZEJSCIU PIERWSZEJ PETLI
- CONFIG PORTC.5=OUTPUT 'ARDUINO NANO - A5 , LED
- DO
- '----------------------------------------------- ' WYBRAC I ODHACZYC
- CEL=RS232 ' ZMIENNA NA UART , ILOSC IMPULSOW DO PRZEBYCIA -/+
- 'CEL=POZYCJA_ENKODER ' ENKODER STERUJACY , ILOSC IMPULSOW DO PRZEBYCIA -/+
- '-----------------------------------------------
- ERROR_STARY=ERROR
- ERROR=CEL-AKTUALNE
- ZMIANA=ERROR-ERROR_STARY
- ZBOCZE=ZMIANA * DT
- STREFA_1=ERROR / DT
- STREFA=STREFA_STARA+STREFA_1
- STREFA_STARA=STREFA
- P=K1*ERROR ' PID
- I=K2*ZBOCZE
- D=K3*STREFA
- PID_1=P+I
- PID_1=PID_1+D
- PID=PID_1
- PID_STARY=PID
- AKTUALNE=POZYCJA_SILNIK
- PID_WYJ=PID
- '-----------------------------------------------
- IF PID_WYJ > -1 THEN
- PID_WYJ_A=PID_WYJ
- IF PID_WYJ_A>255 THEN PID_WYJ_A=255
- COMPARE0B = PID_WYJ_A
- COMPARE0A = 0 'OCR0B
- END IF 'OCR0A
- IF PID_WYJ < 1 THEN
- PID_WYJ_B = PID_WYJ*-1
- IF PID_WYJ_B>255 THEN PID_WYJ_B=255
- COMPARE0A = PID_WYJ_B 'OCR0A
- COMPARE0B = 0 'OCR0B
- END IF
- IF POZYCJA_ENKODER=0 THEN 'KONTROLA LED POZYCJI "0" TYLKO DLA ENKODERA STERUJACEGO
- PORTC.5=0 'ARDUINO NANO - A5
- ELSE
- PORTC.5=1
- END IF
- STOP TIMER1 'ODLICZANIE DT W PETLI
- DT=TIMER1
- TIMER1=0
- START TIMER1
- LOOP
- END
- '-----------------------------------------------
- SERIAL0CHARMATCH:
- PUSHALL
- INPUT #1,COM1 NOECHO
- RS232=VAL(COM1)
- POPALL
- RETURN
- '-----------------------------------------------
- SILNIK:
- If PIND.3 = 0 AND PINC.3 = 1 THEN DECR POZYCJA_SILNIK
- If PIND.3 = 0 AND PINC.3 = 0 THEN INCR POZYCJA_SILNIK
- If PIND.3 = 1 AND PINC.3 = 0 THEN DECR POZYCJA_SILNIK
- If PIND.3 = 1 AND PINC.3 = 1 THEN INCR POZYCJA_SILNIK
- RETURN
- ENKODER:
- If PIND.2 = 0 AND PINC.2 = 1 THEN DECR POZYCJA_ENKODER
- If PIND.2 = 0 AND PINC.2 = 0 THEN INCR POZYCJA_ENKODER
- If PIND.2 = 1 AND PINC.2 = 0 THEN DECR POZYCJA_ENKODER
- If PIND.2 = 1 AND PINC.2 = 1 THEN INCR POZYCJA_ENKODER
- RETURN
Ostatnio zmieniony 18 lis 2021, 15:00 przez tomaszdko, łącznie zmieniany 2 razy.
- tomaszdko
- Posty: 78
- Rejestracja: 06 gru 2018, 19:58
Re: Enkoder 32bit poraz enty i servomotor PID
YARO - Pokombinuję z tymi rejestrami.
- niveasoft
- Posty: 1239
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Enkoder 32bit poraz enty i servomotor PID
Życie byłoby łatwiejsze gdyby ludzie używali Code Explorera bo mój tu trochę narzekał. Ten kompilator bascomowy dużo ludziom wybacza.
Masz tam typo czyli błąd bo dwa przecinki i potem Single D jest niby niezdefiniowana. Kompilator się za Ciebie domyślił...
Te określanie kanałów dla Input w helpie jest tylko dla SPI a dla SERIALa chyba #1 już nie ma. Chyba o tym zapomnieli.
NoSave działa, ale nie spodziewa się słowa "ON" tylko "On". To może mój błąd i go poprawię w następnej wersji. Może cały plik OBJ do Uppercase albo Lowercase a może jakiś Regex nowy napiszę sobie (nie pamiętam jak to rozwiązane). Z poprawą Regex pójdzie szybciej. Pobawię się bo zainstalowałem już najnowsze Studio 2022
Teraz zamień tylko duze O na małe o i działa.
A co do tego kodu to słyszałeś o Case Is? Wtedy zmienną sprawdza tylko raz...
Masz tam typo czyli błąd bo dwa przecinki i potem Single D jest niby niezdefiniowana. Kompilator się za Ciebie domyślił...
Te określanie kanałów dla Input w helpie jest tylko dla SPI a dla SERIALa chyba #1 już nie ma. Chyba o tym zapomnieli.
NoSave działa, ale nie spodziewa się słowa "ON" tylko "On". To może mój błąd i go poprawię w następnej wersji. Może cały plik OBJ do Uppercase albo Lowercase a może jakiś Regex nowy napiszę sobie (nie pamiętam jak to rozwiązane). Z poprawą Regex pójdzie szybciej. Pobawię się bo zainstalowałem już najnowsze Studio 2022
Teraz zamień tylko duze O na małe o i działa.
A co do tego kodu to słyszałeś o Case Is? Wtedy zmienną sprawdza tylko raz...
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
- tomaszdko
- Posty: 78
- Rejestracja: 06 gru 2018, 19:58
Re: Enkoder 32bit poraz enty i servomotor PID
Znowu ekspresowo odpowiadasz heheh .
-"Case Is" nie brałem pod uwagę ale dobrze wiedzieć.
-"ON" tylko "On" , działa heheh od jakiegoś czasu używam dużych liter , a te stare programy to dlatego widziało dobrze bo pisownia była mała .
-podwójny przecinek ,, to nie problem ale poprawiłem...i to jest wyższość bascoma nad C
-uart działa mi zawsze przy takim definiowaniu (dla xmega i mega)i nie ma z tym problemu fakt że są luki w bascom bo kiedyś miałem problemy z kanałami pwm dla mega128 (nie były zdefiniowane w .dat)
pewnie już poprawili i to samo tyczy się samego kompilatora. Chodzi więc nie wnikam
-"Case Is" nie brałem pod uwagę ale dobrze wiedzieć.
-"ON" tylko "On" , działa heheh od jakiegoś czasu używam dużych liter , a te stare programy to dlatego widziało dobrze bo pisownia była mała .
-podwójny przecinek ,, to nie problem ale poprawiłem...i to jest wyższość bascoma nad C
-uart działa mi zawsze przy takim definiowaniu (dla xmega i mega)i nie ma z tym problemu fakt że są luki w bascom bo kiedyś miałem problemy z kanałami pwm dla mega128 (nie były zdefiniowane w .dat)
pewnie już poprawili i to samo tyczy się samego kompilatora. Chodzi więc nie wnikam
- Jacek
- Posty: 384
- Rejestracja: 25 kwie 2016, 19:14
Re: Enkoder 32bit poraz enty i servomotor PID
OK - do Niemiec wysyłałem dzień wcześniej i doszło dopiero wczoraj.
Spoko nie ma ciśnienia.
pozdrawiam wszystkich Jacek.
Spoko nie ma ciśnienia.
pozdrawiam wszystkich Jacek.