FAQ | Points | Add... | Recent posts | Search | Register | Log in


[mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> AVR Microcontrollers -> [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.
Author
Message
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#1 Post from the author of the topic 02 Feb 2012 15:14   

[mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Witam,
Mam układ silniczka prądu stałego, który może się obracać w prawo lub w lewo.
Steruje nim odpowiednimi stanami na nóżkach procesora. Na ośce silnika jest tarcza z ząbkami sprzężona z transoptorem, który to jest podpięty do procka (przez przerzutnik schmitta) dzięki czemu mogę liczyć impulsy w trakcie działania i w ten sposób go pozycjonować.

Potrzebuję zaimplementować obsługę takiego układu w ten sposób abym mógł mu mówić "otwórz się na 10 impulsów(od zera)" "otwórz się na 5 impulsów" itp.

Tyle słowem wstępu. Potrzebuję teraz koncepcje jak to zrealizować.
Tak na prawdę już mam to zrobione i działa fajnie....tyle że czasami się "rozjeżdża" tj. np. punkt zero już nie jest zerem, tylko zatrzymuje się troszkę przed.

Obecne rozwiązanie:
1. Kalibracja.
Program kalibruje silnik, czyli znajduje punkt zero całkowicie się zamykając, aż trafi na blokadę mechaniczną (taka krańcówka).

2. Działanie - OTWIERANIE
program dostaje "ustaw się na 10 impulsów", ma w pamięci że aktualnie jest na 0 impulsie - zostaje obliczana różnica.
diff = aktPos - zadanaPos;

dostaję diff = -10 czyli tyle impulsów ma przejechać od aktualnej pozycji aby ustawić się na 10 impulsie. Włączam silnik w odpowiednią stronę (bazując na znaku diffa, - to otwieranie, + to zamykanie) i jeśli dostane impuls z transoptora dodaje do diff'a +1. I tak kręcę silnikiem aż diff będzie ZERO.

3. Działanie - ZAMYKANIE
Uznajmy ze jestem na 10 impulsie. Dostaje "otwórz się na 5 impulsów". Znowu obliczam diffa
diff = aktPos - zadanaPos
dostaje diff = 5, znowu sprawdzam znak, jest dodatni więc trzeba zamykać. Włączam silnik, odejmuje od diffa 1 jak dostane impuls i tak kręce aż diff będzie ZERO.

Generalnie taki sposób działania wymyśliłem, ale nie chce mi to działać perfekcyjnie i juz po kilkunastu minutach ciągłego otwierania i zamykania się rozkalibrowywuje.
Oglądałem na oscylku sygnał impulsów, jest ładny, zrobiłem filtr zakłóceń impulsów - nie pomogło. I nie mam już pomysłów.

Piszę bo może ktoś robił już coś podobnego i zna jakieś pułapki o których nie pomyślałem.
Back to top
   
voytaschec
Poziom 17
Poziom 17


Joined: 27 Oct 2005
Posts: 411
Location: Myszkowice (woj. śląskie)

Post#2 02 Feb 2012 15:56   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Wykrywanie impulsu jest zrobione na przerwaniu czy poprzez odczytywanie pinu? Jeśli w przerwaniu to czy przypadkiem nie ma w nim opóźnień albo skomplikowanych obliczeń, które zablokują to przerwanie? A jeśli jest to na podstawie odczytu pinu to czy jest gwarancja wykonania cyklu programu zanim pojawi się następny impuls?
A najlepiej to proszę załączyć kod :)
Back to top
   
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#3 Post from the author of the topic 02 Feb 2012 16:03   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Impulsy są odczytywane z pina, są wolne, cały okres trwa prawie 500ms.

Mam to wejście też podłączone na przerwanie zew. ale z niego zrezygnowałem, gdyż nie mogłem tego doprowadzić do porządku, jakieś dziwne akcje miałem, jakby przerwanie samo się wywoływało. Myślałem że zakłócenia, ale mam pullup 10k.

W tej chwili nie mogę załączyć kodu, jutro może załatwię jakieś pozwolenie.

Tymczasem czekam na sugestie, czy taki sposób realizacji jak opisałem ma sens, bo może coś mi umyka.
Back to top
   
voytaschec
Poziom 17
Poziom 17


Joined: 27 Oct 2005
Posts: 411
Location: Myszkowice (woj. śląskie)

Post#4 02 Feb 2012 16:29   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


To w takim razie jeszcze mam pytanie w jaki sposób jest wykrywany sam impuls? Czy jest pętla oczekująca na zmianę stanu?
Jest gwarancja, że silnik zatrzyma się zawsze na określonym poziomie impulsu? Tzn. czy nie ma ryzyka, że przy którymś razie zbyt wolno się zatrzyma i przeskoczy połówkę impulsu (impuls nie zostanie wykryty, ale sterowanie się już rozjedzie).
Nie wiem czy można się domyślić o co mi chodzi, dlatego to narysowałem :)
U góry jest poprawny przebieg: 3 impulsy otwierające (wykrycie impulsu to czerwona kropka) i trzy impulsy zamykające, a na dole jest przebieg w przypadku błędnego zatrzymania silnika, ale logika się zgadza: 3 impulsy otwierające i trzy zamykające.
[mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.
Back to top
   
Google

Google Adsense


Post# 02 Feb 2012 16:29   





Back to top
   
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#5 Post from the author of the topic 02 Feb 2012 19:06   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Quote:
To w takim razie jeszcze mam pytanie w jaki sposób jest wykrywany sam impuls? Czy jest pętla oczekująca na zmianę stanu?

Impuls wykrywam w przerwaniu 1000/sec, mierzyłem na oscylku, opóźnienie wykrycia impulsu waha się w granicach 0,5-2ms. Dla zwiększenia rozdzielczości oba zbocza sygnału traktuję jako impuls.

Quote:
Jest gwarancja, że silnik zatrzyma się zawsze na określonym poziomie impulsu? Tzn. czy nie ma ryzyka, że przy którymś razie zbyt wolno się zatrzyma i przeskoczy połówkę impulsu (impuls nie zostanie wykryty, ale sterowanie się już rozjedzie).

Nie ma gwarancji rzecz jasna :) po wyłączeniu napięcia na silniczku jest spora bezwładność. Przy pracy silnika wysoki stan sygnału transoptora wynosi ok 200ms a niski 150ms. Biorąc pod uwagę czynniki opóźniające interpretacje impulsu (opóźnienie wykrycia + 15ms pracy filtra) i tak powinien zatrzymać się dosyć blisko za zboczem - jednak on potrafi nawet przelecieć na następne zanim wyhamuje...
Moje zabezpieczenie polega na tym że po wyłączeniu napięcia silnika, jeszcze przez 1s słucham czy wystąpią jakieś impulsy, jeśli tak to dodaje je do aktualnej pozycji (lub odejmuje, zależy z którego kierunku hamował) - zmienna aktPos z 1 postu. Przy następnym rozkazie to odchylenie już ginie. Zdarza się to rzadko, ale zdarza. Wydaje mi się ze to powinno złatawiać ten problem.
Back to top
   
SylwekK
Poziom 18
Poziom 18


Joined: 01 Oct 2007
Posts: 479
Location: Lipsko

Post#6 02 Feb 2012 21:32   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Nie wiem jak wygląda pętla główna Twojego programu ale wykrywania impulsu w przerwaniu bym nie robił. Czasem przekazywanie parametrów z przerwania powoduje różne nieoczekiwane sytuacje o jakich się ostatnio mogłem przekonać - ustawiałem w przerwaniu znacznik co jednostkę czasu i na jego podstawie cyklicznie wykonywał się fragment programu badając ten znacznik i po wykonaniu sam go zerował. Jakież było moje zdziwienie gdy co kilka takich impulsów (w miarę regularne odcinki) po prostu gubił znacznik i fragment się nie wykonywał (mimo, że jednostka czasowa na pewno była zliczona). Kiedy odliczanie robiłem innym sposobem (w pętli głównej) wszystko się poprawiło.
Jeśli Twoim zdaniem algorytm jest ok to może dodaj coś co będzie spowalniać silnik przy końcu odliczania żeby nie przeleciał za daleko, bo być może późniejsza korekta (np. z wspomnianego zabezpieczenia) ma wpływ na prawidłowe pozycjonowanie.
Back to top
   
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#7 Post from the author of the topic 03 Feb 2012 00:15   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Tak, wiem przerwania mogą dać popalić, też mi się zdarzały takie akcje - oczywiście miałeś tą zmienna którą ustawiałeś w przerwaniu jako volatile?

Anyway. Pętla główna jest dosyć mocno obciążona, a CPU chodzi chodzi tylko na 2MHz, ale sprawdzę z ciekawości - i tak nie mam pomysłów.

Quote:
Jeśli Twoim zdaniem algorytm jest ok to może dodaj coś co będzie spowalniać silnik przy końcu odliczania żeby nie przeleciał za daleko, bo być może późniejsza korekta (np. z wspomnianego zabezpieczenia) ma wpływ na prawidłowe pozycjonowanie.


Mam spowalnianie, tak naprawdę to mam 4 stopnie prędkości, które się zmieniają dynamicznie w zależności od tego ile impulsów zostało do końca. Przed wyjściem jeszcze spowolniłem ten ostatni i zostawiłem na noc. Zobaczymy co będzie rano ;)
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 03 Feb 2012 00:15   





Back to top
   
SylwekK
Poziom 18
Poziom 18


Joined: 01 Oct 2007
Posts: 479
Location: Lipsko

Post#8 03 Feb 2012 10:07   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Hehe, nie wiem co to jest volatile :) Programuję w bascom i na razie spełnia w 99% moje oczekiwania chociaż robię przymiarki do assemblera...

Przychodzi mi do głowy jeszcze jedna rzecz związana z gubieniem impulsów. Piszesz, że badanie robisz przy każdym zboczu dla zwiększenia rozdzielczości (nawet sam tak miałem na początku w sowim projekcie pozycjonera) - może zapominasz gdzieś o znaczniku początkowym, w zależności od którego zależy jaki pierwszy impuls będzie zliczony.

Ja w bascomie robiłem to w taki sposób:


Code Basic4GL - [expand]
Z_imp = 0 'znacznik początkowy, jeśli = 0 to pierwszy zliczony impuls będzie
'gdy na wejściu będzie stan niski
Do
'
If Imp = Z_imp Then 'Imp to alias pinu taktującego
Toggle Z_imp
Incr Poz 'zwiększanie pozycji przy każdej zmianie zbocza
Print Poz 'podgląd na szybko
End If
'
Loop
 

Zwróć uwagę jak ważne jest ustawienie Z_imp. W zasadzie powinno się go ustawiać tylko raz na samym początku programu i zapomnieć o jego istnieniu :)
Dla dekrementacji oczywiście podobny fragment w pętli głównej tylko dla innego pinu.
Back to top
   
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#9 Post from the author of the topic 03 Feb 2012 10:51   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Tak, o tym także pamiętam, robię tak że po kalibracji odczytuje stan sygnału i odpowiednio wyrównuje obie flagi. Jednak nawet gdybym tego nie robił, powinien zgubi co najwyżej 1 impuls - a on działa dobrze przez np. pół godziny czy godzinę i potem coś się dzieje.

skończy się to tak że będę przez godzinę wpatrywał się w oscyloskop :/

Tak czy tak, dzięki za sugestię :)
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 03 Feb 2012 10:51   





Back to top
   
janbernat
Poziom 23
Poziom 23


Joined: 22 Oct 2008
Posts: 3918
Location: Warszawa

Post#10 03 Feb 2012 11:04   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


A jak się zabezpieczyłeś przed zakłóceniami od silnika?
Jak daje duże zakłócenia to od razu widać że coś nie tak.
Ale jak daje małe- to tylko co jakiś czas coś źle działa.
Back to top
   
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#11 Post from the author of the topic 03 Feb 2012 12:54   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


To niewielki silniczek, przyznaje że na razie jest słabo zabezpieczony, przyjże się temu.
Back to top
   
SylwekK
Poziom 18
Poziom 18


Joined: 01 Oct 2007
Posts: 479
Location: Lipsko

Post#12 03 Feb 2012 13:39   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Właśnie! Sprawa zakłóceń jest bardzo istotna. W pewnym moim układzie wystarczył jeden kondensator 0,1u (o którym zapomniałem po prostu, a elektrolit oczywiście był i to mnie zmyliło) na głównym zasilaniu silnika aby z kompletnie głupkowatego zachowania się elektroniki wszystko zaczęło działać jak należy :)
Back to top
   
janbernat
Poziom 23
Poziom 23


Joined: 22 Oct 2008
Posts: 3918
Location: Warszawa

Post#13 03 Feb 2012 14:29   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Jeszcze jedno- transoptor szczelinowy potrafi działać dość podstępnie.
Jeśli na element foto padnie dużo światła to się nasyca i nie reaguje na żadne sygnały.
Dobrze jest poza tym wysyłać do elementu nadającego sygnał zmodulowany- choćby falę prostokątną o określonej częstotliwości.
Odbiornik powinien reagować tylko na sygnał o tej właśnie częstotliwości.
Znakomicie to zwiększa odporność na zakłócenia.
No i znakomicie rozbudowuje program- ale coś za coś.
Back to top
   
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#14 Post from the author of the topic 03 Feb 2012 14:36   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Transoptor jest zamknięty w obudowie, mało światła z zewnątrz do niego dociera.

Quote:
Dobrze jest poza tym wysyłać do elementu nadającego sygnał zmodulowany- choćby falę prostokątną o określonej częstotliwości.
Odbiornik powinien reagować tylko na sygnał o tej właśnie częstotliwości.

Przyznaje że nie wiem o co chodzi - możesz napisać dokładniej?
Back to top
   
janbernat
Poziom 23
Poziom 23


Joined: 22 Oct 2008
Posts: 3918
Location: Warszawa

Post#15 03 Feb 2012 15:18   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


To jest tak- teraz badasz czy jest stan wysoki czy niski na wejściu.
Czyli stosujesz co co 1/1000s odpytywanie stanu pinu.
Pewnie timerem to ustawiasz.
Teraz- jeśli pojawi się zakłócenie- traktujesz to jako impuls- pojawia się błąd.
A można zrobić tak- na nadajnik wysyłasz sygnał o jakiejś częstotliwości- kilkadziesiąt kHz a przy odczycie sprawdzasz czy to jest ta częstotliwość.
Jak wkradnie się jakiś obcy impuls- to wiesz że to nie twój sygnał.
Back to top
   
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#16 Post from the author of the topic 03 Feb 2012 15:35   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


Poprawka, rozmawiałem z projektantem pcb, mówi że na wyjściach tranzystorów sterujących silnikiem są diody.

Quote:
Teraz- jeśli pojawi się zakłócenie- traktujesz to jako impuls- pojawia się błąd.

Po wykryciu zmiany stanu, przez 30ms co 0,5ms sprawdzam czy stan na nóżce impulsów się nie zmienia, jeśli nie, dopiero wtedy zaliczam jako impuls (czy też zbocze dobrego impulsu).
Nie wiem na ile to jest skuteczne w prawdziwych warunkach...
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 03 Feb 2012 15:35   





Back to top
   
janbernat
Poziom 23
Poziom 23


Joined: 22 Oct 2008
Posts: 3918
Location: Warszawa

Post#17 03 Feb 2012 15:55   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


:D
No jakby nie było diod równolegle do silnika to już by pewnie nie było tych tranzystorów.
Można domniemywać że w czasie gdy transoptor jest przesłonięty pojawia się jakiś impuls i jest traktowany przez program jako znak że transoptor jest odsłonięty.
Back to top
   
SylwekK
Poziom 18
Poziom 18


Joined: 01 Oct 2007
Posts: 479
Location: Lipsko

Post#18 03 Feb 2012 16:42helpful post - solution   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


A może to po prostu błąd mechaniki... Po kilkukrotnych ruchach w te i we w te za każdym razem jest jakieś minimalne przesunięcie, które w końcu w skrajnym położeniu rozpoznawane jest jako dodatkowy impuls (lub jego brak) i stąd te rozjazdy.
Back to top
   
sajmon5544
Poziom 7
Poziom 7


Joined: 08 Feb 2011
Posts: 24
Location: PL

Post#19 Post from the author of the topic 03 Feb 2012 17:55   

Re: [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.


janbernat wrote:
:D
No jakby nie było diod równolegle do silnika to już by pewnie nie było tych tranzystorów.

Hm, hm powiedziano mi że to "zabezpieczenie", w takim razie co jeszcze można by dołożyć? To pomęcze ;)

Quote:
A może to po prostu błąd mechaniki... Po kilkukrotnych ruchach w te i we w te za każdym razem jest jakieś minimalne przesunięcie, które w końcu w skrajnym położeniu rozpoznawane jest jako dodatkowy impuls (lub jego brak) i stąd te rozjazdy.

Wydaje mi się że poprzednie przesunięcie (np wynikające z bezwładności) nie powinno mieć wpływu na następne. Tak by mogło być gdybym np. jeździł na czas.
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> AVR Microcontrollers -> [mega128][c++]Implementacja pozycjonowania silniczka na podstawie impulsów.
Page 1 of 1
Similar topics
BTM222+mega128 po rs232 (7)
Problem z RS485 na Mega128 (2)
Problem z programowaniem MEGA128 (2)
Mega128 + komparator. (7)
Zamiana impulsów w samochodzie - z impulsów masy na dodatnie (3)
[Mega128][CF][FAT32] Mega128 zapis danych na karcie CF (2)
Implementacja DFT na podstawie definicji MATLAB (3)
mega128 + rtl8019as + ethernut (1)
[MEGA128][C] Inicjalizacja NM7010B+ (1)
Śledzący układ pozycjonowania kamery wideo - projekt (3)

Page generation time: 0.153 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed