Pages: 1 2 3 [4] 5   Go Down
Author Topic: PWM VELOCE  (Read 3771 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Facciamo il punto delle "certezze":
1) hai un PCB già fatto per cui non puoi modificare le piste
2) hai necessità di un PWM sul pin 2 diverso da quello che il timer 3 ti genera

Allora ho una buona notizia per te  smiley-wink
Un pin genera un segnale PWM corrispondente alle impostazioni del timer solo se lo agganci al timer stesso. Se lo lasci sganciato, è un pin normale e lo puoi usare per generare un segnale PWM usando la tecnica bit-banging via SW che ti ho illustrato io.
Quindi, se tu piloti il pin 2 via SW senza agganciare il pin al timer usando l'analogWrite, puoi generare sul pin 2 un segnale PWM con una frequenza differente (solo minore, ovviamente) rispetto a quella generata sugli altri 2 pin agganciati al timer  smiley-wink
Che ne dici?  smiley-grin
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

un'altra certezza è che i pwm sui pin 3,4,5 e 6 devono avere la stessa frequenza e di duty cycle indipendenti fra loro...
poi ci sarebbe che siccome il pwm del pin 2 può essere di frequenza molto più alta mi piacerebbe sfruttare questa cosa, però per le frequenze precise prima devo fare dei test per vedere a che frequenze taglia
nei prossimi giorni faccio dei test, poi ci risentiamo, intanto grazie mille smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scrivi e vediamo se si tira fuori qualcosa.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

allora sul pin 2 posso arrivare tranquillamente a 20KHz di frequenza con duty cycle variabile, mentre sui pin 3,4,5 e 6 avrei bisognpo di una frequenza molto bassa, sui 200Hz...
per i pin con il pwm "lento" si possono usare gli altri timer che non sono direttamente collegati ai pin indicati per fare questi pwm andando a modificare l'ISR come proponevi di fare con il timer 0?
per il pwm "veloce" invece mi basta andare a mettere le mani sui registri come mi avevi già spiegato
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nonostante siano in sequenza, i pin 2,3,4,5,6 sono agganciati a diversi timer:
timer 3: pin 2, 3, 5
timer 0: pin 4
timer 4: pin 6

Il timer 3 lo possiamo perciò impostare come vogliamo, e possiamo avere sul pin 2 i tuoi 20 kHz con duty cicle variabile.
Sui pin 3 e 5 potremmo usare la tecnica del bit-banging sul timer 3, dividendo la frequenza del timer di un fattore 100 per avere proprio 200 Hz. Avresti però lo stesso duty cicle, se non è un problema.

Il timer 0 non lo possiamo modificare altrimenti si alterano le funzioni temporali per cui il pin 4 lo dobbiamo pilotare col bit-banging, magari agganciandolo al timer 4, che pilota il pin 6.

Che ne dici?
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sul pin 2 siamo d'accordo, sugli altri se non si riesce a variare il duty cycle bisogna pensare ad una alternativa...

Curiosità, la funzione tone si basa sul timer 0, fa con la stessa tecnica?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sul pin 2 siamo d'accordo, sugli altri se non si riesce a variare il duty cycle bisogna pensare ad una alternativa...
Si può fare a livello di codice ma diventa complicato con la tecnica del bit-banging.
Si potrebbe usare un ulteriore timer non usato ed agganciare i pin 3, 4 e 5 ad esso (es. timer 2). Però tutti e 3 i pin avrebbero stessa frequenza e stesso duty cicle.

Quote
Curiosità, la funzione tone si basa sul timer 0, fa con la stessa tecnica?
No, viene fatto fare in HW, impostando il timer a seconda del tipo e della frequenza da generare. Il timer usato cambia a seconda del microcontrollore. Sull'Atmega1280/2560 viene usato il timer 2. Ma questa scelta può essere cambiata, basta modificare il file Tone.cpp del core.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ma a me servirebbe avere almeno 3 livelli di duty cycle tra cui scegliere e che i 4 canali possano essere controllati individualmente smiley-confuse
però se mettiamo il duty cycle sempre al 50%, a frequenza di circa 200Hz, si risce ad avere un controllo di quei 4 pin in modo indipendente tra loro? cioè se c'è il pwm al 50% poi anche se faccio digitalWrite il pin non resta sempre a livello alto o basso, no? è un casino...  smiley-yell
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ma a me servirebbe avere almeno 3 livelli di duty cycle tra cui scegliere e che i 4 canali possano essere controllati individualmente smiley-confuse
Non è impossibile ma si complica un po' il codice da scrivere. Ammettendo 3 livelli di duty cicle al 25/50/75% (poi c'è lo 0% che possiamo far corrispondere ad un segnale LOW fisso, ed il 100%, che possiamo far corrispondere ad un segnale HIGH fisso), si hanno un po' di switch..case o di if..else.
Tutto fattibile, ma con un po' di codice in più.

Quote
però se mettiamo il duty cycle sempre al 50%, a frequenza di circa 200Hz, si risce ad avere un controllo di quei 4 pin in modo indipendente tra loro?
Beh, cerchiamo di accendere/spengere il PWM sui pin indicati in modo indipendente.
Si può creare una funzione activatePwm(pin, dutyCicle) che attivi il PWM software sul pin indicato col duty cicle indicato.
Tutto si può fare, va vista la complessità del resto del codice per capire le risorse a disposizione e se c'è qualcosa che va in conflitto con qualcos'altro.
Allo stato attuale, per far ciò che ti ho detto, serve avere libero accesso ad almeno 3 timer: t2, T3 e t4.

Quote
cioè se c'è il pwm al 50% poi anche se faccio digitalWrite il pin non resta sempre a livello alto o basso, no? è un casino...  smiley-yell
Il finto PWM surclasserebbe il digitalWrite. Cioè se attivi un PWM al 25% su un pin, e poi su quello stesso pin ci fai un digitalWrite, il segnale imposto col digitalWrite dura fino al successivo richiamo dell'interrupt del timer che controlla quel pin. Poi il codice nella ISR reimposterebbe il pin secondo le sue impostazioni, quindi il digitalWrite se ne va. Va prima disattivato il segnale PWM software e poi si può riutilizzare il pin col digitalWrite.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

per semplificare ulteriormente a me andrebbe bene anche solo 0% 50% e 100%,  basta che siano indipendenti tra loro... smiley
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

per semplificare ulteriormente a me andrebbe bene anche solo 0% 50% e 100%,  basta che siano indipendenti tra loro... smiley
OK.
Allora, riassumiamo cosa vuoi e su quali pin:
pin 2: 20 KHz
pin 3, 4, 5, 6: 200 Hz

Duty cicle (ogni pin indipendente):
0-50-100%

Timer che utilizzerò: 3 (forse anche il 4)

OK? Se va bene, domani inizio a scrivere qualcosa.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si, e sul pin 2 a 256 livelli impostabili
grazie infinite per l'aiuto e scusa per il disturbo, fai pure con calma che non ho fretta smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si, e sul pin 2 a 256 livelli impostabili
Sì, ovvio. Essendo un pin pilotato direttamente dal timer, puoi avere i 256 livelli ddi duty cicle possibili.

Quote
grazie infinite per l'aiuto e scusa per il disturbo, fai pure con calma che non ho fretta smiley-wink
OK.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 952
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie mille! smiley-wink
ormai mi sento in debito con te per tutte le volte che mi hai aiutato smiley-sweat
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21625
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie mille! smiley-wink
ormai mi sento in debito con te per tutte le volte che mi hai aiutato smiley-sweat
Avrai modo di sdebitarti  smiley-twist
Vorrei costruire il mio primo robottino per cui, avendo bisogno di un esperto in robot, ti romperò i maroni io, tra un pò  smiley-wink
Anzi, appena pronta vorrei sottoporti la "lista della spesa" per consigli, suggerimenti e critiche  smiley-razz smiley-razz
Logged


Pages: 1 2 3 [4] 5   Go Up
Jump to: