
Utilizziamo in maniera originale la scheda Infineon Motor Shield, aggiungendo un Arduino e solo altri due componenti possiamo realizzare un inverter ad onda sinusoidale che trasforma la 12V della nostra auto, camper o barca nella 230V di casa per alimentare i nostri utilizzatori preferiti.
Preparazione della scheda Infineon motor Shield
La scheda Infineon Motor Shield arriva senza piedini saldati per cui, per prima cosa, ho provveduto a saldare le strip maschio destinate ad accoppiarsi con gli I/O di Arduino. Vista la grande corrente (30A) in entrata ed in uscita dai capi di potenza, la scheda non presenta per quest’ultimi le tipiche piccole piazzole per strip ma fori più grandi con ampie zone in rame da entrambi i lati, io ho optato per avvitarci sopra quattro boccole1 per terminali a banana in modo da rendere comodi i collegamenti provvisori necessari in fase di prototipazione.
Il montaggio di tali boccole, anche tenute il più alto possibile (fig. 1), purtroppo, mal si adatta alla scheda Arduino Uno, visto che i dadi sottostanti tendono comunque ad urtare la porta di alimentazione e la porta USB dell’Arduino.
Ho risolto usando strip maschio leggermente più lunghe e ponendo nastro isolante sia sul dorso della presa USB che sul dado che inevitabilmente va a contatto con essa (fig. 2), per la presa dell’alimentazione ci sono meno problemi perché esternamente presenta materiale isolante.
Modalità di controllo dei 2 half bridge
La scheda presenta 2 integrati BTN8982TA che sono dei mezzi ponti (half bridge), per creare una tensione sinusoidale si può agire in due modi, il primo è comandare contemporaneamente i due half bridge con segnali sinusoidali sfasati di 180 gradi, il secondo è quello di far agire una sola metà del ponte alla volta tenendo costante la tensione in uscita dall’altra metà del ponte. (fig. 4)

Fig. 4 – potenziale dei due terminali OUT e loro differenza, per un valore efficace di 230V il valore massimo è superiore ai 300V.
La seconda soluzione è migliore perché tenendo fisso uno dei due valori si evitano metà delle perdite di commutazione, per cui nella programmazione del firmware ho cercato di implementare questa tipo di controllo.
Considerazioni sui valori di tensione e potenza
L’inverter assorbe una corrente continua in ingresso e ne produce una alternata in uscita, fin qui nulla di nuovo, ma che valore presenta la tensione alternata? Per saperlo occorre ripassare un po’ di teoria, il valore col quale si indica la tensione alternata, se non specificato altrimenti, è il valore efficace ovvero la radice quadrata della media dei quadrati, indicata in inglese con la scritta RMS (Root Mean Square), per un’onda sinusoidale (e solo per quella) il valore efficace si può ottenere facilmente prendendo il valore di picco di una semionda (detto valore massimo) e dividendolo per radice di 2.
Vediamo di chiarire con un esempio pratico se diamo in ingresso 12V DC ad un ponte ad H in uscita possiamo avere al massimo una sinusoide che va da +12V a -12V il cui valore massimo è 12V, di conseguenza il valore efficace risulta di di 12/1,41 = 8,51V.
Se vogliamo realizzare un inverter in grado di erogare i 230Vac della rete domestica dovremo applicare un trasformatore con adeguato rapporto di trasformazione che, al contrario di quanto si può pensare, non è 230/8,51, in quanto la maggior parte dei trasformatori è pensata per ridurre la tensione e non per alzarla e presenta un rapporto di trasformazione reale diverso da quello di targa per compensare le cadute di tensione.
Ad esempio il trasformatore che ho utilizzato nel prototipo presenta Sn=100VA e rapporto nominale 220/12 e per ottenere 230 V in uscita ho dovuto alimentarlo con 20V in corrente continua.
Da questi ragionamenti ne consegue che per realizzare un inverter che dalla tensione di batteria auto ci porti a 230V occorre un rapporto di trasformazione di targa di 230/7,2V che non è un valore standard. In conclusione consiglio di utilizzare un rapporto di trasformazione standard con valore secondario di poco inferiore a 7,2 e di regolare la tensione alternata in ingresso tramite firmware in modo da ottenere sperimentalmente la tensione di uscita desiderata.
Per quanto riguarda la potenza massima del nostro inverter abbiamo il limite di 30A per cui se alimentiamo a 12V la potenza massima in ingresso sarà di 12x30=360W, anche il trasformatore dovrà presentare una potenza nominale maggiore o uguale a 360VA ed in uscita avremo verosimilmente almeno 300W erogabili 24h al giorno oppure potenze maggiori per tempi brevi.
Programmazione
La realizzazione del firmware con l’IDE Arduino ha richiesto la soluzione di diversi problemi che non avevo preventivato, la difficoltà è dovuta ai 50Hz che, pur sembrando pochi, richiedono di creare una sinusoide in soli 20ms con istruzioni da eseguire in real time.
Non ho potuto utilizzare la funzione delay() in quanto accetta in ingresso solo valori interi di millisecondo e mi avrebbe consentito di approssimare la sinusoide con meno di 20 gradini (ritardo minimo 1 ms) per cui, dopo varie ricerche, ho trovato il listato della funzione delay() e modificandolo sono riuscito ad ottenere funzioni delay “personalizzate” con ritardo di 10 o 100us. Solo successivamente, in fase di revisione dell'articolo ho scoperto l'esistenza della funzione delayMicroseconds() che mi avrebbe evitato la fatica.
La forma d’onda in uscita comunque non era soddisfacente e ho scoperto che ciò era dovuto alla frequenza delle uscite PWM di Arduino che presentano di default un valore molto basso per lo scopo (488Hz). In rete ho trovato una funzione che permette di variare questo parametro ed ho portato la frequenza del PWM a 3904Hz.
Per creare la sinusoide al posto di calcolare la funzione seno con “sin()” eseguito n volte al ciclo ho optato per creare un vettore di 17 elementi con già inseriti i valori del seno di angoli da 0 a 90°. Ripercorrendo il vettore avanti e indietro una volta comandando una metà ponte una volta l’altra metà ho ricreato in uscita una sinusoide approssimata con ben 64 gradini.
Come visibile in fig. 5 la forma d'onda della tensione presenta molti picchi dovuti alla commutazione PWM per cui ho pensato di filtrarli applicando in uscita un condensatore poliestere con tensione di lavoro 400VAC e 0,47uF ed ecco i risultati:

Fig. 6 – Forma d'onda dell'uscita con condensatore da 0,47uF e carico resistivo da 40W, la forma d'onda risulta sensibilmente migliorata.
Conclusioni
Con questo prototipo ho dimostrato che è possibile utilizzare la scheda Infineon, originariamente pensate per i motori in corrente continua, anche per realizzare un inverter. Prossimi passi possibili per sviluppare ulteriormente il progetto sono quelli di poter variare tensione e frequenza allo scopo di controllare motori asincroni.
1 I terminali di potenza sono cinque, ma per questo progetto non mi serviva la massa in uscita e quindi non ho installato la relativa boccola.

Molto bello, compatto ed efficacie, complimenti!! 🙂 Ero molto curioso di vedere come sarebbe stato sviluppato questo progetto, avevo più o meno la stessa idea per questa scheda! 🙂
Nel futuro sarebbe interessante eseguire un controllo più accurato utilizzando una qualche retroazione in maniera da assicurarsi che la tensione in uscita non soffra troppo delle fluttuazioni del carico. Tuttavia se si pensa a scopi industriali, come il controllo di motori, di sicuro questi problemi vengono meno.
Ancora complimenti! Un saluto AT
Grazie mille, mi fa piacere vedere l’articolo pubblicato ed i vostri complimenti
Bell’articolo complimenti.
Grazie!
Ottima idea e ben descritto.
Scusami se sbaglio, ma non ho trovato il listato del programma di gestione per Arduino.
Grazie, scusate se rispondo solo ora ma mi sono accorto che l’articolo è stato pubblicato 15 min fa! Non ho inserito il listato ma lo posso allegare qui, quando torno a casa dove ho il PC sul quale lavorai quest’estate per questo progetto.
Bravo, ottima descrizione del prodotto, sarebbe effettivamente interessante vedere l’algoritmo che hai partorito.
Complimenti
ho postato il listato in risposta ad un altro post
ciao
bell’articolo
complimenti
e’ possibile avere lo sketch per arduino?
grazie
saluti
LQuadri
Ecco lo sketch
/*Sketch to make a sine wave by a schedule by DV*/
#define IS_1 0 //sensore di corrente 1
#define IS_2 1 //sensore di corrente 2
#define IN_1 3 //segnale pwm 1
#define IN_2 11 //segnale pwm 2
#define INH_1 12 //mezzo ponte 1
#define INH_2 13 //mezzo ponte 2
#define TCONST 30 //Delay Time between Steps in cms
// vettore contenente un quarto di onda
float seno[17] = {0, 0.0980, 0.195, 0.290, 0.38, 0.4714, 0.5556, 0.6344, 0.707, 0.773, 0.8315, 0.882, 0.924, 0.957, 0.9808, 0.995, 1};
// indice i
int i;
void setup() {
// put your setup code here, to run once:
pinMode(IN_1,OUTPUT);
pinMode(IN_2,OUTPUT);
pinMode(INH_1,OUTPUT);
pinMode(INH_2,OUTPUT);
digitalWrite(INH_1,1);
digitalWrite(INH_2,1);
analogWrite( IN_1 , 0 );
analogWrite( IN_2 , 0 );
setPwmFrequency(3, 8); //imposta prescaler frequenza pwm pin 3
setPwmFrequency(11, 8); //imposta prescaler frequenza pwm pin 11
}
//funzione impostazione frequenza pwm
void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}
//funzione delay centimilli
void delayd(unsigned long dms)
{
uint16_t start = (uint16_t)micros();
while (dms > 0) {
if (((uint16_t)micros() – start) >= 10) {
dms–;
start += 10;
}
}
}
void loop()
{
//Prima semionda
for (i=1; i=0; i–) //dal sedicesimo al primo elemento
{
analogWrite( IN_1 , seno[i]*255);
delayd(TCONST);
}
//Seconda semionda
for (int i=1; i=0; i–) //dal sedicesimo al primo elemento
{
analogWrite( IN_2 , seno[i]*255);
delayd(TCONST);
}
}
Io avrei collegato 8 pin digitali ad una rete r-2r per avere una tensione continua. Ottenere un valore di 8 bit in uscita in digitale è molto più veloce che un valore analogico in PWM e la commutazione da un livello all’altro del valore analogico ottenuto dalla rete r-2r è anche più facile da filtrare
Si ma così non avrei usato la scheda infineon (che era lo scopo del progetto) inoltre da una rete R-2R puoi ricavare un segnale ma non una corrente elevata, il lato a bassa tensione (da 12 a 30V) può pilotare 35A! Grazie comunque del suggerimento.
Mah! Lo sketch mi sembra ridondante.
Si potrebbe semplificare molto. Con lo stesso risultato. E non mi riferisco alla funzione delay() …
@Claudio Tolini Proponi lo sketch ottimizzato altrimenti anche il tuo commento è ridondante.
Si. Certo. Per il momento non sono nel mio ufficio, studio. Non appena ritornerò, toglierò linee inutili di debug e lo proporrò.
In ogni caso ottimo articolo.
Saluti.
Ritiro quanto ho scritto giorni fa, dopo che ho visto le caratteristiche della scheda Infineon. Con questa il tuo codice va bene.
Io uso un semplice booster a Mosfet per pilotare il trasformatore. Lo sketch usa un pattern prestabilito con i campioni PWM per 1/4 di ciclo. Che poi serve per generare ciascun semiciclo ciclo.
E devo dire che il risultato è quello voluto.
Tutto qua. Buon lavoro.
CT
Scusa la mia risposta un po’ piccata, tutto è perfettibile figuriamoci questo programmino fatto per hobby. Come booster a mosfet usi una scheda già fatta? Sarebbe comunque interessante vedere il tuo listato per prendere spunto per altri progetti. Saluti
DV.
Tranquillo, nessun problema. Sono stato io un po’ affrettato a scrivere quella valutazione senza vedere prima le caratteristiche della scheda che usi.
Il mio booster è fatto “in casa” con quello che avevo nei cassetti. Due mosfet con relativi curcuiti di pilotaggio/interfacciamento con Arduino. Come dicevo sono fuori sede e ritornerò la prossima settimana.
Al ritorno invierò schema del booster e codice.
Saluti.
CT