Go Down

Topic: Cosa rende diversi i pin digitali PWM dagli altri ? (Read 2026 times) previous topic - next topic

realtebo

Feb 18, 2013, 08:24 pm Last Edit: Feb 18, 2013, 08:26 pm by realtebo Reason: 1
Mi riferisco a questo schema, che fa parte dell'esempio su come far lampeggiare un led.

http://arduino.cc/en/uploads/Tutorial/ExampleCircuit_sch.png

I pin digitali 3,5,6,9,10,e 11 riportano scritto PWM (e sul circuito stampato reale dell'UNO Rev.3 c'è disegnato una tilde in corrispondenza di questi pin).

Ho letto il tutorial sui pin digitali, e sugli analogici che simulano il pwm, ma non capisco in che modo questi 6 pin digitali differiscano dagli altri digitali.

Ovvviamente, escludendo il 13, che ha il led hardware attaccato, e l'1 e il 2 dedicati al TX/RX seriale.

Cosa c'è che li rende speciali rispetto, quindi, al 4,7,8 e 12 ?



nid69ita

http://www.maffucci.it/2011/11/29/arduino-lezione-06-modulazione-di-larghezza-di-impulso-pwm/

Spiegato bene.
Ad esempio nei motorini elettrici della Lego, la maggiore o minore velocità viene data NON aumentando i volts o gli ampere, ma aumentando il segnale ad impulsi pwm (che è un'onda quadra da 0 a 5V) .
my name is IGOR, not AIGOR

uwefed

PWM (Puls Width Modualtion) modulazione a larghezza di impulso.
Un segnale PWM é un onda quadra dove varia il rapporto tra tempo HIGH e tempo LOW. Avendo tempi diversi di HIGH la tensione media risultate varia. Si possono regolare certi utenze in modo semplice e senza grossa dissipazione di calore nel elemento del regolatore perché questo accende e spegne l' utenza in intervalli regolari e non abbassa la corrente /tensione perché aumenta la propria resistenza (transistore nella paret proporzionale del pilotaggio. Utenza come lampade a incandescenza, motori DC, LED, riscaldamento ecc possono esser regolati in modo lineare.

Questi 6 Pin hanno questa funzione PWM implementata via Hardware tramite i 3 Timer del ATmega. Visto che é un implementazione HW non serve nessuna programmazione continua ma solo un setaggio iniziale (automatico fatto dallo IDE) e la programmazione del valore di PWM tramite analogWrite(pin, valorePWM) . La frequenza di ripetizione della onda quadra é nel Arduino normalmente di 490 Hz. Puó essere modificata.

Ciao Uwe

leo72


Ho letto il tutorial sui pin digitali, e sugli analogici che simulano il pwm, ma non capisco in che modo questi 6 pin digitali differiscano dagli altri digitali.

Ogni pin ha più di una funzione, a seconda delle periferiche che sono attaccate al pin stesso.
I pin PWM sono agganciati a delle periferiche interne che, come si ti hanno indicato, sono dette "timer". Questi timer sono in grado di incrementare un contatore interno. Al raggiungimento di un determinato valore i timer possono invertire lo stato elettrico del pin, generando il segnale PWM.
Altri pin con più di una funzione usati sull'Arduino UNO sono ad esempio A4 e A5, su cui è mappato il bus I2C.

Quote

Ovvviamente, escludendo il 13, che ha il led hardware attaccato, e l'1 e il 2 dedicati al TX/RX seriale.

Un'altra coppia speciale di pin quella composta dai pin 0 e 1 (NON 1 e 2, a meno che tu non ti voglia riferire ai piedini fisici del microcontrollore, ma parlando di Arduino si parla sempre dei pin presenti sugli header), su cui è mappata la seriale hardware.

realtebo

Come sempre GRAZIE a tutti.

Cos'è il "PWM" me lo ricordavo bene. Se non dico una stupidata, è il principio su cui si basano gli esempi che 'sfumano' l'intensità del led, variando i periodi di HIGH e di LOW sul pin digitale a cui il led è collegato, o mi sbaglio ?

Però, portate pazienza, in senso pratico, in che modo i pin "pwm" sono diversi dagli altri ?
Cioè: che cosa NON posso fare usando un pin digitale "normale" ma posso farlo solo usando quelli PWM ?
C'è qualcosa che rendere l'istruzione digitalWrite 'diversa' a seconda del pin usato ? (sempre eslcusi tx,rx e led-13)

Ho capito che questi pin hanno un modulatore PWM dietro (perdonatemi i termini poco tecnici per ora), ma il pin, non si comando comunque sempre e solo a 0 e 1 ?!

nid69ita

#5
Feb 19, 2013, 09:00 am Last Edit: Feb 19, 2013, 09:42 am by nid69ita Reason: 1
Beh sempre a 0 o 1 (0 - 5V). Ma se non è PWM tu lo metti a 0 o 1 e rimane fermo a quel valore.
Con PWM tu non poni a 0 o 1 ma decidi la frequenza dell'onda quadra. Poi è il microcontroller a generare la sequenza giusta di 0-1 alla velocità richiesta.
http://arduino.cc/en/Tutorial/PWM
Come dicevo sopra i motorini dei lego PF, mindstorm o dei treni sono pilotati in PWM. Mi sembra di aver letto che ora anche i trenini elettrici in scala usano PWM.
Non gli dai + o - corrente per farli andare + veloci ma aumenti la frequenza dell'onda quadra per accelerare.
my name is IGOR, not AIGOR

astrobeed


Non gli dai + o - corrente per farli andare + veloci ma aumenti la frequenza dell'onda quadra per accelerare.


In realtà con il PWM vari la tensione vista dal motore ai suoi capi per effetto dell'induttanza e di conseguenza la sua velocità, il PWM normalmente ha frequenza fissa, chiamata carrier, si varia il rapporto tra periodo low e periodo high, il duty cycle.

nid69ita

#7
Feb 19, 2013, 09:40 am Last Edit: Feb 19, 2013, 09:48 am by nid69ita Reason: 1
scusa l'imprecisione.
Mi spieghi la differenza?
Ma se cambi il tempo per cui rimane a 1 rispetto a 0, non si può comunque parlare di frequenza?
Cosa si intende per frequenza del pwm fissa? non è una corrente alternata o un suono.
Sono confuso (sono un programmatore, mi trovo + mio agio con istruzioni che con elettricità!)

EDIT: mi son risposto da solo. Basta leggere meglio il tutorial!!!
http://arduino.cc/en/Tutorial/PWM
terzo periodo subito prima dei grafici.

Però ora mi sorge la domanda:
>>Arduino's PWM frequency at about 500Hz, the green lines would measure 2 milliseconds each
perchè proprio 500Hz? C'e' una ragione di hardware o qualche motivazione "elettronica" ?

my name is IGOR, not AIGOR

vittorio68

come ti spiegava astrobeed nel PWM quello che cambia è il duty cycle mentre la frequenza rimane fissa.

L'onda quadra del PWM rimane per un certo periodo di tempo P1 a 1 e per un periodo di tempo P0 (tipicamente diverso...) a 0. La somma di questi due tempi rappresenta il periodo P = P1 + P0 del segnale e quindi la frequenza F sarà uguale a 1/P.

La frequenza del PWM è fissa perchè P è fisso. Quindi P1 e P0 non possono variare arbitrariamente ma sempre in modo che P = P1 + P0 (quindi P1 = P - P0 o viceversa P0 = P - P1).

Spero di aver contribuito a fare chiarezza invece di confondere maggiormente le idee.


nid69ita

#9
Feb 19, 2013, 10:04 am Last Edit: Feb 19, 2013, 10:17 am by nid69ita Reason: 1
Leggendo il tutorial e anche dalla tua spiegazione è tutto chiaro.
Solo che ora mi chiedo se quel tempo P viene scelto per motivi di hardware (il componente che genera il pwm ha certe capacità) oppure se è un discorso che coinvolge l'elettronica e come sono fatti i motorini elettrici.
Uso anche i lego mindstorm: anche loro usano il pwm ma mi sembra che la frequenza sia diversa da quella usata da Arduino
http://www.youtube.com/watch?v=6RttvmTGm74
nel video uno prova con oscilloscopio. Quancuno sa leggerlo?  leggo 250 microsecondi?
Su un altro sito affermano 128microsecondi 7800Hz. Questi motori vanno a 3.3V e utilizzano anche loro I2Cbus. Trovo perciò molte analogie tra i lego mindstorm e pilotare motorini in pwm con Arduino. Ma mi sembra ci sia differenza sulle frequenze scelte.
my name is IGOR, not AIGOR

astrobeed


Solo che ora mi chiedo se quel tempo P viene scelto per motivi di hardware (il componente che genera il pwm ha certe capacità) oppure se è un discorso che coinvolge l'elettronica e come sono fatti i motorini elettrici.


La frequenza del PWM deve essere scelta in modo opportuno in base al tipo di device da controllare.
Su Arduino vale circa 490 Hz perché dipende da i vari setup dei timer, in particolare il timer 0 per la millis, però è possibile modificarla a proprio piacere sul timer 1 e 2 compatibilmente con le funzionalità software in uso, alcune funzioni/shield richiedono l'uso parziale/esclusivo di uno, o più timer, e di conseguenza non è possibile utilizzare i pwm su certi pin.
In linea generale 490 Hz vanno bene per controllare la luminosità di un led o ottenere una tensione continua, tramite un filtro passa basso, se basta una banda compresa tra 4 e 10 Hz, 490 Hz sono pochi per l'uso controllo motori con un ponte H.

vittorio68

francamente non conosco la risposta alla tua domanda che però mi incuriosiva... ho cercato quindi "frequenza PWM" su google. Trovi molti risultati.

Il primo di questi http://www.robot-italy.net/roboforum/showthread.php?t=186 è un topic in un altro forum al quale risponde un certo astrobeed - :)  :)  :)

Penso possiamo evitargli di ripetere la spiegazione anche qui... mi pare davvero chiara.

vittorio68

acc... non ho fatto in tempo... è arrivato prima... consiglio però di leggere comunque anche l'altra risposta, c'erano ulteriori dettagli.

OT - ma non avrei dovuto ricevere un warning che mi indicava che il thread era stato modificato durante la mia risposta? In un'altra occasione lo avevo visto.

nid69ita

my name is IGOR, not AIGOR

realtebo


Questi 6 Pin hanno questa funzione PWM implementata via Hardware tramite i 3 Timer del ATmega. Visto che é un implementazione HW non serve nessuna programmazione continua ma solo un setaggio iniziale (automatico fatto dallo IDE) e la programmazione del valore di PWM tramite analogWrite(pin, valorePWM) . La frequenza di ripetizione della onda quadra é nel Arduino normalmente di 490 Hz. Puó essere modificata.

Ciao Uwe


Forse ho capito:

i pin PWM si possono comandare usando analogWrite ed il valore viene convertito in un duty cycle fatto di high e low proporzionali in automatico dall'arduino ??

Go Up