PWM na Arduino

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Merki
Młodszy majsterkowicz
Posty: 10
Rejestracja: 10 lut 2013, 10:32

PWM na Arduino

Post autor: Merki » 24 lut 2015, 12:08

Witam serdecznie,

mam problem z którym borykam się już parę dni i nie mogę znaleźć odpowiedzi. Chodzi mi konkretnie o to, czy jest możliwość uzyskania na Arduino płynnej modulacji PWM dla czasów rzędu minuta, dwie itd?

Próbowałem już wielu sposobów, fajne efekty były na ręcznej implementacji z wykorzystaniem delayMicroseconds (regulacja czasu trwania "1" i "0"), ale niestety trwało to max 16 s ze względu na ograniczenie polecenia. Z kolei na zwykłym delay można zadawać już tylko całkowite wartości, a dla dłuższych czasów ciężko mówić o płynności działania, nie mówiąc już o szybkości działania.

PWM z poleceniem analogWrite jest wygodny, ale nie jest bardzo dokładny, bo zaokrągla do części całkowitych i w rezultacie czas wychodzi nieco inny niż zadany. Niby można zwiększać wypełnienie po 1 (0,1,2,...,255) ale dla tak długich czasów musiałyby być długie delaye (chyba, że da się inaczej).

Gdzieś indziej znalazłem jeszcze bibliotekę SoftPWM, ale ona pozwala na czasy rzędu max. 4 s.

Czy jest ktoś kto zrealizował PWM na którym da się uzyskać czasy rozjaśniania/ściemniania kilkuset sekund bez zbytniego spadku wydajności Arduino z wykorzystaniem jedynie technik programowych?

Z góry dziękuję za możliwe podpowiedzi :)

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Merki
Młodszy majsterkowicz
Posty: 10
Rejestracja: 10 lut 2013, 10:32

Re: PWM na Arduino

Post autor: Merki » 24 lut 2015, 15:57

Odpowiem sobie sam, póki co ;)

Znalazłem przypadkiem ciekawy pomysł (temat wciąż mi nie daje spokoju), ale nie mogę zamieścić linka jeszcze. Z wykorzystaniem millis, cytuję:
Simple if you want to output something that goes from 0 to 255 in 30 mins you need to change it every 30/255 = 0.1176 mins or 7.05 seconds.

So use millis() + 7050 to get the time for the next change. Then keep looking at the current value of millis() until it exceeds this figure. Increment the value (or decrement) sent to the PWM and set the time again.
Jakieś inne sugestie?
ODPOWIEDZ

Strony partnerskie: