Cosa rende diversi i pin digitali PWM dagli altri ?

Mi riferisco a questo schema, che fa parte dell'esempio su come far lampeggiare un led.

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 ?

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) .

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

realtebo:
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.

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.

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 ?!

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.

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.

nid69ita:
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.

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!!!

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" ?

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.

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

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.

nid69ita:
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.

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 .: robotitaly.NET :. - la community italiana sulla robotica è un topic in un altro forum al quale risponde un certo astrobeed - :slight_smile: :slight_smile: :slight_smile:

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

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.

Ottimo link e chiara l'esposizione. Grazie.

uwefed:
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 ??

@nid69ita:
I pin PWM agganciati al timer 0 (D5 e D6) generano un segnale con una frequenza di circa 976 Hz mentre gli altri a 490 Hz.
La scelta di questi valori non è casuale. Il timer 0, come detto, è usato anche per le funzioni temporali dell'Arduino.
I timer hanno un circuito di prescaler all'ingresso del clock, che dividono la frequenza di sistema mediante valori predefiniti. Siccome il clock di sistema è impostato a 16 MHz, usando un divisore di /64 si ha il segnale di 976 Hz senza modifiche ulteriori ai registri del timer stesso. 976 Hz vuol dire 976 "colpi" al secondo. Mediante una piccola correzione manuale (non entro nei dettagli) si arriva ad avere un "colpo" lungo 1 millisecondo (invece di 0,976 ms) grazie al quale si può gestire millis e delay, che operano con i millisecondi.

Inoltre i timer 1 e 2 dell'Atmega328 sono impostati per operare in modalità Phase Correct PWM mentre il timer 0 in modalità Fast PWM. La prima genera un'onda triangolare mentre la seconda un'onda a dente di sega.