22-02-2018, 14:50
G woli ścisłości dla potomnych, wytłumaczmy sobie działanie programu z poprzedniej strony i dla czego nie robił tego co by autor chciał żeby robił.
Zaznaczyć trzeba, że program robi zawsze to, do czego został napisany.
W naszym przypadku te dziwne zaklęcia w stylu: TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); włączają dwa kanały timera. Kanał A na 38.4kHz (no nie do końca się zgodzę z autorem), kanał B na połowę kanału A.
Po różnych czarodziejskich wyrażeniach na nogę PIN3 wystawiony zostaje sygnał o częstotliwości kanału A z wypełnieniem 50% (ponieważ B/A=0.5).
Dopiero w funkcji loop(); mamy pinMode(3, pot2);
To znaczy, że jak pot2>0, to PIN3 ustawiony zostaje jako wyjście i otrzymujemy na nim sygnał z zegara.
Silnik nie pracuje na pełnych obrotach jak to napisał bako1987, tylko na 50%.
Potencjometr po prostu włącza i wyłącza sygnał PWM na nodze 3.
Chcąc rozwiązać nasz problem, musimy zacząć sterować wypełnieniem, czyli nomen omen wartością kanału B dla OCR2.
I myślę, że w tym przypadku powinno to wyglądać tak:
void loop(){
int pot = (analogRead(A0));
val = map(val, 0, 1023, 0, 51);
OCR2B=val;
}
Rozwiązanie bako1987 z wykorzystaniem biblioteki PWM, jest dokładnie tym samym co ja tu napisałem, tylko że biblioteka jest opasła ze względu na zawartość wielu niepotrzebnych nam funkcji( niepotrzebnych w tym przypadku)
Dla usprawnienia można jedynie użyć makra digitalPinToTimer.
Pozdrawiam.
Zaznaczyć trzeba, że program robi zawsze to, do czego został napisany.
W naszym przypadku te dziwne zaklęcia w stylu: TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20); włączają dwa kanały timera. Kanał A na 38.4kHz (no nie do końca się zgodzę z autorem), kanał B na połowę kanału A.
Po różnych czarodziejskich wyrażeniach na nogę PIN3 wystawiony zostaje sygnał o częstotliwości kanału A z wypełnieniem 50% (ponieważ B/A=0.5).
Dopiero w funkcji loop(); mamy pinMode(3, pot2);
To znaczy, że jak pot2>0, to PIN3 ustawiony zostaje jako wyjście i otrzymujemy na nim sygnał z zegara.
Silnik nie pracuje na pełnych obrotach jak to napisał bako1987, tylko na 50%.
Potencjometr po prostu włącza i wyłącza sygnał PWM na nodze 3.
Chcąc rozwiązać nasz problem, musimy zacząć sterować wypełnieniem, czyli nomen omen wartością kanału B dla OCR2.
I myślę, że w tym przypadku powinno to wyglądać tak:
void loop(){
int pot = (analogRead(A0));
val = map(val, 0, 1023, 0, 51);
OCR2B=val;
}
Rozwiązanie bako1987 z wykorzystaniem biblioteki PWM, jest dokładnie tym samym co ja tu napisałem, tylko że biblioteka jest opasła ze względu na zawartość wielu niepotrzebnych nam funkcji( niepotrzebnych w tym przypadku)
Dla usprawnienia można jedynie użyć makra digitalPinToTimer.
Pozdrawiam.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.