Part Number:DRV8305
你好,我设计了一个stm32f401+dvr8305的电机驱动方案,dvr8305外围电路是按照datasheet的8.2 typical application搭建的,Vcc=3.3v,PVDD=12v(使用可调电源供电),之前遇到了通讯问题(后已经解决)我现在遇到了以下新的技术问题:
我在使用stm32单片机芯片对dvr8305进行驱动,使用的是st公司的电机驱动策略。之前在启动时会出问题,在开始的开环阶段电机动一下就停了下来了,nfault引脚变低电平,判断是PVDD欠压,之后修改了PVDD_UV_PWRGD(0xB bit2)解决了这个问题。现在启动时仍然存在PVDD欠压,电机在开始的开环阶段能工作,但是到了闭环就停了下来。
于是我自己设计了一个6步控制程序,去驱动电机启停,目前出现了发现了电机的转速慢,会发热。以下是我的示波器测量结果。我的示波器只有2通道,只能显示2个波形,只测量了电机A相关信息。
DRV8305 A相输入引脚信号
DRV8305 A相输出引脚(未连接电机)
DRV8305 A相输出引脚和一些放大图(连接电机)
DRV8305 A相电压测量(通道1)(连接电机)
DRV8305工作电压PVDD(原本为12v,但是降压至4.3v)和Vcc(连接电机)
以上是我的一些测量结果,貌似测量波形和正常的波形不太一样,请问我该如何解决这些问题?
Cherry Zhou:
您好,您的问题我们需要升级到英文论坛看下,有答复尽快给您。
,
Cherry Zhou:
您好,
建议您使用输出介于4.4V 和45V 之间的降压转换器(4.3V 有点低)。 DRV8305具有一个内部 LDO 来处理类似的电压。 可能是换向问题。工程师正在查看中,会在明天给到您更详细的答复。
,
? ?:
我使用的是12v的可调稳压电源,drv8305工作时强制降压到了4.3v
,
Cherry Zhou:
您好,
该器件的额定工作电压范围为datasheet中的建议额定值,建议工作电压范围为4.4V 至45V。 所使用的电流电压低于建议的工作条件。 使用 LDO可以在更低的电压(低至4.3V)下运行,但不会驱动电机或产生良好的性能。 如果在更高的电压下运行无法解决问题请告知我们。
,
? ?:
上面我提供的是12可调电源供能,驱动板在工作瞬间会降压到4.3v,不是正常的工作范围。电机驱动板本来是使用12v(误差1v)的电池进行供电,通过一个LDO芯片转化为3.3v电压。
接下来所有的图片和描述都是基于12v电池供电,六步控制法驱动。
未连接电机时,驱动板开始工作后的电压见图2-1a和b,可以看出GHA、GLA和SHA的输出是比较正常的。
连接电机后,驱动板在工作不超过0.3s的时间内停止工作GHA、GLA和SHA的输出如图2-2a和b所示
驱动板未工作前PVDD=12v,Vcc=3.3v,但是工作开始后不到0.2s就发生故障停下来了,PVDD和Vcc也发生了改变(如图2-3a所示),整个驱动板无法工作,PVDD和Vcc的电压见图2-3b。
针对这个现象,我该怎么解决?
图2-1a(电池供电) DRV8305 A相输出引脚(未连接电机)
图2-1b (电池供电) DRV8305 A相输出引脚(未连接电机)
图2-2a (电池供电) DRV8305 A相输出引脚(连接电机)
图2-2b (电池供电) DRV8305 A相输出引脚(连接电机)
图2-3a(电池供电) DRV8305 工作测量的电压(连接电机)
图2-3b(电池供电) DRV8305 工作后测量的电压(连接电机)
,
Cherry Zhou:
您好,
目前的故障是否仍列为 PVDD_UV?还是说有所不同?
此外,请问slew rate是多少?
,
? ?:
1目前的故障是否仍列为 PVDD_UV?还是说有所不同?
2请问slew rate是多少?
针对问题1,我的驱动板返回的DRV8305寄存器信息如表3-1所示。寄存器16进制表示,表现形式为b10-b0,例如0b 100 1000 0001表示为481,0b 000 0000 0001表示为1。我的驱动板驱动流程对drv8305的操作是这样的,1上电→2初始化→3六步控制。可以看到故障发生时的一小段时间内,PVDD_UVFL和VCPH_UVFL报错;之后就整个寄存器信息就一直全是0了
表3-1 DRV8305六步驱动控制过程中的所有寄存器信息
1上电后
2上电
初始化后
3六步驱动开始时
4故障时
5故障后
0x1: 0
0x2: 0
0x3: 0
0x4: 0
0x5: 344
0x6: 344
0x7: 216
0x8: 0
0x9: 20
0xa: 0
0xb: 10a
0xc: 2c8
0x1: 0
0x2: 0
0x3: 0
0x4: 0
0x5: 344
0x6: 344
0x7: 216
0x8: 0
0x9: 2a1
0xa: 0
0xb: 10e
0xc: 2c8
0x1: 0
0x2: 0
0x3: 0
0x4: 0
0x5: 344
0x6: 344
0x7: 216
0x8: 0
0x9: 2a1
0xa: 0
0xb: 10e
0xc: 2c8
0x1: 490
0x2: 0
0x3: 20
0x4: 0
0x5: 344
0x6: 344
0x7: 216
0x8: 0
0x9: 2a1
0xa: 0
0xb: 10e
0xc: 2c8
0x1: 0
0x2: 0
0x3: 0
0x4: 0
0x5: 0
0x6: 0
0x7: 0
0x8: 0
0x9: 0
0xa: 0
0xb: 0
0xc: 0
针对问题2,我不是很清楚slew rate是什么意思。
如果是根据datasheet里8.2.2.2节的MOSFET Slew Rate = MOSFET QGD / IDRIVE Setting
我使用的mosfet型号是IRFH7085PbF,datasheet上标明MOSFET QGD=36NC,
MOSFET Slew Rate1 = 36 nC (QGD) / 60 mA (IDRIVEN) = 600 ns
MOSFET Slew Rate2 = 36 nC (QGD) / 50 mA (IDRIVEP) = 720ns
,
Cherry Zhou:
您好,
该器件还报告了 AVDD 欠压故障。 请检查并确保遵循了datasheet第16页列出的原理图建议。请参考以下帖子:
(+) DRV8353: Charge Pump undervoltage Fault – Motor drivers forum – Motor drivers – TI E2E support forums
在处理电荷泵误差时需要考虑一个因素,即确保电容器的额定电压适当。 通常,我们喜欢使用额定电压为其将承受电压两倍的陶瓷电容器。
,
? ?:
你好,
谢谢你提供的帮助,我看了链接里的内容,里面好像是在说建议CP1L和CP1H、CP2L和CP2H之间的电容的耐压值需要在两倍电压的以上。图3-1和3-2这是我设计驱动板原理图中的drv8305芯片的周边元器件相关信息。图中VBat_D=PVDD=12v,VCC3.3v=Vcc=3.3v。C22和C23的标称额定电压为50v,应该完全能满足要求。请问还有什么需要改进的地方?
图3-1
图3-2
,
Cherry Zhou:
我们再跟进给工程师确认下吧。
,
Cherry Zhou:
? ? said:可以看到故障发生时的一小段时间内,PVDD_UVFL和VCPH_UVFL报错;之后就整个寄存器信息就一直全是0了
这是因为 C18和 C19。 当连接到 VBAT_D 时,它们的额定电压为16V,这会导致直流偏置。 因此电容器的有效电容将会降低,VCPH 的 ABS_MAX 额定值为 PVDD+12V,因此我们会给 C18和 C19使用两倍的额定电压(~50V)。
,
? ?:
你好,我这几天购买了2.2uf/50v和4.7uf/50v的电容并把它更换到驱动板上。但是测试完之后和之前的故障情况一样,问题没有得到解决
,
Cherry Zhou:
我们已update给工程师,链接也给您贴在下面:
e2e.ti.com/…/drv8305-there-is-a-thermal-noise-issue-in-the-motor-drive
,
Annie Liu:
谢谢您的等待。
请问您可以:
1. 提供VCPH 到 GHx 和 VCP_LSD 到 GLx 电阻测量吗?
2. 提供电荷泵相对于 GND 的波形吗?
3. 是否尝试过将电机连接到 EVM,看看在不使用你们的板时问题是否仍然存在?
4. 问题发生时您可以测量 AVDD 吗?
,
? ?:
你好,我们最近购买了DRV8305的评估板,与STM32的基础电路板接线之后,现在的测试结果如下:
DRV8305-EVM
自制驱动板
RVCPH-GHA(Ω)
0.439
1.720M
RVCPLSD_GLA(Ω)
0.486
0.495M
VVCPH-GND(V)
22v(未连电机)、9.6v(连接电机)
22v(未连电机)、unkown(连接电机)
VAVDD-GND(V)
4.5v
4.51v(故障时为0v)
我们发现DRV8305-EVM在工作过程中0x01寄存器中也会存在090的故障报警现象,与驱动板相似,但是我们的六步控制法程序在其他的驱动方案是能正常工作的。这是我们的六步驱动程序,g_iMotorPFlag每10ms置一次1,请问有什么问题吗:
//死循环
if(g_iMotorPFlag)
{
g_iMotorPFlag=0;
count1++;
liubukongzhi(count1);
if(count1>=6) count1=0;
}
//六步控制法
void liubukongzhi(int j)
{
switch(j)
{
case 1:
HAL_GPIO_WritePin(INH_A_GPIO_Port,INH_A_Pin,GPIO_PIN_SET);//A+
HAL_GPIO_WritePin(INL_A_GPIO_Port,INL_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INH_B_GPIO_Port,INH_B_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_B_GPIO_Port,INL_B_Pin,GPIO_PIN_SET);//B-
HAL_GPIO_WritePin(INH_C_GPIO_Port,INH_C_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_C_GPIO_Port,INL_C_Pin,GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_WritePin(INH_A_GPIO_Port,INH_A_Pin,GPIO_PIN_SET);//A+
HAL_GPIO_WritePin(INL_A_GPIO_Port,INL_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INH_B_GPIO_Port,INH_B_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_B_GPIO_Port,INL_B_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INH_C_GPIO_Port,INH_C_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_C_GPIO_Port,INL_C_Pin,GPIO_PIN_SET); //C-
break;
case 3:
HAL_GPIO_WritePin(INH_A_GPIO_Port,INH_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_A_GPIO_Port,INL_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INH_B_GPIO_Port,INH_B_Pin,GPIO_PIN_SET);//B+
HAL_GPIO_WritePin(INL_B_GPIO_Port,INL_B_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INH_C_GPIO_Port,INH_C_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_C_GPIO_Port,INL_C_Pin,GPIO_PIN_SET);//C-
break;
case 4:
HAL_GPIO_WritePin(INH_A_GPIO_Port,INH_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_A_GPIO_Port,INL_A_Pin,GPIO_PIN_SET);//A-
HAL_GPIO_WritePin(INH_B_GPIO_Port,INH_B_Pin,GPIO_PIN_SET);//B+
HAL_GPIO_WritePin(INL_B_GPIO_Port,INL_B_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INH_C_GPIO_Port,INH_C_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_C_GPIO_Port,INL_C_Pin,GPIO_PIN_RESET);
break;
case 5:
HAL_GPIO_WritePin(INH_A_GPIO_Port,INH_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_A_GPIO_Port,INL_A_Pin,GPIO_PIN_SET);//A-
HAL_GPIO_WritePin(INH_B_GPIO_Port,INH_B_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_B_GPIO_Port,INL_B_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INH_C_GPIO_Port,INH_C_Pin,GPIO_PIN_SET);//C+
HAL_GPIO_WritePin(INL_C_GPIO_Port,INL_C_Pin,GPIO_PIN_RESET);
break;
case 6:
HAL_GPIO_WritePin(INH_A_GPIO_Port,INH_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_A_GPIO_Port,INL_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INH_B_GPIO_Port,INH_B_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(INL_B_GPIO_Port,INL_B_Pin,GPIO_PIN_SET);//B-
HAL_GPIO_WritePin(INH_C_GPIO_Port,INH_C_Pin,GPIO_PIN_SET);//C+
HAL_GPIO_WritePin(INL_C_GPIO_Port,INL_C_Pin,GPIO_PIN_RESET);
break;
}
}
,
Cherry Zhou:
已跟进给工程师查看。
,
Cherry Zhou:
我们需要多一些时间来debug您的问题。
此外是否方便提供以下信息:
-电荷泵相对于 GND 的波形
-有关您的电源的更多详细信息。 您是否可以关闭电源,尝试使用新电源,然后向我们提供性能波形? 这似乎是主要问题,因为故障全部是 PVDD_UV, CP_UV 和 AVDD_UV误差,而且电容器额定值似乎没问题。
,
? ?:
你好,我的电源一个是MD-3010D可调电源,另一个是12V的电池。
型号
工作电压
工作电流
输出功率
MS3010D
0.00V-32.0V
0.00A-10.2A
300W
我现在用的是DRV8305-EVM评估板做的测试,使用六步驱动法驱动DRV8305-EVM评估板时,可调电源设置的输出电压(即PVDD)是12V,可调电源上显示六步驱动法工作过程中,输出电压会降至7.3V,输出电流为9.4A。示波器测到的VVCPH-GND和VPVDD-GND分别为12.4V和5.27V 。
电池供电和之前一样启动后很短时间内就停止工作,没法测量。
抱歉,我周边没有其他的电源可以供测试了。可调电源在其他的电机驱动方案中对同一个电机进行驱动时是能够正常工作,我猜应该不是电源的问题。
,
? ?:
对了,我问下使用DRV8305是不是一定要使用TI的mcu和ti的电机驱动方案?DRV8305能否兼容其他的外部的电机驱动方案,例如odrive、simplefoc、stmc等,有没有类似的案例啊?
,
Cherry Zhou:
我们跟进给工程师看下。
,
Cherry Zhou:
您电源上设置的电流限制是多少? 当负载连接到电源(即电机)并且在输出上设置了电流限制时,电压将相应地发生变化。 这可能是您面临的问题。
此外,DRV8305还与其他 MCU 兼容。
,
? ?:
你好,我找到我的驱动方案的问题所在了,drv8305的比较放大增益系数和其他开源方案方向是不一样的,需要对准方向,调整好之后能够完美运行。