大家好、
以下是客户提出的问题、可能需要您的帮助:
客户目前正在使用 DRV8303驱动 BLDC 电机。 电流感应存在问题。 如果电路板上未连接任何电机、并且未连接电机电压(PVDD)、则电流感测输出(SO1和 SO2)是正确的。
他们检查了 SN1和 SP1以及 SN2和 SP2是否正好为0V、这是正确的、因为没有电流流流过分流电阻器。 基准输入 REF 恰好为3.3V。SO1和 SO2引脚的输出为1.65V、这是正常现象。
要测试放大器是否正常工作、请移除连接到 SN1和 SP1引脚的分流电阻器、并手动向 SN1引脚施加电压(0.100V)、该电压本应会被放大、 而 SO1 (OUTPUT)引脚上的电压将降至0.65V (根据公式[1.65-(0.1*10)]将 C.S.A.的增益设置为10V)。 但是、SO1引脚上的电压保持为1.65V。 C.S.A 的输出对输入无响应。
原理图和电路如下:
返修: https://drive.google.com/file/d/1lv5I7GT6esK-80-wN8fSaVhWlB1ejIwC/view?usp=sharing
Sch: https://drive.google.com/file/d/1lvBKcgRM2TCG_ksn0xLjSbLgVWraZkdn/view?usp=sharing
代码如下所示:
#include <SPI.h>
#define INHA PA8
#define INLA PA9
#define SO1 PB1
#define INHB PA10
#define INLB PB6
#define SO2 PB0
#define INHC PB7
#define INLC PB8
#define LED PC13
#define EN_GATE PB12
#define NOCTW PB14
#define NFAULT PB13
#define chipSelectPin PA4
word data;
void changeSPI3PWM()
{
digitalWrite(chipSelectPin, LOW); // manually take CSN low for SPI_1 transmission
data = SPI.transfer16(0b0001000000111000); //0 0010 00000111000
digitalWrite(chipSelectPin, HIGH);
}
void changeCurrentSense() {
digitalWrite(chipSelectPin, LOW);
data = SPI.transfer16(0b000110000000000); //0 0011 0000000000
digitalWrite(chipSelectPin, HIGH);
}
void setup() {
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1);
SPI.setClockDivider(SPI_CLOCK_DIV16);
pinMode(chipSelectPin, OUTPUT);
Serial.begin(115200);
pinMode(INHA, OUTPUT);
pinMode(INLA, INPUT);
pinMode(SO1, INPUT);
pinMode(INHB, OUTPUT);
pinMode(INLB, INPUT);
pinMode(SO2, INPUT);
pinMode(INHC, OUTPUT);
pinMode(INLC, INPUT);
pinMode(EN_GATE, OUTPUT);
pinMode(PB4, OUTPUT);
pinMode(NOCTW, INPUT);
pinMode(NFAULT, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(PB4, LOW); //PB4 is the DC_CAL PIN
digitalWrite(EN_GATE, HIGH);
changeSPI3PWM();
changeCurrentSense();
}
void loop() {
digitalWrite(INHB, HIGH);
digitalWrite(INHA, HIGH);
digitalWrite(INHC, HIGH);
if (digitalRead(NFAULT) == LOW) {
Serial.println("NFault low");
}
if (digitalRead(NOCTW) == LOW) {
Serial.println("NOCTW low");
}
Serial.print(Current_Calculation(analogRead(SO1) / 4096. *3.3), 10);
Serial.print(" ");
Serial.println(Current_Calculation(analogRead(SO2) / 4096. *3.3), 10);
}
double Current_Calculation(double RawVolt) {
const double K = 2. ;
const double G = 80.;
const double VREF = 3.3;
return (VREF - (K * RawVolt)) / (G * K); //general solve
}
出现此错误的最可能原因是什么? 您可以帮助检查此案例吗? 谢谢。
此致、
樱桃