Driver led meanwell LDD, ronzio in pwm (EX mod. frequenza pwm)

Ciao a tutti, ho necessità di modificare la frequenza di 4 pin PWM e portarla a circa 1khz. Ho letto un sacco di documentazione ma, sinceramente, faccio molta fatica a comprenderla!! Esiste qualche documento (o meglio un esempio da poter applicare) di facile compresione per chi come me è a digiuno di bit, registri, timer, etc......???? :cold_sweat:

Vedi se questo articolo ti chirisce le idee: www.mauroalfieri.it/elettronica/frequenza-pwm-arduino-duty-cycle.html

oppure è molto semplice usando il timer 1

#include "TimerOne.h"  //libreria

void setup()
{

  Timer1.initialize(50);     //frequenza    
  Timer1.pwm(9, 200);       //pwm su pin 9 duty 200 su 1023

}


void loop()
{

}

dove imposti la frequenza devi fare 1.000.000 (1 secondo espresso in micros)/frequenza

il risultato lo metti li e hai fatto

Prima di tutto io darei un´occhiata qui:

http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM

Facci sapere come va!
Fab.

Grazie ragazzi........ma che fatica :sweat_smile:

Quello che mi sembra di aver capito ( e da questo momento in poi sicuramente dirò molte fesserie) che:

-Ogni timer controlla 2 pin pwm, nel mio caso,ATmega1280, avrò 6 timer 8 o 16bit (in che caso utilizzare uno piuttosto che l'altro?) -Ogni timer ha due registri configurabili (uno per pin ???) -il prescaler è il divisore della frequenza di clock -se ho bisogno di una frequenza diversa da quelle configurabili con il prescaler (1khz nel mio caso) devo cambiare il duty cycle (come trovo questo valore?) del registro OCRx (che non c'entra nulla con duty cycle del pwm giusto?)

Lo so che ho fatto troppe domande ma cercate di capirmi...è la prima volta che mi "addentro" nei registri e, soprattutto, che provo a leggere il datasheet dell'atmega1280!!!!!! :sweat_smile: :sweat_smile:

acron: -Ogni timer controlla 2 pin pwm, nel mio caso,ATmega1280, avrò 6 timer 8 o 16bit (in che caso utilizzare uno piuttosto che l'altro?)

Normalmente sì.

-Ogni timer ha due registri configurabili (uno per pin ???)

No, ha una serie di registri che configurano il timer nel suo complesso, alcuni poi agiscono anche su una delle funzionalità del timer, che è il PWM. Un timer non serve solo a generare un segnale PWM.

-il prescaler è il divisore della frequenza di clock

Sì.

-se ho bisogno di una frequenza diversa da quelle configurabili con il prescaler (1khz nel mio caso) devo cambiare il duty cycle (come trovo questo valore?) del registro OCRx (che non c'entra nulla con duty cycle del pwm giusto?)

No. Frequenza e duty cycle sono 2 cose diverse. La frequenza è il numero di onde al secondo, il duty cycle è il rapporto fra la cresta alta e la cresta bassa dell'onda. Un segnale con frequenza a 1 kHz e duty cycle al 75% resterà sempre ad 1 kHz anche se metti un duty cycle al 25%. In quest'ultimo caso cambierà che avrai un segnale con un'onda che è a livello basso per 3/4 del tempo e a livello alto per il restante quarto, mentre nel primo caso avresti la situazione opposta. Per cambiare frequenza devi cambiare il valore massimo del registro contatore del timer. Lo so che ho fatto troppe domande ma cercate di capirmi...è la prima volta che mi "addentro" nei registri e, soprattutto, che provo a leggere il datasheet dell'atmega1280!!!!!! :sweat_smile: :sweat_smile:

[/quote]

Ho trovato questo codice che dovrebbe generare 1khz ma non capisco come fa con un prescaler 32 e come si ottiene il valore 125

// Set up phase correct PWM on pin OC2A (pin 11)
 pinMode(11,OUTPUT); 
TCCR2A = _BV(COM2A1) | _BV(WGM22) | _BV(WGM20); 
TCCR2B = _BV(CS21) | _BV(CS20); // prescaler = 32 
OCR2A = 125; // timer top. adjust this value to tweak the frequency

così dovrei avere anche un altro pin a 1khz e non solo il pin 11, giusto?

Niente, non ne esco…è tutto il giorno che leggo articoli e datasheet ma proprio non capisco come impostare 4pin a 1khz. :disappointed_relieved:

Mi spiegate cortesemente come viene fuori una frequenza di 1khz dal codice del mio precedente post ?magari mi chiarisce le idee …

:roll_eyes:

Si prende il datasheet, sezione timer 2, e si studiano cosa fanno le modifiche ai vari bit.

pinMode(11,OUTPUT); -> se un pin non è in output, non è agganciato al generatore di PWM TCCR2A = _BV(COM2A1) | _BV(WGM22) | _BV(WGM20); mette il pin a LOW quando il valore del registro del timer arriva a corrispondere a quello del registro OCR2 e a HIGH quano torna a zero. La modalità scelta è la Phase-Correct PWM con top fissato da OCR2A. TCCR2B = _BV(CS21) | _BV(CS20); -> prescaler a 32 (vedi tabella a pag. 158) OCR2A = 125; Valore massimo di confronto per il registro interno arrivato al quale il timer inverte lo stato del pin e parte a contare all'indietro. Per la phase-correct, si ha: Fpwm = Fsys/(Prescaler * 510)

Ma questa formula è valida se si usa tutto il registro del timer, che è ad 8 bit e quindi vale max 255. 510 = 255*2 Se noi usiamo un valore massimo diverso, la frequenza cambia. Prendendo 125, abbiamo: 16000000/((125*2)*32) => 2000 Hz Questa frequenza va divisa per 2 perché il timer, come detto, arrivato al valore di OCR2A non riparte da zero ma conta all'indietro fino a zero, quindi l'onda diventa triangolare (duty cycle al 50%) ma con frequenza dimezzata.

Ecco come arrivi a 1000 Hz

così dovrei avere anche un altro pin a 1khz e non solo il pin 11, giusto?

No, queste istruzioni attivano l'onda solo sul pin 11.

ora è tutto molto più chiaro!!
mi rimane solo un unico dubbio…per duty cycle al 50% si intende di conseguenza anche l’uscita pwm (quindi la luminosità massima di un ipotetico led è dimezzata) oppure interessa solo l’onda del timer?
grazie mille leo, davvero un’ottima spiegazione!!

Gli effetti del duty cycle dipendono dall'oggetto su cui applichi l'onda. Se certamente ci alimenti un LED colorato, lo vedrai con intensità inferiore rispetto ad un'alimentazione a 5V. Se però ci piloti un LED iR a te della luminosità poco te ne importerà ;)

Quindi se ho capito bene modificando la frequenza con il registro OCR1A settato come sopra la luminosità massima del led(che poi sarà la mia applicazione) sarà il 50% in meno rispetto al classico analogwrite(pin, 255) con frequenza di default??? :fearful: mi sono perso un'altra volta :) :)

Se usi il Phase Correct PWM con top fissato da OCR l'onda è una quadra con duty cycle al 50% perché generi un'onda triangolare ed il pin viene settato alto o basso in uno dei 2 vertici (lo scegli tu).

Leggi qui: http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM

acron:
Quindi se ho capito bene modificando la frequenza con il registro OCR1A settato come sopra la luminosità massima del led(che poi sarà la mia applicazione) sarà il 50% in meno rispetto al classico analogwrite(pin, 255) con frequenza di default??? :fearful:
mi sono perso un’altra volta :slight_smile: :slight_smile:

Io mi sono perso, invece, perché per pilotare un LED o un LED strip, tu voglia modificare la frequenza del PWM invece che il duty cycle, come si fa sempre …

C’è uno scopo particolare ???

Guglielmo

Effettivamente non sono stato molto chiaro!!!
In pratica devo controllare tramite pwm quattro driver ai quali sono collegati 12 led in serie ciascuno…tutto perfetto a parte che durante la fase di aumento/diminuzione della luminosità si senta un ronzio abbastanza fastidioso. Da qui l’idea di cambiare la frequenza.
Allego il datasheet del driver

LDD-H.pdf (234 KB)

Si sente il disturbo solo durante la variazione del duty cycle? potrebbe essere un errato metodo di variazione del duty non una frequenza troppo bassa, comunque stò in ascolto

Ok, intanto, dal datasheet allegato, si vede che quel regolatore accetta una frequenza, per il segnale di PWM, da 100 Hz a 1KHz e che quindi devi stare dentro questi limiti (... e, direi, NON proprio al limite che è meglio ;)).

Poi, per chiarezza, dai un occhiata a QUESTO link che da le frequenze di PWM dei vari pin (... che, sembrano, non essere le stesse per tutti i pin che si usano) e verifica con i pin che stai usando tu.

Infine, scelta la frequenza di PWM che vorrai provare (al fine di vedere se senti meno ronzio), comunque la regolazione della luminosità dei LED la farai cambiano il duty cycle (... e quindi non capisco bene il tuo discorso del duty cycle fisso a 50%).

Non so comunque se, anche cercando un'altra frequenza, in un range così stretto (100 Hz .. 1KHz), riesci ad eliminare il ronzio ... :roll_eyes:

Guglielmo

Se devi stare in un range di 100-1000 Hz, allora usi tranquillamente i timer 1 e 2 dell'Arduino, che sulla UNO generano un segnale sui 480 Hz. Il timer 0 invece lavora a frequenze di 978 Hz.

La cosa strana, è che se utilizzo un solo driver il ronzio è quasi impercettibile, se allo stesso pin pwm collego il secondo il ronzio aumenta.

Per quanto riguarda il duty cycle mi riferivo al fatto che per avere 1khz in modalità fase correct pwm il duty cycle doveva essere al 50% e di conseguenza pensavo che l'istruzione analogWrite(pin,255) generasse il 50% della luminosità.