PWM taaaanto

Problema curioso, devo generare 32 pwm diversi da un unico micro, qualche idea? la F deve essere attorno ai due Khz ciao

Reply to
Rusty
Loading thread data ...

"Rusty" ha scritto nel messaggio news:OdtPm.99842$ snipped-for-privacy@twister1.libero.it...

Intendi 32 uscite distinte PWM o 32 tipi diversi di duty-cycle sullo stesso pin, giorgio

Reply to
Giorgio Padoan

Rusty:

La F è la stessa per tutti e cambi solo il duty cycle?

Reply to
F. Bertolazzi

Ci sono degli integrati specializzati per questi lavori (tipicamente per illuminazioni a led, credo), ma non chiedermi sigle :-) Se non sbaglio lavorano su I2C, dove gli passi il duty-cycle per ogni uscita.

P.

Reply to
Pasu

"Giorgio Padoan" ha scritto nel messaggio news:4b0e71d2$0$648$ snipped-for-privacy@reader4.news.tin.it...

La prima che hai detto:-) Intanto ho trovato il PCA9685 che potrebbe fare al caso mio, lo stò studiando:-)) ciao

Reply to
Rusty

"F. Bertolazzi" ha scritto nel messaggio news: snipped-for-privacy@40tude.net...

Almeno quello:-)) Cmq come ho sgritto a giorgio stò valutando un chip NXP il PCA9685! ciao

Reply to
Rusty

Infatti l'ho trovato:-)) vedi risposte precedenti! ciao

Reply to
Rusty

Piccio:

Glielo volevo chiedere, ma, evidentemente 4096 gli bastano. Con un AVR che butti sui port il contenuto della RAM aggiornato da un task che gira a inizio ciclo n'ia fai. Manco con degli addressable latch o degli shift reg.

Per frequenze maggiori avrei fatto con gli eredi degli address comparator TTL, ma, per 2 kHz...

Reply to
F. Bertolazzi

Di che risoluzione pwm (bit) hai bisogno? se non =E8 un numero eccessivamente grande (>=3D10bit) portesti fare il tutto con un micro a tua scelta... Ciao!

Reply to
Hexfet13

Un bel giorno Rusty digitò:

Sì, però buona fortuna a trovarlo...

Invece una CPLD la trovi ovunque. Probabilmente con una XC9536XL non ce la fai, ma una XC9572XL dovrebbe già bastare (TBC :-)).

--
emboliaschizoide.splinder.com
Reply to
dalai lamah

che

k

li

Con grande ma sapiente utilizzo di RAM e 32 o 64 livelli credo sia possibile. Il problema =E8 fare in modo che gli aggiornamenti siano veloci, ovvero, dal comando all'esecuzione il tempo necessario potrebbe rivelarsi inadeguato.

Piccio.

Reply to
Piccio

Piccio:

Col processore a 20 MHz ed un paio di condizioni favorevoli, io mi giocherei 9 bit puliti puliti.

(Due cicli da RAM a registro, uno da registro a port) * 4 e due di loop (opzionali, si può anche "svolgere" il loop)= 14 (12) cicli per livello.

20M / 2 K / 14 = 714 step, che potrebbero anche essere 833

Difatti, sta tutto nel vedere quanto è il duty cycle minimo (o il massimo) ed in che formato arrivano i dati: se hai, all'inizio di ogni ciclo, il tempo per aggiornare la RAM, je la fai, altrimenti t'attacchi.

Come sempre c'ha raggione il dalai lamah...

Reply to
F. Bertolazzi

F. Bertolazzi ha scritto:

un banale pic che gira a 40mhz non riesce a gestire 32 pwm a frequenza fissa? per me si...

-ice-

Reply to
ice

lo.

Con 8 canali PWM a frequenza fissa ed un impiego di RAM pari al numero di livelli, ho contato 10 istruzioni ogni timer-interrupt (AVR) per il refresh periodico. Il costo =E8 di utilizzare un registro indice + 3 registri generici in modo dedicato, includendo il salvataggio dello SREG (Status Register).

Ogni 8 canali devo aggiungre 4 istruzioni e dedicare altri 2 registri.

Piccio.

Reply to
Piccio

Piccio:

Timer interrupt? Anatema! Non ce le farai mai. Per andare veloci bisogna fare una cosa assolutamente sincrona. Il timer ti serve solo per compensare la durata del main task: alla fine del calcolo ed aggiornamento RAM ti inlooppi a controllare che lo slot del main task sia finito. Ma questo lo puoi fare solo se hai un duty cycle minimo > 0 (o un massimo < 100%), dato che, quando aggiorni i port, non puoi fare assolutamente nient'altro. O forse no. Se fai l'aggiornamento della RAM mente la leggi e la spari sugli output...

Mi sono venute in mente due posssibli soluzioni reali, su macchine che però non conosco: un contoller ARM, che, essendo a 32 bit, dovrebbe poter aggirnare tutte le uscite con due istruzioni (memoria->registri e registri->output) oppure un Xmega che ha la funzione di DMA tra RAM e I/O.

Lo Xmega ha 8 timer a 16 bit, 4 dei quali hanno 4 registri di compare (=4 canali PWM) e 4 solo due. Purtroppo 4*4+4*2 = 24, non 32.

Insomma, mi sa che c'ha sempre ragione il dalai lamah.

Reply to
F. Bertolazzi

On Nov 28, 2:23=A0pm, ice wrote: [..]

Supponiamo di avere un pic 18f4550 reperibile ovunque e che pu=F2 girare a 48MHz. La frequenza interna =E8 di Fosc/4=3D 48MHz/4 =3D12MHz Con questa frequenza devo generare un segnale di 2KHz, e supponendo di realizzare un pwm con 10bit di risoluzione la rampa ha 1024 gradini quindi:

2KHz x 1024 =3D 2.048 MHz sicch=E8 avrei a disposizione solo 6 cicli macchina per scrivere il programma(12MHz/2.048 MHz c.a.=3D6 ).

Se invece si accontentasse di una risoluzione + bassa allora per ogni bit in meno raddoppi le istruzioni disponibili sicch=E8 se dal 10bit passi a 8bit(per fare i confronti sarebbe anche meglio un 8bit dato che i registri sono a 8) hai a disposizione 6x4=3D24 istruzioni che ancora non bastano per fare 32 confronti e attivare 32 uscite. Praticamente ho appena smentito il mio intervento(daltronde non avevo fatto conti)......quindi correggo al ribasso: se SI accontenta di un pwm con 5 bit di risoluzione non dovrebbe avere problemi a farlo con un pic. Perdonate la castroneria precedentemente scritta.....

Reply to
Hexfet13

A dire il vero un modo ci sarebbe per evitare interrupt cos=EC frequenti. E' complicato ma corretto e non richiede neanche tanta RAM, forse meno di 128 bytes. L'unico "inconveniente" =E8 che produrrebbe un PWM regolare solo nel valor medio, idoneo se pilota lampadine o filtri RC per produrre una tensione. Inidoneo, credo, per motori cc e/o induttori per DC/DC converter.

Piccio.

Reply to
Piccio

Anche io ero giunto alla stessa conclusione. Io proverei a ordinare le uscite per durata di on (o di off, è lo stesso, ovviamente) e quindi programmare i registri con i delta t. L'aggiornamento è una traggedia, ma se non deve essere fatto frequentemente...

Beh ma non credo sia un grosso problema se le uscite non sono in fase, anzi, potresti ridurre i Picci di corrente sull'alimentazione se distribuisci gli on e gli off...

P.

Reply to
Pasu

cut...

GHHH!!!

Lasciate che vi illustri la mia boiata:

Il periodo di 500us =E8 imposto dalla frequenza di refresh di 2 KHz. PORTA, .., PORTC sono gli out dei PWM, 8 canali per porta (ispirato agli AVR) Il numero in mezzo ai diagrammi rappresenta il peso (bit) degli 8 contatori relativi ad ogni porta. Ad esempio, PORTA(6) indica la presenza di tutti i bit 6 dei contatori PWM 0..7. In ascisse troviamo 16 suddivisioni temporali di 31.25 us, ovvero, il periodo del timer interrupt per il refresh. Il principio di funzionamento =E8 molto semplice: ogni bit deve essere presente sull'uscita per un tempo pari al suo peso. Il bit 7 dovr=E0 pesare, quindi, per il 50% del tempo, il bit 6 per un

25% e cos=EC via. Mentre i pesi alti (7,6,5,4) sono facilmente gestibili perch=E9 variano in tempi lunghi, i pesi pi=F9 bassi non lo sono e si rende necessaria una gestione real-time ottenibile con mappature e ritardi precisi calcolati anche in termini di tempo di esecuzione delle singole istruzioni. In pratica l'impegno totale della CPU =E8 richiesto solo in questa fase.

Scusate il disegno approssimato, non ho avuto il tempo...

[FIDOCAD] TY 103 58 5 3 0 0 0 * 6 LI 95 60 96 55 LI 114 55 115 60 LI 115 60 114 65 LI 96 65 95 60 LI 96 55 114 55 LI 114 65 96 65 LI 55 60 56 55 LI 56 65 55 60 LI 94 55 95 60 LI 95 60 94 65 LI 56 55 94 55 LI 94 65 56 65 LI 115 60 116 55 LI 116 65 115 60 LI 124 55 125 60 LI 125 60 124 65 LI 116 55 124 55 LI 124 65 116 65 TY 119 58 5 3 0 0 0 * 5 LI 126 65 125 60 LI 125 60 126 55 LI 129 55 130 60 LI 130 60 129 65 LI 126 55 129 55 LI 126 65 129 65 TY 126 58 5 3 0 0 0 * 4 LI 130 60 131 55 LI 134 55 135 60 LI 135 60 134 65 LI 131 55 134 55 LI 131 65 130 60 LI 131 65 134 65 MC 133 49 1 0 074 TY 122 44 5 3 0 0 0 * 3,2,1,0 TY 38 57 5 3 0 0 0 * PORTA TY 123 88 5 3 0 0 0 * 6 LI 115 90 116 85 LI 134 85 135 90 LI 135 90 134 95 LI 116 95 115 90 LI 116 85 134 85 LI 134 95 116 95 LI 75 90 76 85 LI 76 95 75 90 LI 114 85 115 90 LI 115 90 114 95 LI 76 85 114 85 LI 114 95 76 95 TY 93 88 5 3 0 0 0 * 7 LI 95 120 96 115 LI 96 125 95 120 LI 134 115 135 120 LI 135 120 134 125 LI 96 115 134 115 LI 134 125 96 125 TY 113 118 5 3 0 0 0 * 7 LI 115 150 116 145 LI 116 155 115 150 TY 38 87 5 3 0 0 0 * PORTB TY 38 117 5 3 0 0 0 * PORTC TY 38 148 5 3 0 0 0 * PORTD LI 64 85 65 90 LI 65 90 64 95 LI 56 85 64 85 LI 64 95 56 95 TY 59 88 5 3 0 0 0 * 5 LI 66 95 65 90 LI 65 90 66 85 LI 69 85 70 90 LI 70 90 69 95 LI 66 85 69 85 LI 66 95 69 95 TY 66 88 5 3 0 0 0 * 4 LI 70 90 71 85 LI 74 85 75 90 LI 75 90 74 95 LI 71 85 74 85 LI 71 95 70 90 LI 71 95 74 95 LI 55 90 56 85 LI 56 95 55 90 TY 63 118 5 3 0 0 0 * 6 LI 55 120 56 115 LI 74 115 75 120 LI 75 120 74 125 LI 56 125 55 120 LI 56 115 74 115 LI 74 125 56 125 LI 75 120 76 115 LI 76 125 75 120 LI 84 115 85 120 LI 85 120 84 125 LI 76 115 84 115 LI 84 125 76 125 TY 79 118 5 3 0 0 0 * 5 LI 86 125 85 120 LI 85 120 86 115 LI 89 115 90 120 LI 90 120 89 125 LI 86 115 89 115 LI 86 125 89 125 TY 86 118 5 3 0 0 0 * 4 LI 90 120 91 115 LI 94 115 95 120 LI 95 120 94 125 LI 91 115 94 115 LI 91 125 90 120 LI 91 125 94 125 TY 83 148 5 3 0 0 0 * 6 LI 75 150 76 145 LI 94 145 95 150 LI 95 150 94 155 LI 76 155 75 150 LI 76 145 94 145 LI 94 155 76 155 LI 74 145 75 150 LI 75 150 74 155 LI 95 150 96 145 LI 96 155 95 150 LI 104 145 105 150 LI 105 150 104 155 LI 96 145 104 145 LI 104 155 96 155 TY 99 148 5 3 0 0 0 * 5 LI 106 155 105 150 LI 105 150 106 145 LI 109 145 110 150 LI 110 150 109 155 LI 106 145 109 145 LI 106 155 109 155 TY 106 148 5 3 0 0 0 * 4 LI 110 150 111 145 LI 114 145 115 150 LI 115 150 114 155 LI 111 145 114 145 LI 111 155 110 150 LI 111 155 114 155 LI 74 145 55 145 LI 74 155 55 155 LI 116 145 135 145 LI 135 155 116 155 TY 57 148 5 3 0 0 0 * 7 TY 131 148 5 3 0 0 0 * 7 MC 73 79 1 0 074 TY 62 74 5 3 0 0 0 * 3,2,1,0 MC 93 109 1 0 074 TY 82 104 5 3 0 0 0 * 3,2,1,0 MC 113 139 1 0 074 TY 102 134 5 3 0 0 0 * 3,2,1,0 LI 135 170 135 40 MC 55 45 3 0 074 TY 50 34 5 3 0 0 0 * 0us TY 127 34 5 3 0 0 0 * 500us TY 170 55 5 3 0 0 0 * t0 =3D> A B C TY 170 60 5 3 0 0 0 * t2,3 =3D> B TY 170 65 5 3 0 0 0 * t4 =3D> B C D TY 170 70 5 3 0 0 0 * t6,7 =3D> C TY 170 75 5 3 0 0 0 * t8 =3D> C D A TY 170 80 5 3 0 0 0 * t10,11 =3D> D TY 170 85 5 3 0 0 0 * t12 =3D> D A B TY 170 90 5 3 0 0 0 * t14,15 =3D> A LI 95 70 95 40 TY 86 34 5 3 0 0 0 * 250us TY 66 34 5 3 0 0 0 * 125us LI 75 99 75 40 TY 71 58 5 3 0 0 0 * 7 TY 150 110 5 3 0 0 0 * I bit 7,6,5,4 sono aggiornati leggendo TY 150 115 5 3 0 0 0 * direttamente i contatori TY 150 125 5 3 0 0 0 * I bit 3,2,1,0 sono aggiornati tramite TY 150 130 5 3 0 0 0 * una mappatura in RAM (16 byte per canale) TY 170 40 5 3 0 0 0 * PORTC: PWM(16..23) TY 170 45 5 3 0 0 0 * PORTD: PWM(24..31) TY 170 35 5 3 0 0 0 * PORTB: PWM(8..15) TY 170 30 5 3 0 0 0 * PORTA: PWM(0..7) MC 150 170 0 0 074 LI 50 170 150 170 LI 60 170 60 173 LI 65 170 65 173 LI 70 170 70 173 LI 80 170 80 173 LI 85 170 85 173 LI 90 170 90 173 LI 100 170 100 173 LI 105 170 105 173 LI 110 170 110 173 LI 120 170 120 173 LI 125 170 125 173 LI 130 170 130 173 LI 95 170 95 175 LI 75 170 75 175 LI 115 170 115 175 TY 54 175 3 2 0 0 0 * 0 TY 59 175 3 2 0 0 0 * 1 TY 64 175 3 2 0 0 0 * 2 TY 69 175 3 2 0 0 0 * 3 TY 74 175 3 2 0 0 0 * 4 TY 79 175 3 2 0 0 0 * 5 TY 84 175 3 2 0 0 0 * 6 TY 89 175 3 2 0 0 0 * 7 TY 94 175 3 2 0 0 0 * 8 TY 99 175 3 2 0 0 0 * 9 TY 103 175 3 2 0 0 0 * 10 TY 108 175 3 2 0 0 0 * 11 TY 113 175 3 2 0 0 0 * 12 TY 118 175 3 2 0 0 0 * 13 TY 123 175 3 2 0 0 0 * 14 TY 128 175 3 2 0 0 0 * 15 TY 133 175 3 2 0 0 0 * 16 LI 55 45 55 175 RP 70 165 75 170 RP 110 165 115 170 RP 130 165 135 170 RP 90 165 95 170 RP 55 165 57 170 RP 65 165 67 170 RP 85 165 87 170 RP 105 165 107 170 RP 125 165 127 170 RP 75 165 77 170 RP 95 165 97 170 RP 115 165 117 170 TY 20 165 5 3 0 0 0 * Impegno CPU TY 70 15 5 3 0 0 0 * PWM 256 livelli

Piccio.

Reply to
Piccio

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.