Skocz do zawartości

PWM - o co chodzi?


pawel320

Pomocna odpowiedź

Witam. Tak wiem :-> pytanie może proste, ale dla was, nie dla mnie. O co chodzi z tym PWM, bo nie mogę nic znaleźć w necie, chodzi o to, że można stopniowo sterować obrotami silnika, tzn. napięciem? Ale w jaki sposób jeśli chciałbym to zrobić np. na atmedze. Wytłumaczy ktoś?

__________

Komentarz dodany przez: Sabre

Post był raportowany, poprawiłem pisownię i błędy.

Link do komentarza
Share on other sites

Sorry, źle szukałem.. jest dużo ale bardzo szczegółowo a ja na początku chciałbym się dowiedzieć jak ty wgyląda w praktyce. Żeby zrobić programowy PWM trzeba jakiś procek i co jeszcze?

[ Dodano: 26 Wrz 10 09:26 ]

A może jakiś godny polecenia artykuł, czy coś..? nie było o tym np w "elektronika dla wszystkich'?

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

PWM, czyli po polsku MSI, czyli modulacja szerokością impulsu. Najlepiej poczytaj dokumentacje procesora na który chcesz taki program napisać. Wszystko tam jest. I MOIM ZDANIEM nie ma łatwego sposobu żeby zacząć z uC. CZYTAĆ, CZYTAĆ, I ZROBIĆ.

Link do komentarza
Share on other sites

Powiedzcie proszę, w czym to można praktycznie wykorzystać, czyli jak rozumiem PWM to inaczej szerokość impulsu [nie dosłownie]. Czyli powiedzcie mi jeszcze jdną rzecz, jakbym chciał zrobić coś takiego żeby np silnik kręcił się wolno, potem troche szybciej potem stopniowo wolno i znów np 2 razy szybko. Czy da się zrobić coś takiego? Jeśli by ktoś mogł opisać jak.. byłbym wdzięczny. Nie chodzi mi o: podłącz niebieski kabelek do rezystora, czerwony z niebieskim do baterii, tylko co było by potrzebne do zrobienia czegoś takiego.

Sorki że tak zawracam głowę, każdy kiedyś zaczynał [chyba]

Link do komentarza
Share on other sites

Nie chcę zakładać nowego tematu a mam pytanie odnośnie PWM.

W linkach które podaliście nie widzaiałem nigdzie wytłumaczenia dlaczego takie liczby a nie inne.

Chodzi mi o "Prescale" i "PWM=x"

Zauważyłem że niektórzy piszą różne liczby. Z tego co wywnioskowałem to wygląda to tak jakby Prescale zmieniało częstotliwość a PWM zakres napięcia na wyjściu OC1A - tzn przy PWM=8 (skala chyba do 256) podająć PWM1a=100 dioda świeci mocniej niż przy PWM=10 (skala chyba do 1024).

Bardzo bym prosił o wytłumaczenie tego jak dla jakiegoś "chłopa z pola"

Jeszcze jedna sprawa.

Napisałem taki kod:

$regfile = "m8def.dat"
$crystal = 1000000
Config Pinb.1 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Disconnect , Prescale = 1
Config Portc = Input
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
S1 Alias Pinc.0
S2 Alias Pinc.1
S3 Alias Pinc.2
S4 Alias Pinc.3
S5 Alias Pinc.4
Do
Start Timer1
If S1 = 0 Then
Pwm1a = 50
End If
If S2 = 0 Then
Pwm1a = 100
End If
If S3 = 0 Then
Pwm1a = 150
End If
If S4 = 0 Then
Pwm1a = 200
End If
If S5 = 0 Then
Pwm1a = 250
End If
Loop
End

Przyciskami S1-S5 mogę zmieniać skokowo jasność świecenia diody.

W jaki sposób można przerobić program by móc zmieniać jasność świecenia diody tylko dwoma przyciskami, tzn. jeden przycisk jest od zwiększania jasności a drugi od zmniejsznia.

Chciałbym aby odbywało się na dwa sposoby (dwa rózne programy):

-zmiana skokowa;

-zmiana w zależności od tego jak długo był przycisnięty przycisk.

Link do komentarza
Share on other sites

W jaki sposób można przerobić program by móc zmieniać jasność świecenia diody tylko dwoma przyciskami, tzn. jeden przycisk jest od zwiększania jasności a drugi od zmniejsznia.
If S1 = 0 Then
pwm1a = pwm1a + 20
Elseif S2 = 0 Then
Pwm1a = pwm1a - 20
End if

No i należy jeszcze dodać jakiąś granice, np

if pwm1a >255 then pwm1a = 255

Czy skokowo, czy płynnie, wystarczy troszkę z tym pokombinować i pomyśleć przede wszystkim i na pewno się uda, próbując sam nauczysz się więcej. Proponuję do obsługi przycisków użyć instrukcji Debounce albo odczekać np. 25ms i sprawdzić ponownie stan przycisków, inaczej mogą być problemy z drganiem styków.

A ogólnie to radziłbym się zaprzyjaźnić z książką M.Wiązani - "Programowanie mikrokontrolerów AVR...", którą można zdobyć przez google po kosztach pradu zużywanego przez komputer.

Link do komentarza
Share on other sites

Skokowa zmiana okazałą się bardzo prosta.

Jednak Twój warunek nie działał - po uzyskaniu maksymalnej jasności następne przyciśnięcie przycisku od rozjaśniania powodowało zgaszenie diody i kolejne rozjaśnianie.

Warunek zadziałał dopiero gdy sutawiłem go w ten sposób:

If Pwm1a>239 Then
Pwm1a=235

Używałem przy tym funkcji Debounce i próbowałem też odczekać 25ms i ponownie sprawdzic stan przycisku.

Jeżeli chodzi o płynnę regulację to nie mam pomysłu jak to zrealizować - może jakaś podpowiedź?

Link do komentarza
Share on other sites

Warunek nie działa jak zmienna pwm1a jest zdeklarowana jako bajt, bo po operacji typu 240+20 wynikiem jest 4 a nie 260 (nie da się zapisać 260 w 1 bajcie). Musisz zdefiniować PWM1A jako zmienną 2bajtową.

Płynna regulacja to po prostu zmienienie kroku z +/-20 do +/-1 .

Niestety masz tutaj jeszcze problemy związane z konstrukcją i działaniem oka ludzkiego.

Żeby taki efekt był naprawdę płynny to musiałbyś zrobić 2 rzeczy:

a) zmieniać jasność w skali logarytmicznej a nie liniowej. Jak zrobisz skalę liniową to od 0 do 50 oko będzie widziało dużą różnicę jasności, od 50 do 100 małą a od 100 do 255 już prawie żadnej.

b) pod koniec/na początku zmiany jasności dodać pewne spowolnienie. Inaczej nastąpi na moment "rozbłysk" światła. Jest to spowodowane tym, że oko przyzwyczaja się do zmiany jasności i źrenica się powiększa/pomniejsza cały czas. Jak nagle zmiana jasności ustaje to na moment źrenica nadal zachowuje swój ruch i dopiero po chwili powraca do prawidłowego otwarcia. W tym czasie człowiek widzi jakby nastąpiło przygaszenie światła (źrenica nadal się pomniejsza, ale ilość światła już się nie zmienia).

Link do komentarza
Share on other sites

Jeżeli chodzi o płynnę regulację to nie mam pomysłu jak to zrealizować - może jakaś podpowiedź?

Płynną regulację musisz zrobić w pętli, ale musisz dać po każdym zwiększeniu wartości PWMu jakiegoś waita i to przynajmniej na jakieś 300ms, musisz też dodać zmienną pomocniczą, która będzie sprawdzana czy nie przepełnia PWMu przed przepisaniem do samego rejestru PWMa:

$regfile = "m8def.dat"
$crystal = 1000000
Config Pinb.1 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Disconnect , Prescale = 1
Config Portc = Input

Dim Pom As Integer
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 1
S1 Alias Pinc.0
S2 Alias Pinc.1
S3 Alias Pinc.2
S4 Alias Pinc.3
S5 Alias Pinc.4


Do

Set S1
Set S2

If S1 = 0 Then

  Pom = Pom + 1

  If Pom > 255 Then Pom = 255

  Pwm1a = Pom

  Waitms 300

End If

If S2 = 0 Then

  Pom = Pom - 1

  If Pom < 0 Then Pom = 0

  Pwm1a = Pom

  Waitms 300

End If

Loop
End

Już mówię dlaczego zmienna Pom jest jako Integer, gdyby była jako Byte nie można by było ustawić PWMa na 0, ponieważ przy następnym przejściu pętli zmienna Pom uzyskiwałaby wartość 255 i nie można by było ustawić warunku na przepełnienie, gdy zmienna Pom będzie miała wartość ujemną to wtedy zawsze będzie zerowana, przed wpisaniem do rejestru PWMa. Przy tym kodzie będziesz miał 3 zmiany wartości na sekundę, możesz albo zmniejszyć Wait do 100ms albo zwiększyć przyrost Pom z 1 do 5 albo i 10.

Link do komentarza
Share on other sites

Mamy chyba jakiś błąd na forum z cytowaniem:

IMG_4ca859c5179047692.jpg

[ Dodano: 03 Paź 10 12:26 ]

Jednak Twój warunek nie działał - po uzyskaniu maksymalnej jasności następne przyciśnięcie przycisku od rozjaśniania powodowało zgaszenie diody i kolejne rozjaśnianie.

Warunek zadziałał dopiero gdy sutawiłem go w ten sposób:

Kod:

If Pwm1a>239 Then

Pwm1a=235

Bo ja ci nie podałem gotowca tylko sposób, chodziło mi o to żebyś sobie sam dostosował, jak widać ci się udało 😉

Link do komentarza
Share on other sites

Wydaje mi się że kolega MirekCz nie zrozumiał o co chodzi z płynną regulacją lub ja nie rozumiem Twojej wypowiedzi..

Nie chodzi o zmiane rozdzielczości z 20 do 1 tylko o to żeby dłuższe przytrzymanie przycisku powodowało mocniejsze rozjaśnienie lub ściemnienie diody.

Widze że byłem bliski płynnej regulacji - wstawiałem wait ale po end if a nie przed.

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.