Obecnie mogę ustawić cztery styki PWM na około 31 kHz za pomocą następującego kodu:
void setup()
{
TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
pinMode(pwmPin9, OUTPUT); // Sets the pin as output
pinMode(pwmPin10, OUTPUT); // Sets the pin as output
TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
pinMode(pwmPin3, OUTPUT); // Sets the pin as output
pinMode(pwmPin11, OUTPUT); // Sets the pin as output
}
Gdzieś znalazłem tę konfigurację, ale nie wiem, jak zamiast tego ustawić te cztery piny PWM na około 25 kHz. Jak to możliwe?
Odpowiedzi:
Piszę tę drugą odpowiedź, ponieważ zdałem sobie sprawę, że możliwe jest posiadanie 4 kanałów PWM przy 25 kHz z 161 krokami na jednym Arduino Uno. Wymaga to zmiany głównej częstotliwości zegara na 8 MHz , co ma pewne skutki uboczne, ponieważ cały program będzie działał o połowę szybciej. To również wymaga rekonfiguracji trzech liczników, czyli utraty funkcji Ciężki rozrządu (
millis()
,micros()
,delay()
idelayMicroseconds()
). Jeśli te kompromisy są dopuszczalne, oto jak to wygląda:W przeciwieństwie do drugiej odpowiedzi , nie wymaga to zmodyfikowanej wersji
analogWrite()
: standardowa będzie działać dobrze. Należy tylko zadbać o to, aby:analogWrite()
użycia pinów 6 lub 11 nie tylko nie zapewni wyjścia PWM, ale także zmieni częstotliwość odpowiednio na pinach 5 lub 3.źródło
Możesz skonfigurować Timer 1 tak, aby pracował z częstotliwością 25 kHz w prawidłowym trybie PWM i używał dwóch wyjść na pinach 9 i 10 w taki sposób:
Zapis wartości 0
analogWrite25k()
oznacza, że pin będzie zawsze NISKI, zaś 320 oznacza zawsze WYSOKI. RegularanalogWrite()
powinien prawie działać, ale zinterpretuje 255 tak samo jak 320 (tj. Zawsze WYSOKI).Ten kod zakłada kartę Arduino Uno lub podobną (ATmega168 lub 328 @ 16 MHz). Zastosowana tutaj metoda wymaga 16-bitowego timera, a zatem wykorzystuje Timer 1, ponieważ jest to jedyny dostępny na Uno; dlatego dostępne są tylko dwa wyjścia. Metodę można dostosować do innych płyt opartych na AVR z 16-bitowym zegarem. Jak zauważył Gerben, ten zegar powinien mieć odpowiedni rejestr ICRx. W Arduino Mega są 4 takie timery, każdy z 3 wyjściami.
źródło
ICRx
rejestru. Co najwyżej, możesz mieć tylko jeden pin PWM na timer, dla timerów 0 i 2.COM4C1
wTCCR4A
? 2. Jeśli to nie jest problem, przeczytaj Jak zadać dobre pytanie? , a następnie zaktualizuj swoje pytanie , dołączając pełny kod źródłowy i wyraźnie określając, czego oczekujesz od programu i co robi zamiast tego („Nie widzę żadnego sukcesu” nie jest uważane za prawidłowe oświadczenie o problemie).