Ho utilizzato un Arduino Nano come controller PWM per un elemento riscaldante.
Attualmente sto usando D11 (PB3). Potrei cambiare, sebbene tutti i pin con PWM siano in uso e richiederebbe una riscrittura e un ricablaggio.
Questo produce un segnale a ~ 490 Hz, ma vorrei provare a cambiarlo in una frequenza più alta.
Immagino che sia possibile variare la frequenza cambiando il divisore dal suo predefinito 64.
Il mio schizzo utilizza Uses http://playground.arduino.cc/Main/SevenSegmentLibrary e chiama millis (): la modifica del divisore PWM avrà un impatto su uno di questi?
NOTA Ho letto la documentazione setPwmFrequency
, ma trovo inutile “interrompe il normale funzionamento” – in realtà sto cercando qualche spiegazione delleffetto concreto. Uso millis()
solo per premere il pulsante e far lampeggiare un LED, che non sono critici in termini di tempo
Tieni presente che la modifica della frequenza PWM cambia la Atmega “s timer e interrompe il normale funzionamento di molte funzioni che si basano sul tempo (delay (), millis (), libreria Servo).
Ho fatto ulteriori studi. http://playground.arduino.cc/Code/PwmFrequency dichiara Le modifiche sui pin 3, 5, 6 o 11 possono causare il ritardo () e millis ( ) per smettere di funzionare.
Altri riferimenti dicono 3, 11 usano timer 2
quindi influenzano millis()
o meno poiché altri riferimenti affermano che timer 0
viene utilizzato per questi.
Commenti
- Sì e no, a seconda del timer pwm utilizzato.
Risposta
Non so da dove provenga questa disinformazione … La risposta è no , la riconfigurazione del timer 2 non influenzano millis()
né delay()
, poiché queste funzioni si basano sul Timer 0. AFAIK il core di Arduino non usa affatto il Timer 2. Tieni però presente che potrebbero esserci altre librerie Arduino o di terze parti che si basano su Timer 2.
Puoi vedere qui il codice sorgente di millis()
e delay()
.
Come afferma correttamente MITU RAJ nella sua risposta, il segnale PWM sul pin 11 è fornito da Timer 2, quindi puoi usarlo in sicurezza.
Commenti
- La disinformazione proviene da playground .arduino.cc / Code / PwmFrequency . Sono sicuro di non essere lunico utente ad essere stato fuorviato. Laltra risposta ha appena pubblicato un estratto della documentazione fuorviante.
Risposta
La risposta è NO , la modifica del divisore PWM per il pin 11 non influirà sulla funzione millis()
(né delay()
).
Spiegazione:
Arduino Nano utilizza il microcontrollore ATMega328P, come Arduino Uno .
Il PWM del pin 11 “è controllato dal timer 2. Per impostazione predefinita, il timer 2 ha una prescala di 64 (cioè limpostazione 0x04). La frequenza di base del timer 2 è 31372,55 Hz risultante in una frequenza di 490,2 Hz (cioè 31372.55 / 64 = 490.1961).
Daltra parte, il timer in microsecondi (ovvero quello utilizzato da millis()
, micros()
, delay()
e delayMicroseconds()
) è controllato dal Timer 0.
Quindi la modifica del prescaler del Timer 2 non influirà su millis()
.
Tuttavia, cambierà la frequenza PWM del Pin 3.
Torna alla tua domanda:
Le possibili frequenze PWM del Pin 11 (superiori a 488 Hz) sono:
31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz
Dove 32, 8, 1 sono il prescaler.
Che equivale a un valore di impostazione di 0x03, 0x02 & 0x01 rispettivamente.
Aggiungi questa riga di codice:
TCCR2B = TCCR2B & 0b11111000 | setting;
Dove setting
è il valore dellimpostazione per il rispettivo prescaler.
============================================ || 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 || ============================================
Codice sorgente : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
Commenti
- Semplicemente pignolo ma … la frequenza di base del timer ' in modalità PWM con correzione di fase è F_CPU / 510 (31373 Hz), non F_CPU / 512: ci vogliono 255 cicli per contare f da 0 a 255, quindi altri 255 per tornare a zero. C.f. lequazione per la frequenza PWM nel foglio dati.
- @EdgarBonet Buon punto. La risposta è stata ora corretta.
- sarebbe possibile scendere di un gradino più lentamente fino a 15,31 HZ?
Risposta
Dipende dal pin che hai usato per il PWM.
Le specifiche di Arduino UNO / NANO dicono le seguenti cose:
La frequenza di base per i pin 3, 9, 10 e 11 è 31250 Hz.
La frequenza di base per i pin 5 e 6 è 62500 Hz.
I divisori disponibili sui pin 5, 6, 9 e 10 sono: 1, 8, 64, 256 e 1024.
I divisori disponibili sui pin 3 e 11 sono: 1, 8, 32, 64, 128, 256 e 1024.
Le frequenze PWM sono legate insieme in coppie di pin. Se uno in una coppia viene modificato, anche laltro viene modificato in modo che corrisponda.
I pin 5 e 6 vengono accoppiati sul timer0.
I pin 9 e 10 vengono accoppiati sul timer1.
I pin 3 e 11 sono accoppiati sul timer2.
Le modifiche sui pin 3, 5, 6 o 11 possono causare il ritardo () e millis () per smettere di funzionare. Potrebbero essere influenzate anche altre funzioni relative al tempo.
Commenti
- Dato che ' citando le specifiche, ' sarebbe carino se potessi anche collegarti a loro? 🙂