Buongiorno a tutti.
Avrei bisogno di modificare la frequenza di un singolo Pin di uscita PWM per un Arduino Uno, senza se possibile modificare i timer interni.
Ho letto un articolo che utilizzava il comando senza indicare eventuali librerie aggiuntive:
setPwmFrequency(9, 1);
Per dividere la frequenza di base del Pin 9 che dovrebbe essere nell'Arduino Uno per il Pin 9 a 31250Hz dividendo per 1 invece che per 64 ed avere quindi una Frequenza di 31250Hz al posto di 488Hz.
Mi serviva per provare ad eliminare il fischio per comandare un Motore Dc.
Ho provato ad inserire il comando nel void setup ma mi viene dato l'errore di comando non dichiarato.
Credo quindi che ci sia bisogno di una libreria esterna.
Leggendo su google ho trovato il nome di questa libreria "PWM-Frequency-library" ma non riesco a trovarla per aggiungerla.
Grazie mille per la risposta.
credo che questa soluzione sia più che sufficiente in quanto ora ho capito che i tempi sono appunto gestiti da due pin che non tocco. A me serviva un uno qualsiasi quindi posso utilizzare il Pin 9 o 10 che utilizzano lo stesso timer e sono apposto.
Come mai non riesco a trovarla direttamente dall'IDE? forse sbaglio modo di cercare, io cerco PWM_frequency_Arduino_change
E' un pezzo di codice anche poco furbo, perche i case vanno a usare esattamente gli stessi valori argomenti dello switch!
Inoltre "Divisor" in realtà non è il divisore ma, appunto, il numero da inserire per ottenere il divisore desiderato, che è una potenza di due.
Sono anche sbagliate le frequenze dei pin 11 e 3, probabilmente misurate su un Arduino Uno che ha un oscillatore ceramico molto approssimativo, anziché calcolate come per quelle degli altri pin.
Ho seguito ciò che mi hai detto e richiamato la funzione in questo modo per il pin 9 e di conseguenza il pin 10
setPwmFrequencyUNO(9, 1);
Ho impiegato giorni di ricerche e per cercare di capire e invcece in giornata avete ricreato una funzione, corretta come io sbadatamente correggerei un digitalwrite con la w minuscola...
Che dire, siete davvero grandi.
Grazie mille, ora il motore non fischia più
Sto per acquistare un arduino nano every che come sapete ha un processore diverso, questa funzione potrebbe lavorare allo stesso modo o non è compatibile?
Buonasera a tutti.
Ho scritto nuovamente qui, senza aprire un altro post in quanto il fine è uguale.
Se ho sbagliato chiedo scusa.
Volevo trovare una soluzione analoga anche per l' Arduino Nano Every.
Cercando in rete, ho trovato questo codice che seppur non dia errori, pare non modificare la frequenza in uscita a quel valore.
Collegando un oscilloscopio, il valore rimane sempre a 1.000Khz circa.
Sò che la frequenza dell'Arduino Nano Every è di 20Mhz ma ho lasciato ugualmente 31250Hz (che non credo sia raggiungibile con qualsiasi divisore) ma ho voluto lasciare il codice come l'ho trovato.
Grazie in anticipo
void setup() {
// Imposta il pin 9 come output
pinMode(9, OUTPUT);
// Imposta la frequenza del PWM sul pin 9
setPin9PWMFrequency(31250);
}
void loop() {
analogWrite(9, 128); // Imposta il duty cycle del PWM al 50% (valore tra 0 e 255)
}
void setPin9PWMFrequency(long frequency) {
// Calcola il valore del prescaler in base alla frequenza desiderata
long prescalerValue = F_CPU / (frequency * 2) - 1;
// Imposta il prescaler del Timer/Counter 2 (TC2)
TCB2.CTRLA = TCB_CLKSEL_CLKDIV2_gc | TCB_ENABLE_bm;
// Imposta il periodo del Timer/Counter 2 (TC2)
TCB2.CCMPL = 0xFFFF;
// Imposta il prescaler del Timer/Counter 3 (TC3)
TCB3.CTRLA = TCB_CLKSEL_CLKDIV2_gc | TCB_ENABLE_bm;
// Imposta il periodo del Timer/Counter 3 (TC3)
TCB3.CCMPL = prescalerValue;
}
In aggiunta ho trovato anche questa stringa di codice che da sola modificherebbe la frequenza dei pin associati 9 e 10 impostando il divisore a 128 nel caso dell' 8 , (0xF8).
Anche questa non dà errore ma non modifica la frequenza come desiderato.