Częstotliwość Arduino Nano PWM

Używam Arduino Nano jako kontrolera PWM dla elementu grzejnego.

Obecnie używam D11 (PB3). Mógłbym zmienić, chociaż wszystkie piny z PWM są w użyciu i wymagałyby ponownego zapisu i ponownego podłączenia.

Daje to sygnał przy ~ 490 Hz, ale chciałbym poeksperymentować ze zmianą tego na wyższą częstotliwość.

Rozumiem, że można zmieniać częstotliwość, zmieniając dzielnik z domyślnego 64.

Mój szkic używa http://playground.arduino.cc/Main/SevenSegmentLibrary i wywołuje funkcję millis () – czy zmiana dzielnika PWM wpłynie na którykolwiek z nich?

UWAGA Przeczytałem dokumentację setPwmFrequency, ale stwierdzenie, że „zakłóca normalne działanie” jest niepomocne – tak naprawdę potrzebuję wyjaśnienia konkretnego efektu. Używam tylko millis() do naciśnięć przycisków czasu i migania diody LED, które nie są krytyczne czasowo

Należy pamiętać, że zmiana częstotliwości PWM zmienia Timery Atmega i zakłócają normalne działanie wielu funkcji, które opierają się na czasie (delay (), millis (), biblioteka Servo).

Robiłem dalsze badania. http://playground.arduino.cc/Code/PwmFrequency stany Zmiany na pinach 3, 5, 6 lub 11 mogą powodować opóźnienie () i millis ( ), aby przestały działać.

Inne źródła mówią, że 3, 11 używają timer 2, więc zrób wpływają na millis() lub nie , ponieważ według innych odniesień timer 0 jest do nich używany.

Komentarze

  • Tak i nie, w zależności od używanego licznika czasu pwm.

Odpowiedź

Nie wiem, skąd pochodzą te błędne informacje … Odpowiedź brzmi no , ponowna konfiguracja Timera 2 powoduje nie wpływają na millis() ani na delay(), ponieważ te funkcje opierają się na Timerze 0. AFAIK, rdzeń Arduino w ogóle nie używa Timera 2. Należy jednak pamiętać, że mogą istnieć inne biblioteki Arduino lub biblioteki innych firm, które polegają na Timerze 2.

Tutaj możesz zobaczyć kod źródłowy millis() i delay() .

Jak poprawnie stwierdza MITU RAJ w swojej odpowiedzi, sygnał PWM na pinie 11 jest dostarczany przez Timer 2, abyś mógł z niego bezpiecznie korzystać.

Komentarze

  • Błędne informacje pochodzą z placu zabaw .arduino.cc / Code / PwmFrequency . Jestem pewien, że nie jestem jedynym użytkownikiem, który został wprowadzony w błąd. Druga odpowiedź właśnie opublikowała fragment wprowadzającej w błąd dokumentacji.

Odpowiedź

Odpowiedź brzmi NIE , zmiana rozdzielacza PWM dla styku 11 nie wpłynie na funkcję millis() (ani delay()).


Wyjaśnienie:
Arduino Nano wykorzystuje mikrokontroler ATMega328P, taki sam jak Arduino Uno .

PWM styku 11 „jest sterowane przez Timer 2. Domyślnie Timer 2 ma wstępne skalowanie 64 (tj. ustawienie 0x04). Podstawowa częstotliwość Timera 2 wynosi 31372,55 Hz, co daje częstotliwość 490,2 Hz (tj. 31372.55 / 64 = 490.1961).

Z drugiej strony licznik czasu w mikrosekundach (tj. Ten używany przez millis(), micros(), delay() i delayMicroseconds()) jest kontrolowane przez Timer 0.

zmiana preskalera Timera 2 nie wpłynie na millis().

Zmieni to jednak częstotliwość PWM pinu 3.


Wracając do pytania:
Możliwe częstotliwości PWM styku 11 (wyższe niż 488 Hz) to:

31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz

Gdzie 32, 8, 1 to preskalator.
Co równa się do wartości ustawienia odpowiednio 0x03, 0x02 & 0x01.

Dodaj ten wiersz kodu:

TCCR2B = TCCR2B & 0b11111000 | setting; 

Gdzie setting to wartość ustawienia dla odpowiedniego preskalera.

============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================ 

Kod źródłowy : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c

Komentarze

  • Po prostu czepiam się, ale … podstawowa częstotliwość zegara ' w trybie PWM z poprawnym fazowo to F_CPU / 510 (31373 Hz), a nie F_CPU / 512: liczy się 255 cykli fa rom od 0 do 255, a następnie jeszcze 255, aby odliczać z powrotem do zera. C.f. równanie na częstotliwość PWM w arkuszu danych.
  • @EdgarBonet Słuszna uwaga. Odpowiedź została teraz poprawiona.
  • czy możliwe byłoby zejście o krok wolniej do 15,31 Hz?

Odpowiedź

Zależy od pinu użytego do PWM.

Specyfikacje Arduino UNO / NANO zawierają następujące informacje:

Podstawowa częstotliwość dla pinów 3, 9, 10 i 11 to 31250 Hz.

Podstawowa częstotliwość dla pinów 5 i 6 to 62500 Hz.

Dostępne dzielniki na pinach 5, 6, 9 i 10 to: 1, 8, 64, 256 i 1024.

Dzielniki dostępne na pinach 3 i 11 to: 1, 8, 32, 64, 128, 256 i 1024.

Częstotliwości PWM są połączone w pary pinów. Jeśli jeden w parze zostanie zmieniony, drugi również zostanie zmieniony, aby pasował.

Piny 5 i 6 są sparowane na timer0.

Piny 9 i 10 są sparowane na timerze1. p>

Piny 3 i 11 są sparowane z zegarem 2.

Zmiany na pinach 3, 5, 6 lub 11 mogą powodować opóźnienie () i millis (), aby przestały działać. Może to mieć również wpływ na inne funkcje związane z synchronizacją.

Komentarze

  • Ponieważ ' ponownie cytując specyfikacje, czy ' byłoby miło, gdybyś mógł również linkować do nich? 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *