RP2040 PIO

Mar 20, 2023 Last reply: 3 lata temu 4 Replies

Potrzebuję zrobić enkoder kwadraturowy na Raspberry Pi Pico. Spróbowałem tego:

formatting link
to działa, ale ma jedną wadę: zmienia stan tylko na podstawie opadającego zbocza jednej linii - to bez sensu, bo traci się czterokrotnie rozdzielczość. Próbowałem to:
formatting link
ć na Pythona, ale nie działa - coś tam pojawiają się jakieś bzdury a później zamiera. Czy problem może być w tej dyrektywie .origin 0? Bo w Micropythonie nie ma możliwości takiej deklaracji albo o tym nie wiem.



Oczywiście chcąc nie chcąc zacząłem rozgryzać jak to PIO działa - dlaczego w ogóle nazywają to maszyną stanów?



Maszyna stanów to ja bym rozumiał jakiś rejestr do zapamiętania stanu i jeżeli maszyna jest w danym stanie to wykonuje jakiś tam kod, następnie sprawdza w kółko jakieś warunki, które powodują przejścia do innych stanów - przynajmniej ja to tak rozumiem i tak zawsze programowałem. Oczywiście taka sprzętowa maszyna powinna sprzętowo sprawdzać np. piny i zmieniać stan jaki się tam ustawi. Niestety w tym PIO czegoś takiego nie ma - sprawdza jedynie jeden pin blokujący warunek wait i instrukcja jmp, która jest jeszcze bardziej ograniczona, bo można jej przyporządkować tylko raz konkretny pin.


Ogolnie: taki enkoder najlepiej sie obsluguje automatem/maszyną stanów. Tylko musi miec osobny zegar i odpowiednią szybkosc. Wydaje sie, ze w procku z takim wspomagaczem PIO powinno sie dać to zrobic, ale moze sa tam za duze ograniczenia/chcą zrobic oszczedniej.

Jesli jedno z wejsc musi byc "zegarem" do tego automatu, to sprawa sie komplikuje.

Ten drugi program chyba realizuje pierwszą koncepcje, i jest tym, czego szukasz, tylko faktycznie wymaga tego .origin Nie wiem, czy w pythonie jest nad tym jakas kontrola.

A moze połączyc jakos pythona z C?

J.

No tak - on ma działać trochę jak ten "komputer diy" z niedawnego wątku: stan pinów obecny i poprzedni jest przesyłany jako 4 bity do licznika programu i wykonuje się wskazany przez ten licznik skok do odpowiedniej procedury.

No ale z drugiej strony czemu program nie miał by się zaczynać od adresu 0? Chyba że tam już jest jakiś program przeznaczony dla innej maszyny obsługującej coś w Pythonie - bo pamięć jest chyba wspólna dla 4-ech maszyn?

Już prędzej przerobię swoją część na C - ale to już w finalnej wersji, bo póki co tak wygodniej mi się pisze i testuje,

Na ile wyczytałem - jest tam jakis system ładowania tych programów do pamieci, i python ładuje tam, gdzie mu sie wydaje najlepiej. I kontroli na tym nie masz, trzeba by grzebac w źródlach i poprawiac. Albo hasło rzucic - może ktos poprawi.

Ale tu masz jeden obiekt z C do uzycia w Pythonie ...

J.

Coś w tym rodzaju?

formatting link
Na chwilę obecną jednak dam sobie spokój - chyba wystarczy mi taka rozdzielczość jak mam teraz. Jest mniejsza tylko dwukrotnie a nie czterokrotnie jak wcześniej pisałem. Do tego zwiększyłem liczbę przesłon: transoptory mam w rozstawie 6mm, więc pierwotnie zrobiłem 12mm przesłonę i 12mm otwór, Okazuje się, że równie dobrze mogę zrobić 4mm przesłony i 4mm otwory (ale nie potrafię tego matematycznie uzasadnić ;)), powiększyłem trochę tarczę enkodera i jest prawie 4 razy gęściej.

Jeszcze pozostaje precyzja wykonania tej tarczy. Sprawdzałem oscyloskopem i ciężko jest uzyskać idealnie symetryczny przebieg, tzn żeby wypełnienie było 50/50 i zbocza jednego czujnika wypadały dokładnie w połowie drugiego.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required