utilizzare il timer 1 e registro OCR1C sul pin D11 di arduino Micro

Come si indirizza il timer 1C al posto dello A0 sul pin D11 (12 sul micro) al posto di quello di default A0? (mi serve per generare un segnale pwm con frequenza sui 30 kHz senza interferire con le funzioni millis & co) Premetto che sono nuovo e non ne esco fuori con questo problema.
Grazie in anticipo!!!

Timer 1C? A0?
Di cosa stai parlando, scusa?? :sweat_smile: :sweat_smile:

La frequenza del PWM viene derivata con pochi divisori fissi dal clock del Atmega328. Percui sono disponibili solo 6-7 frequenze.
Ciao Uwe

Ti conviene usare il timer3 corrispondente al pin 5 con il relativo divisore settato ad 1

TCCR3B = TCCR3B & 0xF8 | 0x01; // timer 3, divisor 1, PWM = 31373Hz

Per maggiori info --> Arduino Playground - TimerPWMCheatsheet
oppure anche qui --> PWM VELOCE - Software - Arduino Forum

uwefed:
La frequenza del PWM viene derivata con pochi divisori fissi dal clock del Atmega328. Percui sono disponibili solo 6-7 frequenze.
Ciao Uwe

Non è esatto, aggiustando non solo il prescaler (divisore) ma anche i valori dei registri, si può spaziare in un range molto elevato, da poche decine di Hz a frequenze dell'ordine dei Khz :wink:

Non è esatto, aggiustando non solo il prescaler (divisore) ma anche i valori dei registri, ...

Leo, approfitto del tuo intervento per suggerire un'altra modifica da fare al tuo Ardu Companion.

Infatti, mentre è possibile modificare il valore di OCRxA, l'atro registro OCRxB è solo fisso con valore 128: non sarebbe meglio dare la possibilità di variare anche questo e di far calcolare di conseguenza la frequenza di PWM ed il Duty Cycle?

Inoltre, poiché ci sono Timer ad 8 e 16 bit e per alcuni i possibili divisori sono diversi, non sarebbe meglio inserire solo i divisori possibili. Se poi aggiungessi anche quelli disponibili per Uno, MEGA e MICRO sarebbe il massimo.

leo72:

uwefed:
La frequenza del PWM viene derivata con pochi divisori fissi dal clock del Atmega328. Percui sono disponibili solo 6-7 frequenze.
Ciao Uwe

Non è esatto, aggiustando non solo il prescaler (divisore) ma anche i valori dei registri, si può spaziare in un range molto elevato, da poche decine di Hz a frequenze dell’ordine dei Khz :wink:

Dopo una lunga telefonata mi é un po piú chiara la cosa.
Grazie Leo.

cyberhs:
Leo, approfitto del tuo intervento per suggerire un'altra modifica da fare al tuo Ardu Companion.

Infatti, mentre è possibile modificare il valore di OCRxA, l'atro registro OCRxB è solo fisso con valore 128: non sarebbe meglio dare la possibilità di variare anche questo e di far calcolare di conseguenza la frequenza di PWM ed il Duty Cycle?

Lo puoi già fare.
Spuntando la voce "OCRxA as top" si attiva il pulsante sottostante che, di default, presenta la voce "Toggle OCRxA" ed il campo a DX dell'OCRxB non selezionabile. Cliccando su "Toggle...." passi a "Output on OCRxB" e si abilita per la modifica anche il campo laterale :wink:

Inoltre, poiché ci sono Timer ad 8 e 16 bit e per alcuni i possibili divisori sono diversi, non sarebbe meglio inserire solo i divisori possibili. Se poi aggiungessi anche quelli disponibili per Uno, MEGA e MICRO sarebbe il massimo.

Sì ma il problema si complica perché ogni famiglia di MCU ha il suo blocco di divisori. Se vuoi diventare matto, apri il datasheet dell'Attiny85 e guarda quanti ne ha il timer 1! Diventa una complicazione star dietro a tutti. Quindi è stata fatta una cosa generica

uwefed:
Dopo una lunga telefonata mi é un po piú chiara la cosa.
Grazie Leo.

Figurati :wink: :wink:

cyberhs:
Infatti, mentre è possibile modificare il valore di OCRxA, l'atro registro OCRxB è solo fisso con valore 128: non sarebbe meglio dare la possibilità di variare anche questo e di far calcolare di conseguenza la frequenza di PWM ed il Duty Cycle?

Se fai click sul "?" in alto a destra ... ti da un po' di informazioni su quello che si può fare ...
Se manca qualche cosa nell'help, cortesemente segnalacelo, che lo aggiungiamo. GRAZIE XD

Guglielmo

Scusate, oggi ho avuto un pò di tempo per cercare di capire come si genera un PWM in un microcontrollore. Il mio problema è che ho a disposizione i pin D10 e D11 per pilotare due ponti H e di conseguenza due motori. Mi sono accorto che la frequenza del PWM di default è bassa per questo tipo di applicazione e genera un fastidioso rumore. Dunque ho modificato il prescaler del timer 1, ma non riesco ad ottenere il segnale sul OC1C (Output Compare pin 1C) sul pin D11. Mentre per il D10 non ho avuto problemi. Ho le idee ancora confuse e scusatemi se sto dicendo fesserie XD

I pin 10 e 11 sono attaccati a due Timer diversi.

Rispettivamente ai Timer 1 e 0. Ma leggendo arduino.cc/en/Hacking/PinMapping32u4 trovo che al pin D11 sono indirizzati sia OC0A che OC1C, e vorrei ottenere un segnale PWM da quest'ultimo. Mi chiedo se sia possibile.

Il 32U4 è montato sulla Leonardo che ha un PWM in più e una diversa mappatura.
Sulla UNO c'è l'ATmega328P.
Tu che scheda stai usando?

Credo che tutti gli interventi precedenti fossero per la UNO.

Scusate, io sto parlando dell' arduino micro, pensavo di averlo specificato in precedenza.

L'Arduino Micro (http://arduino.cc/en/Main/ArduinoBoardMicro) monta il 32U4.
Credo che bisognerà riavvolgere il nastro. :grin:

Bellissimo schema riepilogativo delle funzioni dei pin :wink: per pin11 intendevo cmq il pin 12 del 32u4 ovvero PB7. c'è un modo per ottenere l'uscita PWM a 16 bit come indicato dallo schema al posto di usare il timer0 di default?

Presumo di si, ma non sono espertissimo di Timers.
Aspettiamo che risponda Leo. :grin:

Contemporaneamente no, perché è il micro che mappa entrambe le uscite dei 2 canali OC0A e 0C1C su quel pin. Poi per usare il timer devi manipolare tu i registri. Guardando i file del core (e spero di non sbagliarmi, visto che sono le 6:30 ed ho dormito poco..) non vedo nessun modo per usare il canale OCR1C del timer 1 via analogWrite.