Motor Driver BTS7960 43A

116,414

98

33

About: Maker, PCB designer , electronics instructor from Jordan just one word ! I Adore electronics follow me on FB https://www.facebook.com/Mohannad-Rawashdeh-Raw-774983565988641/

When you Build Your project , Sometimes you faced some issue with Motor driving Control , Specially if you want to control High Power Motor , I want to write about a nice Motor driver Module , it's BTS7960 half bridge motor controller .

The BTS 7960 is a fully integrated high current half , bridge for motor drive applications , comes with Two package as in pictures .

The Operating Voltage of 24V And Continuous current of 43A Max  , PWM capability of up to 25 kHz combined with active freewheeling 

In this artical I want to show you How we can use it with arduino and control High power Motor , And change The PWM Frequency of the arduino .

Step 1: Inside the Datasheet

The datasheet for this IC Give us useful data 

this IC Have a good protection  circuit such as :

1) Undervoltage Shut Down: To avoid uncontrolled motion of the driven motor at low voltages the device shuts off . 
if the Supply voltage VUV(OFF) droped under 5.4V , The Motor driver will switched Off , And won't turned on untill the Supply voltage increased to 5.5V Or more .

2)Overtemperature Protection: The BTS 7960 is protected against overtemperature by an integrated temperature
sensor. Overtemperature leads to a shut down of both output stages.

3)Current Limitation : The current in the bridge is measured in both switches, High and Low side ,if The current reaching the limit current (Iclx)  the switch is deactivated and the other switch is activated for a certain time(Tcls).

You can read The datasheet for more info 

Step 2: Connect It to the Arduino

The connection of  this module to Arduino Board is shown in schematic Below , 2 PWM Pin must connected to PWM Pin on the arduino , EN pin connected to digital pin on the arduino , The motor driver channel Will be disable if EN Pin is LOW .

Simple code for arduino below .

/*........................
BTS7960 Motor Driver Test
Written By : Mohannad Rawashdeh
Code for :
https://www.instructables.com/member/Mohannad+Rawashdeh/
*/
int RPWM=5;
int LPWM=6;
// timer 0
int L_EN=7;
int R_EN=8;

void setup() {
  // put your setup code here, to run once:
  for(int i=5;i<9;i++){
   pinMode(i,OUTPUT);
  }
   for(int i=5;i<9;i++){
   digitalWrite(i,LOW);
  }
   delay(1000);
    Serial.begin(9600);
  }



void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("EN High");
  digitalWrite(R_EN,HIGH);
  digitalWrite(L_EN,HIGH);
delay(1000);
for(int i=0;i<256;i++){
  analogWrite(RPWM,i);
//  analogWrite(LPWM,255-i);
  delay(100);
}
delay(500);
for(int i=255;i>0;i--){
  analogWrite(RPWM,i);
// analogWrite(LPWM,255-i);
  delay(100);
}
delay(500);
Serial.println("EN LOW");
digitalWrite(R_EN,LOW);
  digitalWrite(L_EN,LOW);
delay(1000);
for(int i=0;i<256;i++){
  analogWrite(RPWM,i);
  delay(100);
}
delay(500);
for(int i=255;i>0;i--){
  analogWrite(RPWM,i);
  delay(100);
}
delay(500);
}

And this is a video to show how this code works 

the PWM Frequency on the arduino UNO Atmega328p - Timer0 is 970Hz , This is a low PWM Frequency , in the next step we want to increase PWM Frequency .

Step 3: PWM ... Arduino Timer

arduino Uno atmega 328p MCU has 3 timers , Time0,,Time2 8 Bit and Time1 16Bit  

Timer0 is connected to pin D5 , D6  , we want to increase the frequency "More smoothly control " 

Note That Timer0 is control the  (delay , millis ) on the arduino , so any change on the prescale of this timer will change the delay and millis time .

int RPWM=5;
int LPWM=6;
int L_EN=7;
int R_EN=8;

  void setPWMfrequency(int freq){
   TCCR0B = TCCR0B & 0b11111000 | freq ;
  }
 
  void MotorActiveStatus(char Side,boolean s){
    boolean state=s;
    if(Side=='R'){
    digitalWrite(R_EN,s);
    }
    if(Side=='L'){
    digitalWrite(L_EN,s);
    }    
  }
  void setMotor(char side,byte pwm){
   if(side=='R'){
    analogWrite(RPWM,pwm);
   }
    if(side=='L'){
    analogWrite(LPWM,pwm);
   }
  }
  void closeMotor(char side){
     if(side=='R'){
    digitalWrite(RPWM,LOW);
     }
     if(side=='L'){
    digitalWrite(LPWM,LOW);
     }

     }
void setup() {
  // put your setup code here, to run once:
  setPWMfrequency(0x02);// timer 0 , 3.92KHz
  for(int i=5;i<9;i++){
   pinMode(i,OUTPUT);
  }
   for(int i=5;i<9;i++){
   digitalWrite(i,LOW);
  }
   delay(1000);
   MotorActiveStatus('R',true);
   MotorActiveStatus('L',true);
    Serial.begin(9600);
  }

void loop() {
  // put your main code here, to run repeatedly:
for(int i=0;i<256;i++){
  setMotor('R',i);
  delay(500);
}
delay(1000);
closeMotor('R');
delay(1000);
  for(int i=0;i<256;i++){
  setMotor('L',i);
  delay(500);
}
delay(1000);
closeMotor('L');
delay(1000);
}

if we want to use this code with another timer " timer 2 " just change  D5 , D6 To pin D3 , D11 Respectively

int RPWM=3;
int LPWM=11;
int L_EN=7;
int R_EN=8;

  void setPWMfrequency(int freq){
   TCCR2B = TCCR2B & 0b11111000 | freq ;
  }
 
  void MotorActiveStatus(char Side,boolean s){
    boolean state=s;
    if(Side=='R'){
    digitalWrite(R_EN,s);
    }
    if(Side=='L'){
    digitalWrite(L_EN,s);
    }    
  }
  void setMotor(char side,byte pwm){
   if(side=='R'){
    analogWrite(RPWM,pwm);
   }
    if(side=='L'){
    analogWrite(LPWM,pwm);
   }
  }
  void closeMotor(char side){
     if(side=='R'){
    digitalWrite(RPWM,LOW);
     }
     if(side=='L'){
    digitalWrite(LPWM,LOW);
     }

     }
void setup() {
  // put your setup code here, to run once:
  setPWMfrequency(0x02);// timer 2 , 3.92KHz
  for(int i=5;i<9;i++){
   pinMode(i,OUTPUT);
  }
   for(int i=5;i<9;i++){
   digitalWrite(i,LOW);
  }
   delay(1000);
   MotorActiveStatus('R',true);
   MotorActiveStatus('L',true);
    Serial.begin(9600);
  }

void loop() {
  // put your main code here, to run repeatedly:
for(int i=0;i<256;i++){
  setMotor('R',i);
  delay(50);
}
delay(500);
closeMotor('R');
delay(1000);
  for(int i=0;i<256;i++){
  setMotor('L',i);
  delay(50);
}
delay(500);
closeMotor('L');
delay(1000);
}

 

Step 4: Arduino Mega Timer

For arduino MEGA 2560 ,  it has 5 timers  : 

timer 0 (controls pin 13, 4)
timer 1 (controls pin 12, 11)
timer 2 (controls pin 10, 9)
timer 3 (controls pin 5, 3, 2)
timer 4 (controls pin 8, 7, 6)

This code For arduino mega with Timer 1 and 3  :

// code for Arduino Mega2560 and BTS7960 Motor driver
// written by : Mohannad Rawashdeh

int RPWM=3;
int LPWM=11;
int L_EN=7;
int R_EN=8;

  void setPWMfrequency(int freq){
    TCCR1B = TCCR2B & 0b11111000 | freq ;
    TCCR3B = TCCR2B & 0b11111000 | freq ;
  }
 
  void MotorActiveStatus(char Side,boolean s){
    boolean state=s;
    if(Side=='R'){
    digitalWrite(R_EN,s);
    }
    if(Side=='L'){
    digitalWrite(L_EN,s);
    }    
  }
  void setMotor(char side,byte pwm){
   if(side=='R'){
    analogWrite(RPWM,pwm);
   }
    if(side=='L'){
    analogWrite(LPWM,pwm);
   }
  }
  void closeMotor(char side){
     if(side=='R'){
    digitalWrite(RPWM,LOW);
     }
     if(side=='L'){
    digitalWrite(LPWM,LOW);
     }

     }
void setup() {
  // put your setup code here, to run once:
  setPWMfrequency(0x02);// timer 2 , 3.92KHz
  for(int i=5;i<9;i++){
   pinMode(i,OUTPUT);
  }
   for(int i=5;i<9;i++){
   digitalWrite(i,LOW);
  }
   delay(1000);
   MotorActiveStatus('R',true);
   MotorActiveStatus('L',true);
    Serial.begin(9600);
  }

void loop() {
  // put your main code here, to run repeatedly:
for(int i=0;i<256;i++){
  setMotor('R',i);
  delay(50);
}
delay(500);
closeMotor('R');
delay(1000);
  for(int i=0;i<256;i++){
  setMotor('L',i);
  delay(50);
}
delay(500);
closeMotor('L');
delay(1000);
}

Share

Recommendations

  • Tape Contest

    Tape Contest
  • Arduino Contest 2019

    Arduino Contest 2019
  • Trash to Treasure

    Trash to Treasure

33 Discussions

0
None
JopWerff

2 months ago

Hello Mohannad,

You write in your 1st lines about an "half bridge" - what do you mean with an "half..."?

Here these lines:

"I want to write about a nice Motor driver Module , it's BTS7960 half bridge motor controller .

The BTS 7960 is a fully integrated high current half , bridge for motor drive applications , comes with Two package as in pictures ."

Is n't it this that you mean with "half" the H of H-bridge?

With regards,

Jop

0
None
imams42

3 months ago

Sorry sir can you help me, if the wiring in the connector is the output that is supposed to run the motor, can it be used to supply the battery with a constant voltage of 14 volts?

0
None
LukmanP2

Question 3 months ago

Hi!! Thanks for this tutorial, it really helps me. But I'm still confused. How to make a Simulink code with this driver, because it have 2 PWM Pin? Before use this driver, i use a L298N motor driver, and the simulink code works very well. But with the same code, and this driver, it does nothing. Oh i use Arduino Nano and a 12V DC motor on my project. Thanks for your help.

0
None
darryn2

4 months ago

Hi
One could run this driver chip without any pwm signal, I've found a very simple way to drive this chip if required without the need for pwm, just by using diodes, by making the enable pins high/low to drive the motor forward or reverse direction, with only 2 control pins to be used.(with certain combination of diodes and the pmw and enable pins)
Also if required to have the speed control, then just add two pots to make the out put variable.
I've made a wire cutter and used bts 7960 to driver a wiper motor for the cutter unit.
Let me know if any is interested to know more about this method.

Darryl

1 reply
0
None
Farrukh_darryn2

Reply 4 months ago

hi! do you have any tutorial?

0
None
Dicky A

Question 9 months ago on Step 4

hey can you help me? i have a problem with this driver. i have 2 motor DC 12V 5A, then i have a supply (accu) 12V 20AH. when i plug the wire into one of this driver, the output voltage from this driver only 5V and actually motor can't move. why? thanks for your attentions

1 answer
0
None
Mohannad RawashdehDicky A

Answer 9 months ago

check your connection first , then check if your battery is in good condition.

0
None
valdirpaz

Question 11 months ago

It's possible to use only one PWM to pwm pins (1and 2) so do the direct control (left, right) using the enables pins?

Thanks,

2 answers
0
None
Mohannad Rawashdehvaldirpaz

Answer 10 months ago

no , in this way if you enable the pins you , PWM is equal to pwm pins so it will not work
you can connect pne PWM pin to GND or VCC and connect the other to PWM pin in your board , so once you enable the driver you can control the speed of the motor using PWM .

0
None
valdirpazMohannad Rawashdeh

Answer 10 months ago

Hi Mohannad ,

Thanks for explanation! You helped me a lot.

Congratulation on the article!

0
None
ToddK4

1 year ago

I'm very confused about how this code was working. I can't follow it at all. Especially in the MEGA code, where the PWM pins don't even get set as OUTPUT. Do they default this way on power up? I don't have the driver board so I have no way to verify whether may understanding is valid or not.

It seems to me that when driving a motor using the two half bridges, L_EN and R_EN should both be turned on and one of the PWM signals should be active while the other is LOW. This connects the motor to the supply (based on the PWM settings) with a path to ground via the active low side of the opposite half-bridge.

At first, I was confused by the board having two separate enables, but after thinking about it, this allows two motors to be controlled independently (but only in one direction). A motor could be connected between one of the outputs on the terminal block and ground. The other output could control the second motor connected likewise.

I found this blog http://wordpress.bonairetec.com/?p=75 when trying to clear up my confused state after reading this instructable. You might want to take a look at it.

0
None
laoadam

1 year ago

Hi,

do you have the detail for how to connect a joystick to it and control the car?

Thanks

Adam

3 replies
0
None
laoadamMohannad Rawashdeh

Reply 1 year ago

Hi Mohannad thanks for your reply,
right now I have a 'Nintendo Nunchuk Controller '
like this:
https://www.amazon.co.uk/Nintendo-Nunchuk-Controller-Add-On-Wii/dp/B000IMYKQ0

If this no work, I can buy whatever working joystick.
Thanks
Adam

0
None
Mohannad Rawashdehlaoadam

Reply 1 year ago

for Nintendo Nunchuk Controller I don't know how it works "i don't have one either " but for other Joystick (for example like this : https://goo.gl/xQH5hi or this https://goo.gl/iqp5AN ) the joystick has x and y axis and give you 2 analouge signal for each axis , after that you can use your arduino board to see the voltage value for each axis .

now how do you want to control the car ? wireless ? like bluetooth or wifi or RF ?

0
None
RichardR246

2 years ago

HI,

I have a Nema 17, which I like to use bts7960. Do I use the VCC to supply 24v power to the motor.

1 reply
0
None

no for nema 17 you need to connect the power supply with 12V

better alternative : A4988

0
None
fbyic2015

3 years ago

hi

how or where can i download the bts7960 library for arduino?

2 replies
0
None
DonaldC32fbyic2015

Reply 2 years ago

You don't need a hardware specific library for this hardware, it is built for arduino, just use the standard PWM library, and that should take care of it.