Znaleziono 33 wyniki

autor: volkhen
06 cze 2013, 11:41
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

To co napisałeś idealnie ma się do rzeczywistości i tłumaczy dlaczego działa to jak działa. Dzięki. Uważam, że jestem raczej początkującym programistą i elektronikiem stąd takie może czasem głupie pytania.

OK, ja słyszę bardzo dobrze wysokie częstotliwości (stare telewizory, przetwornice), ale silnik nie piszczy szczególnie mocno. Trochę go słychać, ale prawdę mówiąc głośniejszy jest zasilacz od kompa ze swoim piskiem oraz dysk twardy (łożysko). Inni jak wchodzą to tego pomieszczenia to nic nie słyszą ;)

Jak przebywam dłużej w tym małym pomieszczeniu >4h to głowa mnie zaczyna boleć od tych pisków gdzie normalnie głowa mnie boli raz na rok.

[ Dodano: 2013-06-06, 19:11 ]
Końcówka mocy w stanie spoczynku pobiera 50mA wraz z częścią logiczną, gdy odciągam silnik na bok to maksymalnie zaobserwowałem 1,5A.
autor: volkhen
06 cze 2013, 08:15
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

Ale na oscyloskopie nie widziałem, żeby przebieg pwm na silniku był zniekształcony. Przebieg był taki sam jak na wejściu, ale wzmocniony.

Jak jest różnica pomiędzy wypełnieniami poniżej 50% i powyżej? z punktu widzenia szybkości mostka.

PWM ma częstotliwość 15,625kHz.

Ale czy takie sterowanie jest błędne?

Na końcówce mocy L6203, która jest szybsza, nie mam czasu teraz spojrzeć w datasheet, ale ten "problem" tak samo występuje.
autor: volkhen
05 cze 2013, 20:00
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

Zrozumiałem dlaczego i jak działa moje serwo po zmianach w kodzie, które przyniosły niespodziewane i dobre efekty.

Od czego by tu zacząć...

Może od tego, że wypełnienia PWM od 0 do 60% były bezużyteczne przy sterowaniu gdyż silnik po prostu nie reagował na przyłożone napięcie. Dopiero powyżej wypełnienia 60% dostawał kopa. I to naprawdę nagłego. Tak jakby siła przyrastała wykładniczo do wypełnienia.

Jak wiadomo głównym czynnikiem odpowiedzi regulatora PID jest akcja proporcjonalna. Gdy błąd jest mały odpowiedź również jest mała i błąd nie jest kasowany - dlatego potrzebujemy członu całkującego. Taka charakterystyka powodowała, że serwo w okolicy punktu zadanego było "miękkie" a gdy dochodziło do owych 60% to nagle przesuwając silnik napotykało się jakby ścianę - nagły duży opór silnika. Takie rozluźnienie w okolicach punktu zadanego było usuwane przez akcję całkującą jednak ta nieliniowość siły była mocno wyczuwalna. Mam nadzieję, że opisuję to w miarę jasno.

Po zmianach w kodzie programu serwa, które wprowadziłem i opisywałem jakiś czas temu okazało się, że miękkość serwa wokoło punktu zadanego zniknęła. Co ciekawe odkryłem dziwne zachowanie serwa gdyż wartość PIDa zatrzymywała się i oscylowała wokół wartości 512 a nie jak było wcześniej wokół 0. Winę za to brała akcja całkująca, która miała wartość około 512. Z tego powodu przy włączeniu serwa zawsze było szarpnięcie, którego wtedy nie potrafiłem zrozumieć. Gdy wyłączałym akcję całkującą to serwo zatrzymywało się na 52 kroku przy wzmocnieniu P = 10 mimo punktu zadanego w 0. Wyglądało to tak jakby punktem równowagi było wyjście PIDa około 520 czyli wypełnienie równe około 50%. Było to dla mnie sporym zaskoczeniem. Przy takim sterowaniu końcówka mocy na L298 była zupełnie zimna po wielu testach i zabawach z napędem. Wcześniej przed tą zmianą bardzo mocno się grzała. Nie rozumiejąc dlaczego mój serwonapęd działa tak dobrze ;) zacząłem dochodzić o co w tym chodzi. Okazało się, że funkcje, które ustalały kierunek pracy serwa w oprogramowaniu są bezużyteczne a silnik samoistnie zatrzymuje się w miejscu przy wypełnieniu 50%. Wróćmy tutaj do tego, że wypełnienia od 0 do powiedzmy 50% były bezużyteczne gdyż silnik w ogóle nie reagował na takie napięcie. Zakładając oczywiście, że napięcie wahało się pomiędzy, 0 a U zasilania. Wtedy sterowanie odbywało się za pomocą jednego przebiegu PWM. Teraz mam dwa odwrotne przebiegi podane na mostek H nazwijmy to na przeciwległe po skosie tranzystory.

W tym momencie tak wygląda przebieg na silniku w stanie spoczynku.
Obrazek

Tym razem napięcie w + i - znosi się i silnik stoi w miejscu. Końcówka mocy nie grzeje się, silnik mimo pozostawienia na 4h również nie zagrzał się nawet w najmniejszym stopniu. Pobierany prąd jest bardzo mały. Właśnie? Dlaczego? Czyż silnik nie powinien walczyć ze sobą? co prawda przy częstotliwości 15kHz jakikolwiek ruch w prawo lewo zgodnie z napięciem jest niemożliwy.

OK, więc mamy wypełnienie 50% i silnik stoi. Już wiecie dlaczego zniknęła nazwijmy to ta strefa miękkości wokół pozycji zadanej? Bo w ten sposób wycięliśmy wartości wyjściowe PIDa, zależnego od członu proporcjonalnego proporcjonalnie do błędu (jak sama nazwa wskazuje ;)), które wynosiły od 0 do 50%. Poprzednio silnik w wartościach PIDa od -500 do +500 był bezwładny - nie reagował. Teraz stoimy w miejscu 50%, więc wypełnienie 0% oznacza pełną moc powiedzmy w prawo a 100% pełną moc w lewo. Jednocześnie PID oscyluje od 0 do 1023 (równowaga w 511), a nie jak było wcześniej od -1023 do +1023 (równowaga w 0). W tej chwili w ogóle nie ma efektu miękkości silnika wokół pozycji zadanej, ponieważ akcja proporcjonalna od razu wchodzi w zakres działania silnika.
Poniżej rysunek poglądowy, na czerwono jak wcześniej działało serwo, siła wolno przyrastała wokół punktu zadanego po czym nagle mocno rosła. Na zielono jak to działa teraz:
Obrazek

Mam nadzieję, że jest to zrozumiałe.

Czy takie podejście do tematu jest w jakikolwiek sposób błędne? Testy pokazują, że działanie jest ok.
Widzicie jakieś złe strony takiego sterowania?

Czy moje rozumowanie jest prawidłowe?

ursus_arctos, a u Ciebie jak to działa? Tak jak to opisałem?
autor: volkhen
04 cze 2013, 17:59
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

Silnik ma 2400RPM by 24V. Ja zasilam go 20V. Przyspieszenie maksymalne sprawdzę. Zadam mu obrót 360 stopni i zapiszę trajektorię bo mogę rejestrować 200ms ruchu i później przesłać to przez RS232.

[ Dodano: 2013-06-04, 23:53 ]
Już wiem dlaczego układ działa tak jak działa. Dziś już nie mam siły tego opisywać, ale zaskoczenie dla mnie było spore. Najlepsze jest to, że w ten sposób układ działa jeszcze lepiej. Jestem ciekaw czy fabryczne serwa tak działają.
autor: volkhen
04 cze 2013, 16:12
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

Przepraszam, ale mógłbyś uściślić pytanie...
autor: volkhen
04 cze 2013, 10:28
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

5 impulsów było na innej "spokojnej" grafice, ale przy tych samych ustawieniach prędkości i przyspieszenia. Na tej konkretnej grafice mam 8 impulsów błędu.

Mój serwomechanizm bardzo mnie zaskoczył. Otóż okazało się, że PID oscyluje wokół wartości 1023 / 2 a nie jak było wcześniej wokół zera. Prawdę mówiąc to zadziałało przez jakiś przypadek ;) Stało się to od momentu gdy zacząłem sterować końcówkę mocy dwoma przebiegami PWM (odwrotnymi). W tej chwili rozszyfrowałem zasadę działania i wygląda na to, że składowa całkująca kompensuje to "przesunięcie" i ma wartość cały czas zbliżoną do 500 a pozostałe dwa człony odpowiadają za sterowanie. Co ciekawe polaryzacja sygnałów PWM zmienia się gdy wartość jest poniżej 511,5 lub powyżej. Najlepsze jest to, że takiej funkcjonalności nigdzie nie mogę znaleźć w nocie katalogowej. Poniżej konfiguracja PWM oraz funkcja od ustawiania PWM.

Konfiguracja Timera1

Kod: Zaznacz cały

// Timer1 jako fast PWM
TCCR1A = 0xB3; 					// Konfiguracja z CodeVision
TCCR1B = 0x09; 
TCNT1H = 0x00; 
TCNT1L = 0x00; 
ICR1H  = 0x00; 
ICR1L  = 0x00; 
OCR1AH = 0x00; 
OCR1AL = 0x00; 
OCR1BH = 0x00; 
OCR1BL = 0x00;
Najlepsze jest to, że te zmienne od kierunku nie są w ogóle potrzebne i serwo działa również bez tego tak jakby Timer sam w sobie zmieniał polaryzację przebiegów PWM wokół wartości 511,5. Czyli połowy maksymalnej 1023.

Kod: Zaznacz cały

void setPWM(float amps) 
{ 
  static float lpf = 0.0; 
  
  //lpf = (0.8 * lpf) + (0.2 * amps);    // Filtr LPF - nieużywany
  lpf = amps; 

  if(stat.dir == stat.dirLast) 
  { 
    // Wpisanie wart. PWM do rejestru porównującego
    OCR1A = abs(lpf);									
    OCR1B = abs(lpf); 
  } 
  else
  { 
    // Wyłączenie silnika na jedną pętlę po zmianie kierunku
    OCR1A = 0;               
	OCR1B = 0; 
  } 
  stat.dirLast = stat.dir; 
}
Jak ktoś to rozumie, to chętnie usłyszę wyjaśnienie bo wykres Fast PWM z noty katalogowej wg mnie tego nie wyjaśnia.

Jeszcze jedno. Gdy wyłączę człon całkujący (Igain = 0) to serwo zatrzymuje się na 52 lub -52 kroku enkodera, czyli człon P wyrównał aby serwo stało w miejscu. Przy wzmocnieniu Pgain = 10 wyjście wynosi wtedy 520... czyli silnik stoi.
autor: volkhen
01 cze 2013, 20:27
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

Poradziłem sobie z zakłóceniami w następujący sposób:

- Na kablach do silnika umieściłem krążki ferytowe - widać je na filmie
- Na kablach sterujących z komputera - krążki ferrytowe, tak samo na kabelkach z enkodera do mikroprocesora.
- Największą róźnicę zrobiła zamiana układu 74HCT14 na 74LS14 (układzik wyciągnąłem z urządzenia, które miało rok produkcji 1986 ;) tyle lat co ja) problem zniknął jak ręką odjął.

W tej chwili uzyskuję błąd 5 impulsów z enkodera przy zastosowaniu predykcji 1 i 2 rzędu (prędkość i przyspieszenie) przy prędkości 30000mm/min (500mm/s) i przyspieszeniu 3000mm/s2. Silniki przy takich parametrach pracują dość głośno, Jeśli zmniejszę P i D to silniki są prawie bezgłośne, ale błąd rośnie 3 krotnie.
[youtube][/youtube]

[ Dodano: 2013-06-02, 15:10 ]
Nowe testy
[youtube][/youtube]
autor: volkhen
27 maja 2013, 00:25
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

Taki jest to silnik:
Obrazek
autor: volkhen
26 maja 2013, 13:24
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

pod obciążeniem błąd jest o okolo 30% większy. obciążenie to mój palec ;) no i oczywiście bezwładnośc karetki ktora przy tak dużych prędkościach ma znaczenie.

w tej chwili tylko pid. teraz jak juz wszystko działa bezbłędnie tj końcówka mocy i uP poeksperymentuje z feedforward dziś.

z perspektywy podawanie pwm na wejście enable bylo największym błędem.

ps. pisalem z telefonu.

[ Dodano: 2013-05-26, 19:57 ]
Napiszcie mi proszę czy moje przypuszczenia są słuszne.

Na układzie L298 zakłócenia są dużo mniejsze i układ pracuje prawidłowo.

Sterowanie L298 i L6203 jest dokładnie takie samo. Podczas pracy na L6203 z silnika wychodzą szpilki, które zakłócają prace enkodera oraz sygnałów STEP/DIR.

L298 jest oparty o tranzystory bipolarne a układ L6203 o unipolarne.

Przypuszczam, że tranzystory unipolarne są szybsze, więc generują większe szpilki zwrotne, czy moje przypuszczenia są prawdziwe?
autor: volkhen
25 maja 2013, 21:21
Forum: Silniki Krokowe / Sterowniki Silników Krokowych
Temat: [C][Atmega32] Opis serwonapędu + TWORZENIE v2.0
Odpowiedzi: 77
Odsłony: 9894

Udało się opanować zakłócenia gdy wróciłem do układu L298. Z nowym sterowaniem działa wyśmienicie nawet bez zmostkowania czyli na jednym układzie wysteruję 2 osie. Kluczem okazały się dławiki ferrytowe.

[youtube][/youtube]

Przy 500mm/s i przyspieszeniu 1000mm/s2 błąd nie przekracza 10 impulsów.
Przy 800mm/s i przyspieszeniu 10000mm/s2 błąd nie przekracza 20 impulsów.

Wróć do „[C][Atmega32] Opis serwonapędu + TWORZENIE v2.0”