Skocz do zawartości

[Kurs] Programowanie ARM LPC1114 cz.4 - PWM


Elvis

Pomocna odpowiedź

Poprzednia część kursu.

[Kurs] Programowanie ARM LPC1114 cz.4 - PWM

Programowy PWM

Podobnie jak w poprzednim kursie przygotujemy programowe sterowanie jasnością diod. Mamy do dyspozycji tylko 2 diody, ale to wystarczy do nauki.

W pliku program11.zip znajdziemy kod programu. W poprzednim kursi znajdziemy sporo informacji o PWM: https://www.forbot.pl/forum/topics20/kurs-programowania-arm-cz7-pwm-vt3926.htm

Wykorzystamy timer jak w poprzednim przykładzie, ale zmienimy częstotliwość wywoływania procedury przerwania. Tym razem będziemy wywoływać ją co 100us. Wystarczy zmienić wartość rejestrów MR0 oraz PR.

W procedurze obsługi przerwania wywołamy procedurę pomocniczą pwm_proc(). Działa ona tak jak opisywana dokładnie w poprzedniej edycji kursu - realizuje programowy PWM na liniach podłączonych do diod LED1 i LED2.

Działanie PWM zostało już opisane w poprzednim kursie.

Warto zwrócić na nową funkcję delay() - pozwala ona na odczekiwanie przez zadany czas (parametrem jest opóźnienie w jednostkach 10ms).

Nieco mylące jest sterowanie diodami - wystawiając logiczne 0 zapalamy diody, a 1 gasimy. Więc wypełnienie PWM 0% oznacza maksymalną jasność diody, a 100% - jej wygaszenie. Stąd w wyliczeniach niejako odwrotne sterowanie.

Sprzętowy PWM

Umiemy już programowo obsługiwać PWM, czas poznać możliwości sprzętowego PWM. Sprzętowe rozwiązanie jest pod wieloma względami znacznie lepsze niż programowe. Nie obciąża procesora, jest znacznie dokładniejsza niż realizacja programowa.

Następny przykład znajdziemy w pliku program12.zip.

Celem programu jest sterowanie silniczkami robota. Za pomocą joysticka na płytce ZL32ARM będziemy sterować robotem.

Wykorzystamy znany nam już 16 bitowy timer 0, tym razem uruchomimy w nim tryb PWM.

Do wyprowadzeń P0_9 oraz P0_10 podłączamy sterownik silników. W opisywanym przykładzie są to po prostu tranzystory BC337. Równie dobrze, a nawet lepiej można byłoby podłączyć mostek H, przykładowo dobrze znany L293.

W poprzedniej części kursu wspomniane zostały funkcje alternatywne linii procesora. Teraz z nich skorzystamy. Domyślnie P0_9 oraz P0_10 są to linie wejścia-wyjścia. My chcemy, żeby działał na nich sprzętowy PWM. Zmieniamy działanie linii następującym kodem:

	LPC_IOCON->PIO0_9 = 0x02;
LPC_IOCON->SWCLK_PIO0_10 = 0x03;

Dokładny opis kodów dla każdego pinu znajduje się w dokumentacji procesora. Po wykonaniu powyższego kodu linie P0_9 i P0_10 zamiast zwykłymi I/O stają się wyjściami modułu PWM.

Musimy dokonać drobnej zmiany w naszej konfiguracji timera.

Po pierwsze uruchamiamy PWM na tym timerze pisząc:

	LPC_TMR16B0->PWMC = 0x06;

Kod uruchamia wyjścia MAT1 i MAT2 timera (są one wyprowadzone na liniach P0_9 i P0_10).

Kolejna zamiana to przypisanie rejestrom MR1 i MR2 wartości wypełnienia linii PWM:

	LPC_TMR16B0->MR1 = PWM_PERIOD;
LPC_TMR16B0->MR2 = PWM_PERIOD;

Czeka nas tutaj pewna niespodzianka. PWM układu LPC1114 działa w ten sposób, że na początku okresu PWM na wyjściu wystawiane jest logiczne 0, po doliczeniu do wartości rejestru MR1 (albo MR2), wyjście zmienia wartość na 1.

Oznacza to, że wpisanie do MR1 wartości 0 daje 100% wypełnienie PWM, a wartość MR1 - daje na wyjściu 0%. Czyli niejako odwrotnie niż byśmy tego oczekiwali.

Aby ułatwić sterowanie silnikami przygotujemy funkcję, która przyjmie (w procentach) wypełnienie PWM, dokona odpowiednich przeliczeń i ustawi odpowiednie rejestru. Kod tej funkcji wygląda następująco:

void pwm_set(int32_t l_proc, int32_t r_proc)
{
LPC_TMR16B0->MR1 = PWM_PERIOD*(100-l_proc)/100;
LPC_TMR16B0->MR2 = PWM_PERIOD*(100-r_proc)/100;
}

Prosty program główny pozwoli nam na sterowanie robotem:

if (GPIOGet(JOY_U)==0) 
			pwm_set(100, 100);
		else if (GPIOGet(JOY_OK)==0) 
			pwm_set(25, 25);
		else if (GPIOGet(JOY_L)==0) 
			pwm_set(50, 0);
		else if (GPIOGet(JOY_R)==0) 
			pwm_set(0, 50);
		else 
			pwm_set(0, 0);

Sterowanie silnikiem - znaczenie diod zabezpieczających

Postanowiłem zaryzykować uszkodzenie tranzystorów sterujących i przepadać wpływ diod na pracę układu.

Na początek podłączyłem silnik bez diod zabezpieczający. Pierwszy program nie wykorzystywał PWM, jedynie w pełni załączał silnik. Co ciekawe diody nie okazały się niezbędne. Jak widać na oscylogramie poniżej, wszystko działało poprawnie.

Jednak uruchomienie PWM diametralnie zmieniło sytuację. Poniżej widać oscylogramy (po prawej zmieniona jest skala - indukowane napięcie było tak duże, że nie było widać go przy poprzedniej skali)

Co prezentują powyższe oscylogramy? Przy rozłączaniu zasilania silników indukuje się całkiem znaczne napięcie. Jak widać jest to ponad 25V!

Dopóki stale zasilaliśmy silnik nic złego się nie działo. Jednak, gdy używamy PWM, każde rozłączanie zasilania indukuje niekorzystne dla nas napięcie.

Mój układ wytrzymał takie sterowanie, jednak potencjalnie możemy w ten sposób uszkodzić sterownik silnika, a nawet procesor.

Sytuacja jest jeszcze gorsza, gdy zablokujemy silnik. Po lewej stronie widać oscylogram przy pracy silników bez obciążenia, po prawej gdy zablokujemy koła:

Teraz pojawia się napięcie ponad 45V!

Na początek dodamy diodę równolegle do tranzystora - taka dioda jest wbudowana w większość tranzystorów MOSFET.

Jak widać dioda ta niewiele pomaga. Musimy więc dodać kolejne diody - tym razem równolegle z uzwojeniami silnika.

Teraz wreszcie sytuacja jest nieco lepsza. Napięcie nieznacznie przekracza 7V.

Ja zastosowałem tanie i wolne diody 1N4148. Gdyby zastosować diody szybkie (schotky'ego) uzyskalibyśmy jeszcze lepsze rezultaty.

Wniosek jest następujący: diody zabezpieczające są niezbędne.

Warto wspomnieć o jeszcze jednym efekcie - z diodami silniki uzyskały znacznie większy moment i prędkość przy takim samym wysterowaniu.

program11.zip

program12.zip

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.