Skocz do zawartości

Możliwości atmegi16??


fixa

Pomocna odpowiedź

Witam wszystkich doświadczonych elektroników-programistów planuje zabawę z atmegami.

Jestem człowiekiem z niewielkim doświadczeniem w tej materii na początek chciałem zrobić coś prostego ale nie typu "mruganie diodami" chodziło mi raczej o coś konkretnego.

A mianowicie, pewnego brzydkiego dnia "wyrwałem" kilka wnętrzności z drukarki w tym silnik DC z enkoderami i z nudów podałem na silnik U=10[V] i zmierzyłem częstotliwość z jednego kanału było ok. 13kHz. I tutaj moje pytanie czas zacząć : chciałbym zmierzyć jego prędkość i wysłać dane do kompa (oczywiście po RS), tylko nie wiem jaką max "f"-częstotliwość impulsów można podać na wejście np INTx. Mam zamiar dokonać pomiaru prędkości x1000 na sekundę.

Czy pomiar co 1ms można zrealizować na Atmedz16 i wysłać dane PC ??

Z góry dziękuje za porady

Link do komentarza
Share on other sites

Tak, dasz radę zrobić pomiar nawet <10 us. 1ms to bardzo dużo czasu.

Pamiętaj tylko o zastosowaniu kwarca zewnętrznego, bo wewnętrzne zegary w atmedze są bardzo niedokładne i miałbyś pomiar rpm z błędem nawet kilku %.

Link do komentarza
Share on other sites

po pierwsze w atmedze16 masz tylko 3 przerwania zewnętrzne (int) , czy taka ilość Ci wystarczy (do jednego silnika powinna) ? po drugie 13kHz oznacza, że przerwanie będzie generowane na nodze uC co 76us ... czyli przy częstotliwości taktowania 1Mhz mikrokontroler pomiędzy przerwaniami ma możliwość wykonania 76 instrukcji zabierających jeden cykl zegara (dość dużo można tutaj zrobić) jeśli zwiększysz taktowanie do 16Mhz to 76 zamieni się na 1216 (76*16) instrukcji. Twoj program nie ma robić nic innego jak tylko inkrementować (instrukcja ta zajmuje 1 cykl zegara) zmienną zliczająca impulsy w przerwaniach. Dodatkowo musisz skonfigurować jakiś timer by odliczał Ci 1s (jeśli byś chciał obliczać prędkość co 1ms tak jak piszesz to dokładność pomiaru spadnie Ci do ok 1kHz !!!) i generował przerwanie co ten czas. W przerwaniu od timera ustawiasz jakąś flagę odliczenia 1s. Program główny cały czas czeka, aż flaga jest ustawiona, liczy prędkość, zeruje flagę i wysyła po RS-ie. Wynikiem wysyłanym przez Rsa (w Hz) będzie dana 1 bajtowa (jeśli odliczasz co 1ms) lub 2-u bajtowa (jeśli odliczasz co 1s). Jeśli wysyłać chcesz co 1ms to wychodzi (1000 x 8 bitów = 8000 bps). Teoretycznie ustawienie prędkość Rsa obsługiwanego sprzętowo na 9600 bps powinno wystarczyć. W dokumentacji atmegi jest dokladnie wyliczone jaki będzie błąd transmisji przy takiej prędkości i przy rezonatorze jakim zastosujesz. Jeśli wyjdzie Ci błąd niższy dla wyższej prędkości to ją zastosuj.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

MirekCZ napisał:

bo wewnętrzne zegary w atmedze są bardzo niedokładne i miałbyś pomiar rpm z błędem nawet kilku %.

Miałem nieprzyjemność spotkać się z badaniem tej niedokładności. Pracując na wewnętrznym oscylatorze RC 8MHz odliczałem czas timerem bazując na wyliczeniach zgodnie z datasheetem (wiem, że rozwiązanie toporne, ale proste i szybkie). Okazało się że błąd się ga 2-3% co jednak !- mieści się w zakresie podanym przez Atmela (±3%). Po zastosowaniu zewnętrznego kwarcu przy pomiarze 40 minutowym błąd spadł do <0,1%

Link do komentarza
Share on other sites

Nie wiem czy dobrze zrozumiałem autora. Czy chodzi Ci o mierzenie częstotliwości sygnału z enkodera podłączonego do silnika?

Pytam ponieważ, jak sądzę silnik jest silnikiem krokowym i coś musi nim sterować i to coś dokładnie wie z jaką prędkością silnik się kręci, więc nie koniecznie trzeba to mierzyć.

Ale jeżeli to silnik DC, to od pomiaru częstotliwości enkoderów są liczniki Atmega16 z wejściami na pinach T0 i T1, a nie przerwania INT. Oczywiście można używać przerwania, tylko to nie jest ekonomiczne rozwiązanie.

Poza tym piszesz, że chcesz dokonać pomiaru prędkości 1000 razy na sekundę. Z czystej ciekawości, zapytam: W jakim celu?

Pytanie nie jest pozbawione sensu, ponieważ, im większa częstotliwość pomiarów, tym mniejsza ich dokładność.

Może już masz, ale na wszelki wypadek podam link do polskiej dokumentacji Atmega16:

http://mikrokontrolery.blogspot.com/2011/04/polska-dokumentacja-atmel.html

choć oczywiście lepiej posługiwać się oryginałem

No chyba, że nie zrozumiałem intencji autora.

Miałem nieprzyjemność spotkać się z badaniem tej niedokładności. Pracując na wewnętrznym oscylatorze RC 8MHz odliczałem czas timerem bazując na wyliczeniach zgodnie z datasheetem (wiem, że rozwiązanie toporne, ale proste i szybkie). Okazało się że błąd się ga 2-3% co jednak !- mieści się w zakresie podanym przez Atmela (±3%). Po zastosowaniu zewnętrznego kwarcu przy pomiarze 40 minutowym błąd spadł do <0,1%

Więcej na ten temat, tutaj: http://mikrokontrolery.blogspot.com/2011/04/stopery-timery-itp.html

Link do komentarza
Share on other sites

Pytam ponieważ, jak sądzę silnik jest silnikiem krokowym i coś musi nim sterować i to coś dokładnie wie z jaką prędkością silnik się kręci, więc nie koniecznie trzeba to mierzyć.

Oj koniecznie koniecznie, zapominasz o zgubionych krokach, nawet silniki krokowe wymagają użycia enkoderów.

Link do komentarza
Share on other sites

Oj koniecznie koniecznie, zapominasz o zgubionych krokach, nawet silniki krokowe wymagają użycia enkoderów.

Wszystko zależy na ile gubienie kroków jest to istotne, na jakich parametrach silnik pracuje, itd.

Ale broń Boże nie neguję używania enkoderów.

Link do komentarza
Share on other sites

Poza tym, skoro autor "z nudów podał na silnik 10V" i silnik się kręcił, to chyba nie był to jednak krokowiec, bo one wymagają trochę więcej zachodu.

Link do komentarza
Share on other sites

Poza tym, skoro autor "z nudów podał na silnik 10V" i silnik się kręcił, to chyba nie był to jednak krokowiec, bo one wymagają trochę więcej zachodu.

dlatego też napisałem:

Ale jeżeli to silnik DC ...
Link do komentarza
Share on other sites

tylko nie wiem jaką max "f"-częstotliwość impulsów można podać na wejście np INTx. Mam zamiar dokonać pomiaru prędkości x1000 na sekundę.

W przypadku rdzenia AVR, i wykorzystania sprzętowego licznika do pomiaru impulsów, częstotliwość maksymalna to F_CPU / 2. Dla wejścia INT, biorąc pod uwagę że samo obsłużenie go zajmuje trochę czasu, bezpiecznie przyjąć że to minimum F_CPU / 8, ale to zależy jak napisana jest jeszcze procedura obsługi przerwania. Ogólnie do zliczania szybkich impulsów lepszy jest Timer.

Link do komentarza
Share on other sites

Wszystkim z góry dzięki za zaglądnięcie na mój problem.

do kolegi "dondu":

silniki są jak wspomniałem DC

Fakt, nie przedstawiłem zagadnienia dość precyzyjnie, ale już to nadrabiam.

Enkoder jest z dwoma sygnałami i planowałem to zrobić na przerwaniach ponieważ jak wystąpi przerwanie stan 1 na kanale A i sprawdzę warunek w tym przerwaniu na kanale B to będę miał w ten sposób info o tym jaki jest kierunek obrotów i tutaj timer raczej się nie przyda bo ujemnych wartości na nim nie uzyskam. Na upartego można by to zrobić.

Mam jeszcze jedno pytanko jak najlepiej wysyłać ramkę do kompa. Ma zamiar to własnie zrobić w przerwaniu przepełnienia timera. Interesuje mnie ramka np o takiej postaci:

"jakiś znak" "dane" (typu int) CRC "jakiś znak"

( V(typu int) jak zrobić CRC )

Macie jakiś pomysł??

Link do komentarza
Share on other sites

Enkoder jest z dwoma sygnałami i planowałem to zrobić na przerwaniach ponieważ jak wystąpi przerwanie stan 1 na kanale A i sprawdzę warunek w tym przerwaniu na kanale B to będę miał w ten sposób info o tym jaki jest kierunek obrotów

Teraz wiemy więcej, więc dalsze rozważania:

Czy ten mikrokontroler będzie także sterował tym silnikiem?

Jeżeli tak, to:

1. po co wykrywać kierunek, skoro dokładnie będziesz wiedział, w którą stronę się kręci.

jeżeli nie, to:

Z 13kHz silnik nie zatrzyma się w ciągu jednego impulsu z enkodera, czyli kierunek nie zmieni się w tym przedziale czasu. Czy się ze mną zgadzasz?

1. czyli gdy silnik rusza sprawdzasz w którą stronę się kręci, za pomocą 2 pinów z enkodera.

2. gdy przekroczy jakąś ustaloną prędkość, nie sprawdzasz już kierunku bo nie ma takiej potrzeby, a jedynie liczysz prędkość z bardzo dużą dokładnością, za pomocą liczników,

3. gdy silnik zwolni poniżej określonej granicznej prędkości ponownie włączasz sprawdzanie kierunku.

Jak widzisz nie jest niezbędne ciągłe sprawdzanie kierunku przy dużych prędkościach silnika, a daje Ci to szansę na wykorzystanie liczników i pomiar prędkości z dużą dokładnością.

Czy opisałem wystarczająco zrozumiale?

Nie odpowiedziałeś na moje pytanie:

Poza tym piszesz, że chcesz dokonać pomiaru prędkości 1000 razy na sekundę. Z czystej ciekawości, zapytam: W jakim celu?
Link do komentarza
Share on other sites

chce zrobić sterowania silnika w pętli sprzężenia zwrotnego także cały czas muszę monitorować jego prędkość. Chce wykorzystać ten układ na maksa i będę z niego sterował silnik: PWM->mostek H .

Przed chwilą sprawdziłem pracę na liczniku, żeby coś więcej powiedzieć zrobię jutro testy.

Zastanawiam się jeszcze nad kodem sprzężenia tzn.

uchyb = Vzad-Vzm

Vzad - predkosc zadan

Vzm - predkosc zmierzona poprzez enkoder

tylko narazie nie wiem jak to zrealizowac na atmedze16, może macie jakieś propozycje?

Link do komentarza
Share on other sites

Czyli:

- badanie kierunku nie jest Ci potrzebne, bo Ty decydować będziesz, w którą stronę ma się silnik kręcić. No chyba, że silnik może być poruszany przez zewnętrzne siły, np. pojazd jest "na luzie" i ktoś go popchnie.

- timer do zliczania pozwoli Ci na osiągnięcie dużej dokładności. I tu pytanie, jak duża musi to być dokładność, w szczególności przy bardzo małych prędkościach?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.