Hacking dei pin di un microcontrollore

I moderni microcontrollori (MCU) hanno molte funzionalità racchiuse in un unico circuito integrato. Ma a volte è necessaria una funzione in più rispetto a quella del dispositivo. Si potrebbe avere un semplice MCU a 8 bit che manca dell’uscita di modulazione della larghezza di impulso (PWM) e scoprire di aver bisogno di quella funzionalità. O forse si ha bisogno di un interrupt in più rispetto a quelli forniti dal dispositivo sui pin disponibili. È possibile che il progettista abbia un design esistente e non desideri riprogettarlo con un dispositivo diverso solo per ottenere alcune semplici funzionalità. In alcuni casi, si possono utilizzare le periferiche per fare cose per le quali non erano originariamente destinate. Nel seguito si riporta un esempio di implementazione di una PWM su UART.

UART PER PWM

La maggior parte degli MCU ha uno o più UART incorporati. Di solito, i pin UART possono essere utilizzati come pin I/O (GPIO) per uso generale. Ma cosa succede se si ha bisogno di un’uscita PWM invece di un pin GPIO? A quanto pare, un UART può essere utilizzato per un’uscita PWM a bassa risoluzione.

Uscita asincrona (UART): la Figura 1 mostra la forma d’onda asincrona per un’uscita UART. Un segnale asincrono da un UART non trasmette un clock con il segnale. Invece, il trasmettitore e il ricevitore utilizzano la stessa velocità in bit fissa e la trasmissione è inquadrata da bit di stop e start. Il segnale asincrono inizia nello stato alto quando non viene trasmesso nulla. Quando un byte viene scritto nell’UART, viene trasmesso un bit di inizio pari a 0, seguito dagli 8 bit del byte e quindi un bit di stop pari a 1 riporta l’uscita dell’UART al suo stato di riposo originale. Un secondo byte può essere scritto nell’UART durante la trasmissione del primo byte e trasmetterà immediatamente dopo il primo bit di stop. Gli UART inviano per primo il bit meno significativo, quindi se si invia un byte di 0x01, l’1 seguirà il bit di inizio.

Figura 1: Temporizzazione seriale asincrona. Il byte trasmesso è 0x43, binario 01000011

La maggior parte delle MCU consente di programmare 5, 6, 7 o 8 bit di dati e 1 o 2 bit di stop. È inoltre possibile programmare il baud rate, ovvero la distanza tra i singoli bit. Si noti che il baud rate e il bit rate di trasferimento dati non sono gli stessi. L’invio di un byte richiede 8 bit di dati, un bit di inizio e almeno un bit di stop. Quindi, sono necessari un minimo di 10 bit (o baud) periodi per inviare 8 bit di dati.

Le velocità di trasmissione tipiche sono comprese tra 9600 (104 µs per bit) e 115200 (8,7 µs per bit). Sebbene una word possa essere lunga da 5 a 8 bit, per questa soluzione si utilizzeranno word a 8 bit. Inoltre, la maggior parte degli UART può essere configurata per inviare un bit di parità. Sarà ignorato anche quello.

Generazione PWM: se si invia uno zero all’UART, si ottiene la forma d’onda mostrata nella Figura 2. Si tratta di 9 bit di zero (il bit di inizio seguito da 8 bit di zero), seguito dal bit di stop, che è 1. Se il baud rate è 9600 si ha un periodo basso di 937µs, seguito da un periodo alto di 104µs. Ciò corrisponde a un tempo basso del 90% della forma d’onda totale a 10 bit e un tempo alto del 10%.

Figura 2: Trasmissione asincrona del byte 00. Solo il bit di stop è alto.

Se si imposta il bit più significativo del byte trasmesso su 1, si ottiene la forma d’onda mostrata nella Figura 3. Ciò si traduce in 8 bit zero (bit di inizio più 7 bit di dati) seguiti da due bit di 1 (1 bit di dati più il bit di stop). Il periodo basso è ora l’80% della forma d’onda totale.

Figura 3: Trasmissione asincrona del byte 0x80. Il bit di stop e il bit più significativo del byte sono alti.

Allo stesso modo, si possono inviare i valori mostrati nella Tabella 1 per ottenere i cicli di lavoro corrispondenti (dove zero è “on”), ottenendo un’uscita a frequenza fissa con il periodo totale sempre uguale a periodi di 10 bit. Con i byte considerati si può codificare ul ciclo di lavoro PWM che varia dal 10% al 90%. È possibile estendere l’intervallo da 0% a 90% interrompendo le trasmissioni, infatti se non viene scritto nulla nell’UART, l’uscita rimarrà nello stato inattivo, che è alto.

Tabella 1: Per altri esempi di come implementare una modulazione PWM su altre periferiche ed approfondimenti sulle possibili applicazioni e limitazioni consultare l’articolo originale: https://circuitcellar.com/research-design-hub/design-solutions/hacking-mcu-pins/
Redazione Fare Elettronica