大家好、
以下是客户提出的问题、可能需要您的帮助:
客户目前正在使用 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 }
出现此错误的最可能原因是什么? 您可以帮助检查此案例吗? 谢谢。
此致、
樱桃