Controllo di un motore con driver L293D
Un ponte H è una struttura modellabile con 4 interruttori e si utilizza attivando gli interruttori a coppie ottenendo la direzione di rotazione voluta per il motore.
- Se tutti gli interruttori sono aperti, il motore è fermo.
- Se gli interruttori S1 e S4 sono chiusi e gli altri due sono aperti, il motore gira in una direzione
- Se gli interruttori S2 e S3 sono chiusi e gli altri due sono aperti, il motore gira nella direzione opposta.
N.B. Se vengono chiusi S1 e S2 oppure S3 e S4 si ottiene un conto circuito verso massa con conseguente pericolo di distruzione del circuito.
Driver L293D
L'integrato L293D integra due ponti H elettronici ed è quindi in grado di comandare due motori in corrente continua contemporaneamente.
Per comprenderne il funzionamento facciamo riferimento al motore di sinistra comandato dai piedini sulla sinistra del chip.
- Il motore deve essere collegato tra i piedini 3 e 6.
- Mandando un valore logico alto ai piedini 1 e 2 e basso al piedino 7 il motore ruota in una direzione (al massimo della velocità). Se al piedino 1 invece viene inviato un segnale PWM la velocità di rotazione dipenderà dal duty cycle del PWM
- Mantenendo il piedino 1 ad un valore logico alto e invertendo i livelli logici dei piedini 2 e 7 il motore gira nell'altra direzione (al massimo della velocità). Anche in questo caso per variare la velocità di rotazione del motore il PWM dovrà essere inviato piedino 1.
Il setup qui sotto riportato permette di controllare un motore in CC tramite Arduino utilizzando un modulo L293D.
mentre il seguente firmware esegue un "soft start" in una direzione, porta il motore a regime e successivamente lo ferma lentamente.
#define avanti 11
#define indietro 10
#define pwm 9
int velocita = 0;
void setup()
{
pinMode(avanti, OUTPUT);
pinMode(indietro, OUTPUT);
pinMode(pwm, OUTPUT);
}
void loop()
{
digitalWrite(indietro, LOW); // Prima a 0 il secondo pin per evitare corti circuiti
digitalWrite(avanti, HIGH); // Marcia avanti
for (velocita = 0; velocita <256; velocita++){
analogWrite(pwm, velocita);
delay(10); // 255*10 = 2550 millisecondi per andare a regime
}
analogWrite(pwm, 255);
delay(5000); // Resta 5 secondi a regime
for (velocita = 255; velocita >=0; velocita--){
analogWrite(pwm, velocita);
delay(10); // 255*10 = 2550 millisecondi per arrestarsi
}
analogWrite(pwm, 0);
delay(5000); // Resta 5 secondi fermo
}