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? 🙂