Motor drivers

In mijn zoektocht naar (kleine) modules om motoren aan te sturen (vooral voor de 12V motoren van de modeltreintjes) kwam ik een paar aardige (H-brug) kandidaten tegen: de TB6612FNG en de A4950. Beide zijn geschikt voor 12 Volt en om d.m.v. PWM aangestuurd te worden. De eerste is een module voor twee motoren en is ca. 20 x 20 mm groot. De tweede is alleen een 8 pins chip in sop (Small outline package) formaat (ca. 7 x 5 mm), geschikt voor het aansturen van één motor.

De TB6612FNG module

TBA6612FNG
TB6612FNG met een Arduino UNO
TB6612FNG met een ESP32 C3

Eerst aangesloten op een Arduino UNO (links) en daarna op een ESP32 (rechts) en onderstaande sketch zonder tussentijdse aanpassingen geüpload. De ESP heeft ook een analoge A1 om de waarde van de potmeter in te lezen, een pin 3 en 4 voor de aansturing van de motor en een pin 5 voor de snelheid d.m.v. PWM. Beide schakelingen werken prima!

/*
  TB6612FNG H-Bridge Demo
  TB6612-Demo.ino
  Demonstrates use of TB6612FNG H-Bridge Motor Controller
  Drives a DC Motor

  DroneBot Workshop 2019
  https://dronebotworkshop.com
*/

// Motor A
int pwmA = 5;
int in1A = 3;
int in2A = 4;

// Speed control potentiometer
int SpeedControl1 = A0;  

// Motor Speed Value - Start at zero
int MotorSpeed1 = 0;

void setup()
{
  // Set all the motor control pins to outputs
  pinMode(pwmA, OUTPUT);
  pinMode(in1A, OUTPUT);
  pinMode(in2A, OUTPUT);

  Serial.begin(112500);
  Serial.println("TB6612FNG_H-Bridge_Demo.ino");
}

void loop() {
  // Set Motor A forward
  digitalWrite(in1A, HIGH);
  digitalWrite(in2A, LOW);
  delay (1000);

 // Set Motor A backward
  digitalWrite(in1A, LOW);
  digitalWrite(in2A, HIGH);
  delay (1000);
  
  // Read potentiometers and convert to range of 0-255
  MotorSpeed1 = map(analogRead(SpeedControl1), 0, 1023, 0, 255);
    
  // Set the motor speeds
  analogWrite(pwmA, MotorSpeed1);
  Serial.println(MotorSpeed1);  
}

De A4950 chip

Om de A4950 te testen wacht ik nog op onderstaande adapterbordje. De chip heeft namelijk zoals gezegd een sop-8 SMD (surface mounted device) formaat en het adapter bordje zorgt ervoor dat het als een DIP-8 (Dual-in-line Package) chip in een breadboard te prikken is en dat maakt het testen een stuk eenvoudiger!

A4950
Adapterbordje
Hier moet de A4950 dus op!

Er bestaat ook een module met twee A4950 chippies erop. Hieronder zie je het schema. De weerstand (R1 en R2) van 0.25 Ohm dient om … en is optioneel.

Module met 2x A4950
Schema van de module

Motor Current Limit
There is a VREF pin, labeled VCC on the boards. That voltage must be 5V or lower. It determines the maximum current that the motors require. If the current demand goes higher, then the chip will switch off the H-bridge, protecting the motors and the chip itself.
The formula is: Imax = (VREF/10)/R where R is 0.25. This can be simplified to: Imax = VREF * 0.4. So, if VREF is set to 5V, then the maximum current is 2A. That’s the maximum value (VREF must not be set higher than 5V). If your motors only require 1A max, then VREF would be set to 2.5V.

Hier het artikel waar bovenstaande fragment vandaan komt.

De SOT-8 naar DIP-8 adapterbordjes zijn ca. 12 x 12 mm en hebben twee zijden. Aan de ene kant SOT met een pitch van 0,65mm aan de andere kant een pitch van 1,27mm. Op deze tweede zijde kunnen de A4950 chips gesoldeerd worden.

Adapterbordje heeft twee kanten.
De A4950 op het adapterbordje gesoldeerd.

Hieronder de sketch om de driver chip aan te sturen d.m.v. een Arduino/ESP32.

// *************************************************
// ********  Test A4950 driver chip    *************
// *************************************************

// Motor aansluitingen
const int motorA1 = 9;
const int motorA2 = 10;

int rijrichting = 1;    // Rijrichting is 1 = vooruit

int snelheid = 128;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("A4950_motor_test.ino");

  pinMode(motorA1, OUTPUT);
  pinMode(motorA2, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
    for (int i = 80; i <= 120; i=i+1) {
      Serial.println("Steeds sneller vooruit"); 
      Serial.println(i);   
      analogWrite(motorA1, i);
      analogWrite(motorA2, 0);
      delay(100);
      }
    for (int t = 120; t >= 80; t=t-1) {
      Serial.println("Steeds langzamer vooruit");
      Serial.println(t);  
      analogWrite(motorA1, t);
      analogWrite(motorA2, 0);
      delay(100);
      }
           
    delay(2000);

    for (int i = 80; i <= 120; i=i+1) { 
      Serial.println("Steeds sneller achteruit"); 
      Serial.println(i);  
      analogWrite(motorA1, 0);
      analogWrite(motorA2, i);
      delay(100);
    }
    for (int t = 120; t >= 80; t=t-1) {
      Serial.println("Steeds langzamer achteruit");      
      Serial.println(t);    
      analogWrite(motorA1, 0);
      analogWrite(motorA2, t);
      delay(100);
    }
    delay(2000);
}

Testen is goed gelukt. Beide chippies voldoen prima. En ze zijn makkelijk aan te sturen!

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie gegevens worden verwerkt.