Quantcast
Channel: Motor drivers forum - Recent Threads
Viewing all articles
Browse latest Browse all 15412

DRV8823 current limited

$
0
0

Dear TI Team,

I'm currently working on a redesign of a product using your DRV8823 to drive 3 DC motor actuated valves and 1 solenoid valve (old design used 2 L298 motor drivers). The new design also incorporates an SN65HVS880 input serializer on the same SPI bus which I already got working successfully. 

Using the DRV8823 has been a bit more problematic, after a couple of days trying to troubleshoot it I think I'm at the point that I need your help. I'm managing to control each of the 4 bridges (getting +24V- 0  -24V as per my test routine) , but when I connect the motors the current gets limited to about 300mA, not enough to make the valves move. During normal operation one valve draws about 1.2A and takes only 1s to get from open to close position or vice versa.

I'm feeding 2.53V to the ABREF & CDREF pins through a voltage divider which is fed from the 5V supply of the SN65GVS880. The current sense resistors are 0.33ohms.

I've tried changing the 3 current regulation bits and other configuration combinations but to no avail. The test code which I'm currently using is posted below.

Any suggestions would be greatly appreciated.

Best Regards,

Loic

//DRV8823
// the motor driver communicates using SPI, so include the library:
#include <SPI.h>

const int csSrlzrPin = 8; //SN65HVS880 serializer CS, not used in this test code
const int loadSrlzrPin = 13; //SN65HVS880 serializer load pin

const int csMotorPin = 9; //DRV8823 CS pin
const int sstbMotorPin = 3; //DRV8823 sstb pin

const int channel = 1; //choose which motor channel we want to drive


int byte1 = B00011100; //initial state of DRV8823 control byte1
int byte2 = B00000111; //initial state of DRV8823 control byte2

void setup() {
    
  // initalize the load and chip select pins:
  pinMode(csSrlzrPin, OUTPUT);
  pinMode(loadSrlzrPin, OUTPUT);
  pinMode(csMotorPin, OUTPUT);
  pinMode(sstbMotorPin, OUTPUT);
  
  digitalWrite(csSrlzrPin,HIGH); 
  digitalWrite(loadSrlzrPin,HIGH); 
  digitalWrite(csMotorPin,LOW); 
  digitalWrite(sstbMotorPin,LOW); 
 
  // start the SPI library:
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setClockDivider(SPI_CLOCK_DIV16);		// Divide MCU clock (16MHz) by 16, SCK = 1MHz
  SPI.setBitOrder(LSBFIRST);
}

void loop() {
 
  driveMotor(channel, 1); //turn motor in direction 1
  delay(1000);

  driveMotor(channel, 0); //turn off motor
  delay(3000);

  driveMotor(channel, 2); //turn motor in direction 2
  delay(1000);

  driveMotor(channel, 0); //turn off motor
  delay(3000);
  
}



void driveMotor(int ch, int mode) {
 
  switch (ch) { //manipulate bits based on motor CH and direction commands
  case 1: //CH1
  if (mode == 0) { //Turns motor CH1 off
  bitWrite(byte1, 0, 0); 
  }
  if (mode == 1) { //Turns motor CH1 on in direction 1
  bitWrite(byte1, 0, 1);
  bitWrite(byte1, 1, 0); 
  
  
  }
  if (mode == 2) { //Turns motor CH1 on in direction 2
  bitWrite(byte1, 0, 1); 
  bitWrite(byte1, 1, 1); 
  }
  bitWrite(byte2, 4, 0); 
  break;
 
  case 2: //CH2
  if (mode == 0) {
  bitWrite(byte1, 6, 0); 
  }
  if (mode == 1) {
  bitWrite(byte1, 6, 1);
  bitWrite(byte1, 7, 0);
  }
  if (mode == 2) {
  bitWrite(byte1, 6, 1);
  bitWrite(byte1, 7, 1); 
  }
  bitWrite(byte2, 4, 0); 
    // statements
    break;
    
  case 3://CH3
  if (mode == 0) {
  bitWrite(byte1, 0, 0); 
  }
  if (mode == 1) {
  bitWrite(byte1, 0, 1);
  bitWrite(byte1, 1, 0); 
  }
  if (mode == 2) {
  bitWrite(byte1, 0, 1); 
  bitWrite(byte1, 1, 1); 
  }
  bitWrite(byte2, 4, 1); 
    // statements
    break;
    
  case 4://CH4
  if (mode == 0) {
  bitWrite(byte1, 6, 0); 
  }
  if (mode == 1) {
  bitWrite(byte1, 6, 1);
  bitWrite(byte1, 7, 0);
  }
  if (mode == 2) {
  bitWrite(byte1, 6, 1); 
  bitWrite(byte1, 7, 1); 
  }
  bitWrite(byte2, 4, 1); 
  break;
  
}
  
  
//Transfer control bits via SPI to DRV8823  
  
  
  // take the SS pin high to select the chip:
  digitalWrite(csMotorPin,HIGH);
  
  //  send in the address and control bits via SPI:
  SPI.transfer(byte1);
  SPI.transfer(byte2);
  
  // take the SS pin low to de-select the chip:
  digitalWrite(csMotorPin,LOW); 
  
  //latch data from SPI holding register to motor control
  digitalWrite(sstbMotorPin, HIGH); 
  delayMicroseconds(1);
  digitalWrite(sstbMotorPin, LOW); 
  
}


Viewing all articles
Browse latest Browse all 15412

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>