Realizzazione Ponte H per un motore in corrente continua

Salve a tutti!
Ho visto altri post in cui venivano chieste info sulla realizzazione di ponti H per comandare motori in CC. Finchè sono motorini da 5V la faccenda si semplifica parecchio. Quando però si cerca di pilotare carichi maggiori di 5V (nel mio caso 12V e 60mA) il discorso si complica un po'. Nella maggior parte dei post la soluzione era prendere un circuito integrato che è la soluzione più veloce. Purtroppo io non mi accontento della soluzione facile perchè mi piace mettermi alla prova senza avere la pappa pronta, per questo mi son cimentato nella realizzazione di un ponte H utilizzando dei transistor (BC547 e BC557C). Questo è lo schema che ho provato a realizzare:

Le resistenze R1, R2, R3 le ho dimensionate applicando le leggi di ohm quando i 3 transistor comandati dall'uscita di arduino A sono in saturazione, gli altri 3 comandati dall'uscita di arduino B non lo sono, la tensione del nodo F è di 7V (=12V-5V) e quella del nodo G è 12V. La struttura è speculare per cui non ho dovuto ripetere il ragionamento dall'altro lato. Ho considerato che nei transistor npn la saturazione avviene quando dalla loro base entra una corrente di 5mA mentre nei transistor pnp la saturazione avviene quando dalla base esce una corrente di 5mA. Ho trovato quindi un sistema di 2 equazioni in 3 incognite (quello che c'è sull'immagine sopra). Il sistema è indeterminato per cui come condizione aggiuntiva ho imposto il passaggio di una corrente 'piccola' sulla resistenza R1 di 10mA. In questo modo ho ricavato i 3 valori delle tre resistenze.

Sono poi andato dal mio negoziante di elettronica per prendere le resistenze necessarie e ho scoperto che non le aveva del valore esatto che cercavo io. Non penso sia un gran problema. Al posto di quella da 650 ho preso una da 660, al posto di quella da 500 una da 460 e al posto di quella da 350 una da 330. Poi siccome sono un pollo mi son dimenticato di prenderne 2 da 1000ohm e ne ho prese 2 in più da 660. Al momento il circuito che ho realizzato sulla breadboard è quindi un po diverso nei valori delle resistenze (almeno finchè non tornerò al negozio per prendere altre 2 resistenze da 1000). Inoltre la tensione di 12 V ottenuta mettendo in serie 8 pile da 1.5V è in realtà da 9.6V perchè le pile sono da 1.2V anzichè da 1.5V come pensavo.

Devo però dire che il risultato mi soddisfa: il motore gira come dovrebbe (col pin A in high e il B in low il motore gira in avanti, con il A in low e il B in high gira al contrario e con entrambi in low sta fermo).

So però che ci andrebbero dei diodi di protezione dato che il carico è induttivo e quando vado a lavorare sul pwm limitando a potenza del motore ci sono dei rischi per le correnti indotte che potrebbero danneggiare i componenti. Il problema è che non ho idea di come metterli e le soluzioni che ho visto in rete non è che le abbia proprio capite.
Quindi innanzi tutto vi volevo chiedere se tutto ciò che ho stritto finora ha senso o se ci sono degli errori macroscopici/cavolate dette e poi vi volevo chiedere un piccolo aiuto su come mettere i diodi di ricircolo.

Grazie in anticipo delle risposte!

Ps: prevedo di ragionare per fare un altro schema a ponte H usando dei mosfet al posto dei transistor. Quando l'avrò realizzato e ne sarò soddisfatto proverò a postarlo sempre su questa discussione.

Servono 4 diodi di protezione.
Ciao Uwe

Ok, che ci andassero 4 diodi ci ero arrivato il mio problema è che faccio fatica a capirli.

In questo link ho trovato uno che spiega come pilotare un motore in CC e come mettere i 4 diodi. Ho capito in che modo intervengono nei regimi transitori ma a differenza del diodo di protezione che mettevo quando volevo pilotare il motore in una sola direzione, qui la corrente non si richiude su se stessa passando per il motore (e lasciando in pace il transistor) ma si richiude sui poli della pila. Cioè hanno una funzione diversa mi sembra. Ovvio che entrambi deviano la corrente indotta per non farla passare sui transistor ma a parte questo non trovo altri punti in comune. Comunque ok, se funziona così mi fido.

Poi altra cosa: quando passo dalla configurazione 'pin A in high e pin B in low' alla configurazione 'A low, B low' il motore non si ferma istantaneamente. Io vorrei farlo fermare non proprio istantaneamente ma quasi. Per farlo posso pensare di mettere per qualche millisecondo l'A in low e il B in high prima di impostarli tutti e due in low o rischio qualcosa?

Per la fermata "quasi istantanea", il sistema piu usato a livello industriale e' il "freno motore", che consiste semplicemente nel cortocircuitare il motore con una resistenza molto bassa (non corto secco, che sarebbe dannoso), in quel modo e' lo stesso motore che si "autofrena", e la tensione che produce ruotando per inerzia viene "scaricata" sulla resistenza, che la dissipa in calore (piu e' bassa la resistenza e piu e' "massiccio" il motore, e piu la resistenza dovra' dissipare potenza, quindi tienine conto) ... sempre a livello industriale, di solito si usa un rele' per farlo, ma con un motorino cosi piccolo potrebbe bastare un mosfet (o una coppia di mosfet in configurazione "interruttore AC", dato che e' alimentato in entrambi i sensi) ... ovviamente questo richiedera' un pin di "frenatura" per pilotarlo ... se tu stessi usandotransistor o mosfet molto piu robusti dei BC547/BC557, potresti anche semplicemente mettere entrambi gli ingressi allo stesso potenziale, ma con quelli non credo resisterebbero per molto ...

C'e' poi un'altro dettaglio che di solito non prende in considerazione quasi nessuno, cioe' i "tempi morti" necessari durante le commutazioni per fare in modo che i due "lati" di ogni ramo del ponte non vadano in conduzione contemporaneamente, anche se solo per pochissimo tempo (detto in parole povere, nel tuo schema, evitare che il PNP e l'NPN dello stesso "lato" conducano insieme, cosa che cortocircuiterebbe l'alimentazione) ... di nuovo, con motori piccoli e commutazioni solo on/off, come nel tuo caso, la maggior parte delle volte non succede nulla, al massimo i trnsistor scaldano un po di piu, ma per principio andrebbero sempre prese in considerazione (immagina commutare senza tempi morti un motore da decine di Ampere, alimentati da una linea in grado di fornirli ... la prima volta che i due transistor conducono insieme, KABOOM :D)

E' il motivo principale per cui si preferisce usare un chip dedicato, che al suo interno ha gia tutta la circuiteria necessaria per generare i vari tempi morti ... questo diventa quasi indispensabile quando si parla di pilotare motori in PWM, anziche' solo on/off ... altrimenti, si puo anche fare via software, ma richiede l'uso di 4 pin (5 con la frenatura) per ogni ponte ... intendiamoci, si puo anche fare con componenti "discreti", prima dell'invasione delle MCU si faceva cosi, ma lo schema diventa abbastanza complesso, perche' devi usare almeno 4 monostabili indipendenti in grado di dare i necessari ritardi sia in "salita" che in "discesa" nella corretta sequenza, ogni volta che commuti il ponte ...

Ciao, scusa se rispondo solo ora. Faccio fatica a capire ciò che scrivi perche banalmente mi mancano le conoscienze di base (non avevo idea di cosa fosse un monostabile ad esempio). Per i tempi morti io metto sempre 1ms di tempo in cui entrambi i pin sono in low prima di commutare il senso di marcia. I transistor hanno tempi di risposta più bassi per cui non dovrei avere il rischio di cortocircuitare nulla.
Ho capito che per la frenatura del motore il problema non può essere risolto così semplicemente come pensavo.
Il motorino che sto pilotando è dotato di un sensore digitale che invia 2 segnali in tensione (5-0V) a onda quadra sfasati di poco ogni volta che il motore ruota di circa 0.2° (In questo modo dovrebbe essere rilevabile anche la direzione di marcia del motore). La mia intenzione era quella di fermare il motore una volta giunto a destinazione in maniera abbastanza precisa basandomi su questo sensore interno al motore. Una possibile opzione sarebbe anche quella di regolare col pwm la 'potenza' del motore facendolo quindi rallentare man mano che si avvicina a destinazione.
Oppure ho visto che commutando i pin di controllo (dopo la micropausa da 1ms) per 250ms il motore effettivamente si ferma subito. Tale procedimento non è però applicabile quando il motore è soggetto a dei carichi... insomma la faccenda non è così semplice per me.
Intanto procedo a tentativi, se a qualcuno viene in mente un modo più intelligente per frenare il motore, me lo faccia sapere (magari compatibile alle mie capacità e conoscenze se possibile).

Ah ecco, il motore in particolare è quello di un set lego chiamato: Lego Mindstorm NXT
In rete si trovano info su sti componenti solo grazie a gente che si è messa a sezionarli. Per cui son tutte informazioni empiriche.

Se le info che vi ho fornito sul mio problema son poche non esitate a dirmelo. Capisco che non è facile risolvere problemi che sembrano essere campati per aria senza contesto.

Ciao!

Se dai 1 ms di ritardo come hai detto va bene. I transistor e i mosfet sono molto più veloci
nella commutazione quindi non corri il rischio di corti.
Per il resto credo che tu stia imparando, quindi non ti forniamo subito le soluzioni.
Intanto studia la frenata, come ti ha consigliato Etemenanki, e studia anche come mettere i diodi.

Come suggerimento, se usi il sensore interno per calcolare il movimento, consiglio delle "rampe" di accelerazione e decelerazione, come del resto fanno quasi tutti i robot industriali ... come dici tu, rallentando proporzionalmente quando sei vicino alla posizione di arrivo (ed accelerando allo stesso modo quando riparti),, cosi anche con il carico inserito, l'inerzia meccanica sara' molto piu ridotta, perche' distribuita sulla rampa ...

Ok i diodi li ho messi così:

Non so se son messi in modo corretto ma dopo un po di ricerche son quasi sicuro siano messi bene.

Per la rampa di accelerazione non ci avevo pensato, potrebbe essere un ottima idea per massimizzare la fluidità di movimento del motore. Come andamento è meglio avere un accelerazione lineare nella variabile rotazione oppure che vari con altra legge che includa magari anche il tempo?

Ora l'ostacolo principale è la parte di programmazione (credo) che cercherò di imparare un po alla volta. (Nonostante abbia delle basi sul linguaggio C mi trovo un po' in difficoltà a programmare usando le pause delay ma non è nulla di insuperabile con un po di applicazione penso)