Fare il salto dall'hardware basato su Arduino alla creazione dei propri PCB con microcontrollori può sembrare, inizialmente, un processo incredibilmente scoraggiante. Tuttavia, l'apprendimento di queste competenze apre una vasta gamma di opportunità di progetto, oltre a insegnare le abilità pratiche dell'elettronica.
In questo articolo esamineremo tutto l'occorrente per iniziare a progettare hardware personalizzati basati su microcontrollori. Vedrai che in realtà non c'è molto da fare, dato che i produttori di microcontrollori, negli anni, hanno cercato di rendere la curva di apprendimento meno ripida e i dispositivi sempre più accessibili. Questo è vero sia dal punto di vista elettrico ma anche – altrettanto importante – dal punto di vista della programmazione.
La prossima volta esamineremo come predisporre il microcontrollore e supportare i circuiti su un PCB utilizzando Altium Designer.
Come nel caso di praticamente qualsiasi tipo di circuito integrato, esiste un numero incredibilmente elevato di microcontrollori tra cui scegliere.
Vi sono molte produzioni diverse (ad esempio, Texas Instruments, STMicroelectronics, Espressif), package (ad esempio, BGA, QFN, LQFP), dimensioni di unità flash e RAM, velocità di base e molti altri parametri da decidere.
A dire il vero, a meno che le tue esigenze non siano estremamente specifiche, le opzioni disponibili tra i produttori tendono a non variare troppo in termini di capacità di interfaccia e prestazioni. Scegli uno qualsiasi dei marchi principali e andrai sul sicuro.
Per la maggior parte dei miei progetti, scelgo la linea di microcontrollori STM32 di STMicrolectronics (disclaimer: non ho alcun collegamento o accordo con STMicroelectronics, semplicemente mi piacciono i loro prodotti).
Perché questa scelta? Hanno una toolchain molto intuitiva (STM32CubeIDE), che consente di eseguire la pianificazione dei pinout, sono forniti con un livello di astrazione hardware (HAL) per lo sviluppo di un firmware semplice e offrono un ampio portafoglio di microcontrollori con capacità variabili. Inoltre, il loro debugger (STLink) è economico e facile da usare.
Ti consiglio vivamente di guardare i siti web di distributori e produttori, trovare una famiglia di microcontrollori adatta alle tue esigenze e attenerti a quella. In questo modo, avrai bisogno di un solo tipo di debugger, i progetti hardware saranno molto simili tra di loro e il processo di sviluppo del firmware diventerà sempre più familiare e non dovrai passare da una toolchain all'altra.
Un ulteriore vantaggio del superamento dei progetti basati su Arduino è la possibilità di utilizzare i debugger. I debugger sono interfacce di programmazione specializzate, che consentono di caricare codice, oltre a eseguire il debug del programma in tempo reale. Ad esempio, impostando i punti di interruzione, monitorando le variabili e così via, il tutto senza dover stampare su una console seriale.
Sono disponibili debugger per uso generico compatibili con una varietà di prodotti di diversi marchi. Tuttavia, ogni produttore in genere offrirà il debugger specifico per i propri microcontrollori. Per i dispositivi STM32, ad esempio, abbiamo il debugger ST-Link.
In genere, il debugger è collegato al microcontrollore tramite l'intestazione PCB che espone pin di debug e programmazione dedicati. Questa interfaccia può essere il debug del cavo seriale (SWD) o il JTAG, entrambi indispensabili per uno sviluppo serio del firmware.
Una volta scelta una famiglia di microcontrollori adatta con un debugger compatibile, sono sicuro che non vedrai l'ora di passare alla creazione di hardware vero e proprio per un progetto personalizzato.
La creazione delle connessioni schematiche e tipiche richieste per un microcontrollore è di solito un processo semplice e standardizzato.
Innanzitutto, dobbiamo alimentare il microcontrollore. In genere, un microcontrollore richiederà solo una singola pista di alimentazione e nella maggior parte dei casi sarà a +3,3 V.
Dai un'occhiata all'immagine qui sopra, che mostra la sezione di alimentazione di un potente microcontrollore STM32H7. I pin di ingresso dell'alimentazione al microcontrollore sono chiamati VDD (anche VBAT), che corrispondono alla pista di tensione digitale. Ogni pin VDD richiede un condensatore di disaccoppiamento 100nF posizionato vicino ai relativi pin VDD e VSS (o GND).
Inoltre, il tuo microcontrollore preferito potrebbe avere periferiche analogiche, come un convertitore da analogico a digitale, che pure richiede alimentazione. Per questo ingresso di alimentazione (VDDA e VREF+), dobbiamo eseguire alcuni filtri sotto forma di filtro PI, poiché la sezione analogica sarà più sensibile al rumore rispetto alla parte digitale del microcontrollore. Il passaggio è mostrato nell'immagine sopra con C216, FB200 (una microsfera di ferrite) e C216.
Il microcontrollore può avere regolatori interni che devono essere bypassati esternamente con ulteriori condensatori di disaccoppiamento. Per questo particolare STM32H7 IC, questi pin si chiamano VCAP. Il valore di 2,2uF per pin è stato estratto dalla relativa scheda tecnica.
Esistono due metodi principali per caricare il codice nel microcontrollore. Il primo avviene tramite una sonda di debug e SWD o JTAG, mentre il secondo avviene tramite un bootloader. In caso di microcontrollori STM32, il bootloader consente all'utente di caricare il codice tramite interfacce UART, I2C, USB e simili (dipende dal dispositivo!) senza bisogno di un debugger.
Per abilitare il bootloader, dobbiamo alzare il pin BOOT0 prima di accendere il microcontrollore.
Per poi eseguire il programma, dobbiamo abbassare BOOT0 prima di riaccendere il dispositivo. È quindi una buona idea rendere lo stato di BOOT0 commutabile tramite un interruttore, ad esempio.
Nel microcontrollore sarà esclusivamente programmato tramite un debugger, quindi è possibile legare BOOT0 in basso (a massa) in modo permanente.
Come interfaccia di debug, per questo progetto ho scelto di utilizzare SWD, che è un'interfaccia a due fili (dati: SWDIO e clock: SWCLK). Inoltre, sto esponendo il segnale SWO (traccia), che mi consente di tracciare le variabili in tempo reale e la linea NRST (ripristina, logica invertita) che, quando è in basso, esegue un ripristino dell'hardware del microcontrollore.
I segnali sono collegati a un'intestazione di debug con una protezione ESD opzionale, ma vivamente consigliata, sotto forma di diodi TVS.
Sebbene la maggior parte dei microcontrollori contenga un oscillatore interno, sufficiente per un gran numero di design, di solito conviene collegare un cristallo (o oscillatore) esterno al microcontrollore.
Per i dispositivi STM32 in particolare, esistono due tipi di oscillatore: esterno ad alta velocità (HSE, a scopo di tempistica generale) ed esterno a bassa velocità (LSE, per il clock in tempo reale). La maggior parte dei miei progetti richiede semplicemente l'oscillatore HSE.
L'immagine sopra mostra il metodo collaudato per collegare un cristallo esterno al microcontrollore. La frequenza massima e minima consentita del cristallo è riportata nella scheda tecnica del microcontrollore.
Dovrai aggiungere condensatori di carico (C200 e C201, in questo esempio) che dipendono dalla capacità di carico fornita nella scheda tecnica del cristallo. Una volta ottenuta la capacità di carico del cristallo, sottrai da 3 a 5 pf della capacità residua, quindi moltiplica quel numero per due per arrivare al valore di capacità richiesto.
Il compito del resistore di alimentazione (R214, in questo caso) è prevenire l'overdrive del cristallo, che potrebbe portare alla creazione di armoniche indesiderate. In genere è sufficiente un valore dell'ordine di 10 s di Ohm.
Con queste connessioni in atto e, naturalmente, con un'alimentazione adeguata per il binario VDD, il microcontrollore ha tutto ciò di cui ha bisogno per avviarsi ed essere programmato. Tuttavia, in quello stato è un po' inutile, in quanto non l'abbiamo collegato a nessuna periferica.
Per i dispositivi STM32 è possibile utilizzare la scheda tecnica per vedere quali pin possono eseguire la funzione richiesta (I2C, UART e così via) o utilizzare la toolchain STM32CubeIDE di STMicroelectronics, molto utile e gratuita. Ciò consente di vedere rapidamente quali periferiche sono disponibili e di configurare un pin-out per l'hardware.
Poiché la pianificazione del pin-out dipende strettamente dal progetto specifico, non tratteremo i dettagli in questo articolo. Se ti interessa saperne di più, assicurati di guardare questo video, che descrive in dettaglio tutti i passaggi necessari.
Nel prossimo post del blog, creeremo un semplice pin-out e poi esamineremo le best practice per la progettazione di PCB con microcontrollori. Ad esempio, il miglior posizionamento dei condensatori di disaccoppiamento, dell'oscilloscopio di cristallo e dell'intestazione di debug.