This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hi, I have DRV 8301 designed with circuitry same as given in reference design of its datasheet.
I have not connected 22 uH inductor to the circuitry as it was causing high current issue for microcontroller as %v from microcontroller was connected to Vcc end of inductor.
Rest of the circuitry is same except inductor is removed. The I applied PWM to all the 6 pins of DRV8301 then I observed that no PWM out at any GH_X and GL_X is working. While debugging I found that GVDD pin has 0V always. And nFault pin is low and OCTW is high.
And PWRGD is low, nFault pin is low and OCTW is high. This indicates that there is shutdown due to low voltage as GVDD low status indicates the same. Also no MOSFET related circuitry is connected to DRV8301.
Why is GVDD low all the time? I have just connected 2.2uF to GVDD to ground. Also IC gets heated ver quickly to temperature of 100 C. I don't understand why this is happening, Any ideas!!
Hi Rick,
Thanks for your reply,
Yes, powerPAD is connected to ground.
And EN_GATE is logic high before starting with anything and I wait for 20 msec after EN_GATE is high.
AVDD = 6.3V
DVDD = 2.7V
GVDD = 0.1V
No motor is not connected to circuitry.
I tried reading SPI registers but no luck and I believe it is because of undervoltage shutdown as SPI block stops responding to external commands (as per the datasheet).
Hi Rick,
I just manually connected ground pin to EN_BUCK (pin 55 of DRV8301 IC) and PWM is suddenly working. Prior to connecting EN_BUCK to ground its voltage was 2.7V. But just as I ground EN_BUCK PWM and SPI are working fine.
I have set always,
PVDD1 = 24V
PVDD2 = 24V
and If EN_BUCK = 0V (manually connected to ground)
GVDD = 11V
AVDD = 6.3V
DVDD = 3.3V
is observed.
and If EN_BUCK = 2.2V (left floating)
GVDD = 0.1V
AVDD = 6.3V
DVDD = 2.7V
is observed.
Q1: I'm keeping EN_BUCK to 0V for now but what should be its value ideally?
Q2: Also I'm writting 3-phase command to SPI with register value of 0x1008 and when I read it for the first time I get 0x1008 as return value which is I believe correct for 3-pwm mode. But when I try to read same register again then I just get 0x1400 as return value. Why is 0x1008 overwritten automatically if that's what happened?
Q3: Sometimes SPI just returns 0x0000 or i.e. doesn't return anything and in that case I keep reading with the same command then with tries of 2 or 3 I get success. Why is SPI communication unreliable?
Q4: Even when I do not apply PWM and EN_BUCK=0V then there is by default a PWM signal of 3.3V at the GX_X pins of DRV8301. When I apply PWM at INX_X pins I get output very noisy PWM (not rectangular in shape but shape like that of capacitor charging) of 5V only, how do I increase this output voltage of PWM to say 8V??
I'm using following code on arduino mega,
#include <SPI.h>
const int HpinA =11;
const int LpinA =10;
const int HpinB =9;
const int LpinB =6;
const int HpinC =5;
const int LpinC =3;
const int chipSelectPin = 53;
const int EN_GATE = 8;
boolean is3PMWmode = false;
byte Hcheck3PWM = 0x00,Lcheck3PWM = 0x00;
void setup() {
Serial.begin(9600);
pinMode(chipSelectPin, OUTPUT);
pinMode(EN_GATE, OUTPUT);
digitalWrite(EN_GATE, LOW);
digitalWrite(chipSelectPin, LOW);
SPI.begin();
// DRV8301 communicates with MSB first and has low clock polarity and data is shifted on rising edge
// SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE1));
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1); // While Idle SPI CLK = 0, falling Egde latching for Rx
digitalWrite(EN_GATE, HIGH);
delay(20); // Start up time
}
void loop() {
if(Hcheck3PWM == 0x10 && Lcheck3PWM == 0x08){
is3PMWmode = true;
runPWM();
}
if(!is3PMWmode){
writeRegister(0x02,0x08);
readRegister(0x02);
delay(1000);
}
if(Serial.available()){
int rcmd = (int)Serial.read();
if(rcmd==0x31){
readRegister(0x02);
}
if(rcmd==0x30){
writeRegister(0x02,0x08);
}
}
}
unsigned int readRegister(byte Register ) {
byte HdataToSend = 0x80,LdataToSend = 0x00,HdataToRead = 0x00,LdataToRead = 0x00;
// bit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// R=1/W=0 |-Raddr--| |-----------Data---------------------|
// Fault=1/0 |-Raddr--| |-----------Data---------------------|
HdataToSend = HdataToSend | Register << 3;
Serial.print("Sending read command: ");
Serial.print(HdataToSend,HEX);Serial.print(" ");Serial.println(LdataToSend,HEX);
digitalWrite(chipSelectPin, LOW);
SPI.transfer(HdataToSend);
SPI.transfer(LdataToSend);
digitalWrite(chipSelectPin, HIGH);
digitalWrite(chipSelectPin, LOW);
HdataToRead = SPI.transfer(0x00);
LdataToRead = SPI.transfer(0x00);
digitalWrite(chipSelectPin, HIGH);
Hcheck3PWM = HdataToRead;
Lcheck3PWM = LdataToRead;
Serial.print(HdataToRead,HEX); Serial.print(" ");Serial.println(LdataToRead,HEX);
}
void writeRegister(byte Register, byte Value) {
byte HdataToSend = 0x00,LdataToSend = 0x00,HdataToRead = 0x00,LdataToRead = 0x00;
// bit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// R=1/W=0 |-Raddr--| |-----------Data---------------------|
HdataToSend = HdataToSend | Register <<3 ;
LdataToSend = Value;
Serial.print("Sending write command: ");
Serial.print(HdataToSend,HEX); Serial.println(LdataToSend,HEX);
digitalWrite(chipSelectPin, LOW);
SPI.transfer(HdataToSend);
SPI.transfer(LdataToSend);
digitalWrite(chipSelectPin, HIGH);
Serial.print(HdataToRead,HEX); Serial.print(" ");Serial.println(LdataToRead,HEX);
}
void runPWM() {
delay(1000);
pinMode(HpinA,OUTPUT);
pinMode(LpinA,OUTPUT);
pinMode(HpinB,OUTPUT);
pinMode(LpinB,OUTPUT);
pinMode(HpinC,OUTPUT);
pinMode(LpinC,OUTPUT);
analogWrite(HpinA,200);
analogWrite(LpinA,50);
analogWrite(HpinB,100);
analogWrite(LpinB,100);
analogWrite(HpinC,100);
analogWrite(HpinC,100);
}
Hi Rick,
I have posted screen shot of CRO captures of the PWM outputs. Please review those captures and provide insight on what is possibly going wrong?