Driver L293D e DC MOTORS a bassa tensione

Buona sera a tutti, sono nuovo del forum (e di arduino!).
Per prima cosa complimenti a tutta la community e a tutti coloro che hanno reso possibile la piattaforma arduino, è davvero fenomenale!

Detto questo avrei un dubbio che non riesco a risolvere data la mia buona dose di ignoranza di elettronica... Tra i primi esperimenti sto progettando un robottino a cingoli con il classico ponte-h L293D. Ho letto in rete molti post sui forum riguardo a come interfacciarlo e il datasheet corrispondente.
Dopo alcune prove con motoriduttori solarbotics GM3 è andato tutto bene (arduino usb e alimentazione esterna per i motori 5V).

Ora però devo lavorare con entrambe le alimentazioni esterne e pilotare due motori che hanno come tensione di lavoro 1.5v-3v (Free-run current @ 3V 150 mA). Dalle specifiche tecniche di arduino e del driver, ho dei valori contrastanti:

Arduino (external):
min 7v
max 12v

L293D:

vcc1 4-5v -7v (tipica 5v, quella da arduino)
vcc2 (external, per i motori) min=vcc1, max=36v

Quindi significa che alimentando tutto dall'esterno, nel pin 8 del driver devo mettere almeno 7V, cosa che mi darebbe problemi con i motori... cambio motori o devo mettere dei circuiti supplementari per adattarla?

Ho cercato un po' in rete e sul forum, qualcuno mette nel pin 8 i 3v senza badare alle specifiche del datasheet, ma non so se sia una gran bella cosa... Chiedo a voi esperti :smiley:

Grazie mille e scusate se ho detto un mare di cavolate :smiley:

ciao synthesis
Ignorare le specifiche del Datasheet non é mai una cosa furba. Il costruttore garantisce il corretto funzionamento o il non rompersi del integrato a quelle condizioni.

Allora alle tue domande.
Ci sono 2 gruppi di Arduino riguardante la tensione di funzionamento: 5V e 3,3V Quelli a 3,3 V puoi alimentarli con 2 pile da 1,5V. Per il L293D Ti servono 5V per la parte digitale di pilotaggio e una seconda tensione per la parte alimentazione dei motori che deve essere al minimo uguale alla tensione della parte digitale.

Prendendo i dati dei Motori http://www.solarbotics.com/assets/datasheets/motor_data_summary-gm3.pdf e http://www.solarbotics.com/products/gm3/specs/ non trovo le tensionie e correnti che nomini.
Da quelle specifiche puoi alimentare i motori a 6V.

Le specifiche del Arduino per un alimentazione tramite il connettore da alimentatore sono 7 a 12V perché allo stabilizzatore montato sul arduino serve almeno 1,5 V in piú per riuscire a lavorare bene a stabilizzare i 5V e con 12 V la potenza dissipata dal stabilizzatore diventa cosí grande che si riscalda troppo.

Percui ti propongo: Usa 4 pile da 1,5V e hai 6V; Per avere i 5V usa o un alimentatore switching tipo: http://www.robot-italy.com/product_info.php?cPath=6_35&products_id=532 e lo regoli a 5V oppure un stabilizzatore da 5V low dropout. (Se Ti serve un codice Te lo devo cercare) con questi 5V alimenti sia l'arduino sulla pin 5V che la parte digitale del L293D. La parte di potenza la alimenti direttalmente dai 6V delle batterie.

Ciao Uwe

Ciao uwefed, grazie mille per la tua risposta veloce e precisa. Forse non mi sono spiegato bene nella esposizione del problema, comunque i solarbotics GM3 funzionavano senza problemi quando li ho testati con usb per arduino + alimentazione esterna per L293D a 5v, il problema è che devo pilotare motori differenti dai GM3 che hanno specifiche 1.5v-3v (sono da mini 4 wd) perchè ho un gearbox che ospita quelli.

Gearbox: http://www.pololu.com/catalog/product/114
Datasheet motori: http://www.pololu.com/file/download/fa_130ra.pdf?file_id=0J11

Probabilmente se ho ben capito il tuo discorso posso applicare lo stesso ragionamento anche se le tensioni sono diverse con i motori da 3v...

ciao synthesis
vedo 3 possibilitá piú o meno belle:

  • metti la tensione dei motori a 5V e metti 3 diodi in serie al motore altri 3 in direzione inversa. cosí perdi 2 V,1 sui diodi. ( soluzione poco elegante)
  • cerciamo un altro integrato che funzioni a 3,3V. non ho ancora trovato niente.
    Non so cosa costa di meno trovare e comprare un altro integrato che funziona a 3V oppure cambiare i motori con motori a 5 o 6 Volt.
    Ciao Uwe

Ho fatto una analisi delle soluzioni da te proposte, con 2 motori dovrei mettere la serie di diodi sia in uno che nell'altro, cosa che forse mi aumenterebbe la "complessità" del circuito... L'L293D funziona bene ed è abbastanza documentato in giro per la rete quindi mi sa che devo andare nella direzione di una sostituzione dei motori con altri che abbiano un range di tensioni che fa al caso mio... A breve li compro poi inizio a fare i test!

Grazie mille ancora

ciao synthesis
Ci sono tanti integrati ben trovabili e documentati; non devi fissarti sul L293D.
Quando ho tempo cerco qualcosa che potrebbe far al caso tuo.
Ciao Uwe

Ok allora mi metto alla ricerca io, hai già fatto tanto, dandomi dritte importanti, ci manca solo che ti faccio cercare l'integrato al posto mio! :smiley:

Grazie :wink:

ciao synthesis
non c'é di che.
cerca dalla ditta Allegro.
cioa Uwe

Perfetto, allora cerco qualcosa prodotto da loro, poi se lo trovo lo scrivo, magari è utile ad altri!
Thanks :wink:

ciao,
forse mi intrometto a sproposito ma ..

con L293D puoi usare 2 PWM per alimentare 2 motori.

Se alimenti i motori a 5 volt ma con PWM fisso, diciamo, al 30%, in pratica ai motori arriva una tensione media di 5*0.3=1.5 V

Poi bisogna usare un trucchetto per aumentare la frequenza del PWM di Arduino che è molto bassa altrimenti i motori non lavorano bene ed assorbono troppa corrente.

Giocando un pò con i timer sono riuscito a portare la frequenza del PWM ad 8KHz.

ciao

puoi postare il codice che hai usato per cambiare la frequenza del pwm?

ciao, forse mi intrometto a sproposito ma ..

Oltre a non intrometterti assolutamente a spropostito penso tu stia dando info preziose :smiley:

Se alimenti i motori a 5 volt ma con PWM fisso, diciamo, al 30%, in pratica ai motori arriva una tensione media di 5*0.3=1.5 V

Quindi, dimmi se ho ben capito, intendi usare PWM sui pin di enable (1 e 9) di L293D per variare la tensione di uscita dei motori ed, eventualmente, anche la loro velocità?
Mi associo alla richiesta di calamaro per il giochetto con i timer :smiley:

synthesis

ciao synthesis

La cosa funziona, ma hai bisogno di 5V per alimentare il L295.

Proposta: il A3953 é un driver Ponte H con alimentazione logica da 3V a 5,5V, con tensione motore a partire dalla tensione della logica ed disponibile in contemitore DIP16.
Ti serve uno per motore.
datasheet: http://www.allegromicro.com/en/Products/Part_Numbers/3953/3953.pdf
lo trovi a ca 4 ? da http://it.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=6807539 (scrivono che é disponibile dal 26/04/2010 percui dovrai aspettare un attimino, la versione SMD é disponibile da subito).
oppure da https://www.distrelec.it/ishopWebFront/catalog/product.do/para/artView/is/true/and/node/is/DC-75439/and/productNr/is/663115/and/id/is/01/and/series/is/1.html dove é leggermente piú caro.
In questo modo puoi usare un Arduino a 3,3V e alimentare tutto con 2 pile da 1,5V. Questo semplifica molto l'alimentazione.

Ciao Uwe

ciao,

@synthesis:
col PWM puoi variare la velocità dei motori, in questo caso però ho pensato solo di abbassarre la tensione media che arriva ai tuoi motori.
Nulla vieta che cambiando il valore del duty cycle pwm tu possa fare entrambe le cose.

per gli altri:
Dopo aver provato il pwm a bassa frequenza dell'Arduino e notato che il motore DC assorbiva molto e girava male ho cercato info ed ho scoperto che la frequenza pwm dovrebbe essere superiore a 10KHz (da 10 a 20).
per variare la frequenza PWM dei piedini 5 e 6 ho fatto:

void setup()
{
//setta il registro del prescaler del Timer TCCR0B con il divisore per 8 per ottenere
// una frequenza PWM di circa 8KHz sui piedini 5 e 6
TCCR0B = TCCR0B & 0b11111000 | 0x02;
....
}

L'ho trovato qui Arduino Playground - TimerPWMCheatsheet :smiley:

Ho provato l'istruzione sopra misurando l'uscita con l'oscilloscopio ed effettivamente dà circa 8KHz, stabile e precisa.
Svantaggio: siccome il Timer TCCR0B interferisce con il comando delay() e con millis() ti ritrovi i tempi sballati di un fattore 8. (cioé delay(8000) ritarda di 1 secondo: poco male, basta moltiplicare x8 il numero che passi a delay() ).

Ho provato proprio con L293D ma non ho lo schema a portata di mano.
Ci sono 2 utilizzi del pwm: io ho usato quello (LAP?) che se il duty cycle =0% il motore va al massimo in un senso, se =100% va al massimo nell'altro senso, al 50% resta fermo e nei valori intermedi assume una velocità intermedia.

ciao

ciao a tutti
Riguardo la frequenza PWM so, che Massimo Banzi ha detto, che la frequenza é stata messa cosí bassa perché in delle prove precedenti dava problemi con i motori.
Non so spiegarvi il perché o percome.
Una riposta potrebbe dare Massimo.
Ciao Uwe

@uwefed
Il componente A3953 che hai consigliato sembra proprio che faccia al caso mio, ho letto un po' il datasheet... penso che a breve farò un ordine, magari ci metto dentro altre cose per ammortizzare le spedizioni!

@Rbb
Come hai fatto a settare il tutto in quel modo (0%, 100% e 50%)? Io avevo in mente di inviare valori 0%, 100% per l'escursione dalla velocità minima e massima e invertire la polarità degli ingressi per il cambio di direzione, ma affettivamente come dici tu sembra più comodo!

Un'altra curiosità: se uso PWM, in base al duty cycle simulo un valore analogico e fin qui ok... ma se io uso gli enable del L293D in PWM e una alimentazione dei motori (pin 8) più alta delle specifiche dei motori stessi rischio di danneggiarli anche con duty cycle basso?

Grazie a tutti :smiley:

ciao synthesis

Il rapporto di Acceso-Spento é dato dal numero che indichi nella funzione analogWrite() . I valori possibili sono da 0 a 255, che corrisponde a da 0 al 100% di tempo di accensione.
Alcune uscite digitali possono essere usati in modalitá PWM con una frequenza abbastanza bassa (intorno ai 500 Hz). Si puó settare diversamente questa frequenza.

La tensione la quale devi considerare é la media sul tempo. Percui se hai 5V con un rapporto Acceso - Spento di 50% é in linea di massima come se avresti 2,5V. (c'é l'impedenza del motore che influisce un po')
A dei tempi troppo corti hai un influenza notevole dell'impedenza del motore che limita la corrente e percui il rapporto tempo accensione - tensione non é piú lineare.
Ciao Uwe

Quindi se ho ben capito non si pone più il problema iniziale, cioè se ho i miei motorini DC a che lavorano massimo a 3V e allo stesso tempo devo alimentare l'L293D con almeno 5V per i motori (per le specifiche), posso semplicemente regolare il PWM per non superare mai il 60%...

Ciao synthesis
La Tua frase é un po complicata.
L293D: Ti servono 5V per la parte logica e almeno 5V per la parte potenza. Devi avere 4 batterie e un regolatore di tensione che produce 5V.
Se vai a 2 batterie e a 3V con un arduino da 3,3V Ti risparmi il regolatore e devi usare per sempio due A3953 al posto del L293D.
Comunque puoi usare il PWM per regolare la velocitá dei motori.
Non so se Ti ho risposto
Ciao Uwe

Il mio discorso era in generale: la mia idea era di prendere 5V da un regolatore poi con quelli alimentare sia arduino che la parte di potenza del driver, poi anche se io ho potenza a 5V e i motori a 3V, setto il PWM al 60% massimo, così non eccedo mai i 3V sui motori.
Se il mio discorso è giusto posso alimentare i motori dall'L293D con qualsiasi alimentazione poi calcolo le giuste percentuali del duty cycle per avere una media in linea con le specifiche dei motori...
Non so se mi sono spiegato bene :smiley: