PWM ad alte frequenze

Ciao a tutti,
sto lavorando a un progettino per il quale mi servono in uscita 4 segnali PWM (con duty cycle diversi) a frequenza relativamente elevata (ca 150-200 kHz). Al momento sto usando una scheda nucleo stm32 f334r8 ma pensavo di passare ad arduino, per motivi didattici: il progettino deve essere poi ricreato da degli studenti e credo sia più utile per loro imparare ad usare un arduino, che ha una migliore documentazione ed è più facile che ri-incontrino in futuro, piuttosto che il nucleo. Purtroppo però non ho grande dimistichezza con arduino e mi risparmierebbe un sacco di tempo se qualcuno mi desse qualche indicazione su quale delle varie schede in commercio sia la più indicata per lo scopo. Mi sembra che la Clock speed sia la stessa nella maggior parte delle schede (16MHz), tranne la arduino Due, che però è troppo costosa e quindi fuori budget per il progetto, considerando che gli studenti storicamente rompono un certo numero di schede durante la realizzazione. Ci sono schede arduino con timer che consentono di raggiungere frequenze di questo tipo con una risoluzione decente?
Grazie in anticipo!

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

chiedo scusa, ho rimediato :slight_smile:

La scheda Arduino ha una frequenza di PWM standard (quella ottenuta con l'istruzione analogWrite(PIN, VALUE)); molto più bassa. Trovi qui una descrizione.

Per un approfondimento puoi leggere qui.

Ciao,
P.

>Burntpan: Considera che a seconda dei pin di PWM utilizzati su Arduino UNO, sono coinvolti Timers diversi che possono avere anche altre funzioni e quindi, cambiare la frequenza, NON sempre è fattibile ...

Timers Arduino UNO

Timer0
Usato da millis() e delay() e per il PWM sui pin 5 e 6
fast hardware pwm
(default 976.5625 Hz)
Pin 5 è anche usato per il “pulse counting”
Pin 8 è usato per il “input capture”

Timer1
Usato dalla libreria Servo e per il PWM sui pin 9 e 10. Libreria e PWM mutuamente esclusivi.
8-bit phase correct pwm mode
(default 488.28125 Hz)

Timer2
Usato per il PWM sui pin 3 e 11
8-bit phase correct pwm mode
(default 488.28125 Hz)

Come vedi, probabilmente potresti utilizzare un paio di pin in PWM (il pin 3 ed il pin 11) che usano Timer2, non utilizzato per altre cose.

Timer0 è intoccabile dato che è usato per millis(), delay(), ecc., mentre Timer1, collegato ai pin 9 e 10, potrebbe essere toccato se NON si usa la libreria Servo.

Guglielmo

Per le Nucleo stm32 c'è il core Arduino ufficiale STM, il forum di riferimento è stm32duino la cui gestione sta passando direttamente ad STM. Però è in inglese.
Non ho trovato il tuo modello di Nucleo

ma è facile aggiungere nuove schede a partire da quelle esistenti, è spiegato bene e ci sono riuscito persino io.

Ma non so se ha specifiche istruzioni per variare la frequenza del PWM

Anche programmando direttamente i registri non si riesce ad arrivare a quelle frequenze, mantenendo ovviamente una risoluzione di 8-bit. Peggio ancora con il Timer1 a 16-bit.

Io con risoluzione accettabile sono arrivato a circa 16kHz.

Per STM32 timer ne ha in abbondanza, tuttavia la documentazione di riferimento è impegnativa, pertanto io consiglio di cercare una libreria per stm32duino.

Dal codice core la analogWrite lavora 1kHz, ma è prevista la

analogWriteFrequency(uint32_t freq);

Però non ho ide se si può usare così:

analogWriteFrequency(250000);

PS: C’è anche la funzione per configurare la risoluzione.

Ciao.

Maurotec:
Anche programmando direttamente i registri non si riesce ad arrivare a quelle frequenze, mantenendo ovviamente una risoluzione di 8-bit. Peggio ancora con il Timer1 a 16-bit.

Di che MCU parli?

Perché, se non sbaglio i conti (... ma li sto verificando anche con una vecchia utility di nome "ArduCompanion") su Arduino UNO, con clock a 16MHz, se usi un timer a 16 bit, in modalità "OCRxA as TOP", di dovrebbe poter generare un PWM con frequenza 160KHz impostando il prescaler ad 1, OCRxA a 99 e variando la % del durty cycle da 1% a 99% variando OCRxB da 0 a 98 ... tutto da verificare in pratica ... ::slight_smile:

Guglielmo

1% a 99% variando OCRxB da 0 a 98 ... tutto da verificare in pratica ...

Si esatto, in Fast PWM ma la risoluzione è solo 6 bit.

RES = log(99+1)÷log(2)

Ovviamente riducendo TOP aumenta la frequenza ma diminuisce la risoluzione.

Con TOP = 70 arriva a ~225kHz

Mantenendo la risoluzione massima di 16-bit,
16000000÷(1×(1+65535)) = 244,140625 :slight_smile:

In PWM Phase Correct e Frequency and Phase Correct la frequenza scende ancora.

PS: Mi devo fare un programmino per calcolare in automatico la frequenza ecc, ma quando sono anni che lo dico.

Ciao.

Maurotec:
Si esatto, in Fast PWM ma la risoluzione è solo 6 bit.

... e lo so, ma ... non si può "volere la botte piena e la moglie ubriaca" :smiley: :smiley: :smiley:

Maurotec:
PS: Mi devo fare un programmino per calcolare in automatico la frequenza ecc, ma quando sono anni che lo dico.

Se sei su Win, prova QUESTO ...

Guglielmo

Come ho scritto anche in un altro thrad, tanto tempo fa, qualcuno ha scritto una libreria per variare la frequenza del PWM su Arduino … se ne parlava QUI e la libreria in oggetto è in allegato.

Guglielmo

P.S.: Io non l’ho mai usata, quindi … tutta da verificare.

ArduinoPWMFrequencyLibrary_v1-5.zip (13.7 KB)

Se sei su Win, prova QUESTO ...

No, niente windows, solo un PC con Fedora 29, grazie comunque.

P.S.: Io non l'ho mai usata, quindi ... tutta da verificare.

Ho dato uno sguardo al topic e ho trovato molta somiglianza con la analogWrite() si stm32duino.

Ciao.

OK, allora mi pare di capire che si conferma un po' il mio problema: arduino sarebbe più semplice e documentato (e quindi didatticamente migliore), ma non è la scheda più adatta per il progetto (anche perchè servono 2 timer diversi per l'applicazione della PWM in pratica, uno non basta).
Proverò a vedere se con la libreria arduino per stm32 si riesce a lavorare agevolmente coi timer o se a quel punto è più semplice lavorare direttamente col nucleo.
Grazie a tutti! :slight_smile:

@Maurotec,
parli del core di Roger? Perché c'è anche quello ufficiale ST che ha anche preso in carico il forum.
Ci sono anche altri core poco usati ma ognuno con le sue specificità.

Ho provato anche con CubeMX, ovviamente ci sono i timer ma non è prevista la configurazione proprio dei segnali PWM, almeno io non l'ho trovata.

Da quello che ricordo l'analogWrite nel core di Roger è a 12 bit.

@buntpan,
Il forum in questo caso è stm32duino.com, è in inglese ma ci sono coloro che mantengono i vari core esistenti per STM32.

parli del core di Roger?

Non lo so, io ho cliccato sul link che hai postato tu. :slight_smile:

Break per un QRK; Roger Roger.. :smiley:

Ciao.