尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DRV8301电机驱动板实战:从原理图到PCB设计与SPI配置全解析

DRV8301电机驱动板实战:从原理图到PCB设计与SPI配置全解析 画电机驱动板这件事我最早是打算用6个MOS管自己搭三相桥的。当时想得很简单不就是六路PWM去推六个管子嘛。结果真到画原理图的时候才发现栅极驱动不是接个三极管就完事的高边MOS管浮地驱动靠什么供电、上下管怎么防直通、过流了怎么快速保护、三路电流采样放大器用什么样的方案这些问题每一个都能让板子多烧几个版本。后来改成DRV8301把这些底层问题打包给芯片处理整个项目才真正跑起来。这篇文章就围绕从原理图到PCB绘制DRV8301驱动板的完整过程展开把关键器件怎么选型、每个模块怎么连线、SPI初始化代码怎么写、以及我实际调试时踩过的坑都整理出来。准备画第一块电机驱动板的朋友或者FOC算法已经写好但还在为功率板发愁的朋友这篇文章基本就是照着抄作业的底稿。我自己用的是Altium Designer和立创EDA两个工具画过不同版本原理图到PCB的流程在哪个工具里都差不多文中不会绑定某个特定软件。1. 为什么这块驱动板要选DRV8301从手搓三相驱动到一体化方案1.1 手搓三相驱动电路的真实成本先说说我当时想自己搭方案时算的一笔账。三相全桥需要6颗MOS管这好办。但栅极驱动部分低边MOS管可以直接用半桥驱动芯片高边MOS管的栅极电压必须高于母线电压这就绕不开自举浮地或者隔离电源。用自举方案要加自举电容、自举二极管还要算高边PWM占空比不能太大否则自举电容充不上电用隔离电源方案一个隔离模块几十块钱BOM成本直接上去。还没完。电机相电流是要做闭环的FOC至少要两路电流采样方波控制也最好三路都采。分立方案一般用运放搭差分放大电路需要处理共模电压、偏置、滤波调试起来又是一堆事。再加上过流保护得自己弄比较器加基准源或者依赖MCU的ADC快速判断反应速度远不如硬件保护。我那时候大概估算了一下分立方案要额外加至少6到8颗有源器件原理图复杂度翻倍PCB布局面积变大每个器件的寄生参数都会影响最终波形。最痛苦的还不是画板是调试某天波形突然抖了你根本不知道是运放偏置漂了、电容老化了还是PCB走线干扰。与其这样不如选一颗集成度高的驱动芯片。1.2 DRV8301内部到底帮你干了哪些活DRV8301是TI推出的三相栅极驱动芯片它把驱动板最核心的一层东西都做进去了。我按功能分块说一下三相半桥栅极驱动器能直接驱动6颗N沟道MOSFET内置电荷泵和自举管理逻辑高边驱动不再需要你操心浮地问题。三个电流检测放大器CSA专门为低边采样电阻设计增益可以通过SPI配置成10、20、40、80 V/V输出直接给MCU的ADC省掉外部运算放大器。内置Buck降压转换器芯片内部有一个Buck控制器可以从母线电压降压输出给MCU或逻辑部分供电很多评估板上直接用它输出3.3V。SPI可配置保护过流阈值、死区时间、电流放大器增益都可以通过寄存器配置不用改PCB就能调整参数。完整保护机制PVDD欠压锁定、GVDD欠压锁定、MOSFET过流保护、芯片过热保护故障状态通过nFAULT引脚和状态寄存器上报。有了这些原理图的核心部分就简化成“DRV8301 6颗MOS管 自举电容 采样电阻 MCU”。我给的判断是如果你的项目是PMSM或者BLDC驱动母线电压在中低压范围希望有一套可靠又容易调通的功率级DRV8301这类芯片是比搭分立方案更务实的选择。1.3 适合用DRV8301的项目画像与选型边界DRV8301也不是万能的。我自己做过几个板子之后对它的适用边界认识得更清楚。适合它的场景很典型24V、36V、48V电池供电的机器人关节、电动工具、水族水泵、无人机电调、伺服驱动器功率从几十瓦到几百瓦都常见。这类应用通常用FOC算法需要比较干净的电流采样信号和可靠过流保护DRV8301刚好都满足。配合STM32F103或者F405这类MCU画板难度和代码难度都处于“一个人搞定的范围”。但如果你做的是很小的玩具电机比如5V、12V电压、几安培电流那用带MOSFET的集成电机驱动芯片更划算没必要上一颗DRV8301加外部MOS管反过来如果你做的是几千瓦的大功率驱动器母线电压高、相电流大DRV8301的栅极驱动能力和QFN封装散热能力就不太够更适合用隔离型栅极驱动变压器方案、或者用Gate Driver IC加外部驱动级。选型的时候还有一点要留意DRV8301有不同后缀和车规版本工作电压范围、封装、SPI寄存器定义可能存在差异。我用的多数是DRV8301标准版本但每次拿到芯片我都会重新看对应型号的数据手册而不是背参数。2. 画原理图前先定架构电源树、采样电阻与自举电容的选型逻辑2.1 从PVDD开始的电源分配画原理图第一步不是放芯片而是把整块板的电源树画清楚。DRV8301驱动板上的电源需求大概是这样母线电源PVDD这是整个功率级的输入直接给三相半桥供电也进DRV8301内部做栅极驱动和Buck的输入。母线电压决定了系统的功率上限。栅极驱动电压GVDDDRV8301内部从PVDD降压产生大概是10V级别用于给栅极驱动器和自举电路供电。这个电压不需要外部提供但必须在外部接合适的去耦电容否则驱动能力不够。逻辑/控制电压MCU、编码器、传感器需要的3.3V或5V可以用DRV8301内置Buck输出也可以用外部DC-DC。用内置Buck的话要算好反馈电阻我一般习惯让Buck输出3.3V给MCU因为这样MCU的ADC参考和DRV8301的逻辑电平是对齐的。画一张电源分配草图会很直观地看到每一路电压从哪来、要供给谁、去耦电容放哪里。这块不提前规划后面画PCB的时候很容易出现MCU供电被功率回路干扰的问题。2.2 电流采样电阻怎么选电流采样是最容易拍脑袋但又不该拍脑袋的地方。DRV8301的电流放大器的输入是SP/SN差分对采样电阻放在低边MOS管源极和GND之间也就是低边采样方案。采样电阻的阻值直接影响满量程电流、采样电压和损耗需要综合计算。核心公式是采样电阻压降 相电流 × 采样电阻阻值DRV8301电流放大器的输入满量程一般在几百毫伏量级具体看数据手册和寄存器配置假设你希望峰值50A电流时采样电压不超过25mV那么采样电阻阻值大约等于25mV / 50A 0.5mΩ。反过来如果电流小、想提高信噪比可以用大一点的阻值。但阻值越大损耗越大损耗公式是P I²×R。我用一个表格估算一下不同阻值在不同电流下的情况采样电阻电流30A时压降电流30A时损耗电流50A时压降电流50A时损耗0.2mΩ6mV0.18W10mV0.5W0.5mΩ15mV0.45W25mV1.25W1mΩ30mV0.9W50mV2.5W从这个表格能看出来大电流场景用0.5mΩ甚至0.2mΩ比较合理小电流场景可以用1mΩ或2mΩ来保证信号幅度。采样电阻要选合金材料、低温度系数的品种引脚和焊盘要能承受对应功率的发热。2.3 自举电容与栅极电阻的取值逻辑DRV8301内部已经处理了高边驱动的大部分逻辑但外部还是要接自举电容和自举二极管。自举电容的容值选择要看高边MOS管的栅极总电荷Qg和PWM频率。自举电容的作用是给高边MOS管的栅极充放电提供一个悬浮的电源。当低边MOS导通时开关节点SH被拉到地GVDD通过自举二极管给自举电容充电当高边需要导通时就靠自举电容里存的电荷去驱动高边栅极。容值太小高边栅极电压会掉得厉害容值太大充电时间变长高占空比会来不及补充。我常用的经验是0.1uF到1uF之间具体可以按这个估算电容上的电荷量要远大于MOS管栅极总电荷也就是C×ΔV大于Qg。比如MOS管Qg是50nC自举电容电压变化允许0.5V那么C至少要50nC / 0.5V 100nF。实际因为还有漏电和损耗我一般会放大2到3倍。电容要用X7R等温度特性稳定的陶瓷电容耐压至少16V或25V。栅极电阻的选择也类似。栅极电阻用来控制MOS开关的dv/dt和di/dt阻值太大开关变慢损耗变大阻值太小容易振铃甚至损坏栅极。10Ω到22Ω是比较常见的范围。如果想加快关断速度可以在栅极电阻上并联一个二极管让开通电流走电阻、关断电流走二极管。2.4 不要忽略的去耦电容和逻辑电平问题DRV8301的PVDD引脚、GVDD引脚、Buck输出引脚都要放去耦电容而且去耦电容要靠近对应引脚放置不能隔了很远再接地。这是因为去耦电容的作用是为高频开关电流提供低阻抗回路放远了回路电感变大高频噪声就会通过引脚串进去。逻辑电平方面DRV8301的IN1、IN2、IN3是PWM输入一般兼容3.3V逻辑SPI接口的SDO/SDI/SCLK/nSCS也是3.3V逻辑域。如果你用的MCU是5V供电就需要加电平转换或者确认引脚是否容忍5V输入否则长期工作可能损坏芯片引脚。3. 原理图分块绘制电源、三相桥、电流采样和SPI接口逐个落地3.1 电源输入与滤波网络画原理图的时候我从电源入口开始这样思路比较清楚。PVDD入口处需要并联大容量电解电容和多个陶瓷电容形成宽频带滤波。电解电容容量一般上百微法到几百微法负责储能和低频纹波陶瓷电容用0.1uF到10uF不等负责滤除高频开关噪声。DRV8301的PVDD引脚附近必须放一颗0.1uF陶瓷电容才能保证芯片内部电路在高频开关时供电稳定。大电流母线上还要放一个或多个低ESR电解电容并尽量靠近MOS管的漏极。很多初学朋友画板的时候习惯把大电容放在板边入口结果功率环路过长开关尖峰非常高。GVDD引脚放4.7uF到10uF的去耦电容这个电容太小会导致栅极驱动能力下降。Buck输出电容根据负载电流选一般22uF陶瓷电容起步如果MCU外设有电机编码器等传感器可以加一颗100uF电解电容做余量。3.2 三相桥栅极驱动与MOSFET外围DRV8301的每一相输出有GH、GL、SH三个关键引脚分别对应高边栅极、低边栅极和开关节点。以A相为例GH_A通过一个栅极电阻接到高边MOS管的栅极。GL_A通过一个栅极电阻接到低边MOS管的栅极。SH_A接到高边MOS管的源极和低边MOS管的漏极连接点这是半桥的中点也就是电机相线输出。自举电容连接在BST_A和SH_A之间BST_A通过一个二极管接到GVDD。采样电阻从低边MOS管的源极接到GNDSP_A和SN_A作为差分输入接到采样电阻两端。MOS管的选择要和母线电压、相电流匹配。电压余量我一般留到1.5到2倍比如48V母线选100V规格的MOS管电流就看热耗散不能只看额定电流还要算导通损耗和开关损耗。还有一个细节GH到栅极的这一小段走线不要串电感元件也不要在栅极回路里加磁珠。磁珠在高频下会引入阻抗容易让栅极波形出现振铃。3.3 电流采样放大器网络DRV8301的电流采样放大器输出是SO_A、SO_B、SO_C连接到MCU的ADC引脚。SO输出是模拟电压信号建议在靠近MCU ADC引脚的地方加一级RC低通滤波比如100Ω串联电阻加1nF电容截止频率大概在1.6MHz左右可以滤掉一部分开关噪声。SP/SN差分输入引脚的走线在原理图阶段就要有意识地安排成一对差分信号而不是一根随便拉出去。采样电阻应该采用四线开尔文连接的思路功率电流从电阻的大焊盘流过而SP/SN信号线从电阻的内侧单独引出避免覆盖到功率电流路径上的压降。这部分在原理图阶段看起来只是两根线但到PCB阶段影响非常大。在立创EDA或Altium Designer里我给采样电阻做封装时会专门用两个小焊盘来对应SP/SN而不是直接连在大焊盘上。这样后面画PCB时才能保证开尔文连接不被破坏。3.4 SPI配置接口与故障反馈回路DRV8301的SPI接口有四根线SCLK、SDI、SDO、nSCS另外还有一个nFAULT开漏输出。nFAULT引脚我习惯接一颗10kΩ上拉电阻到3.3V然后接到MCU的GPIO中断引脚。一旦芯片内部检测到过流、欠压、过热等异常nFAULT会拉低MCU就能立刻知道出事了。SPI接口的芯片选择引脚nSCS我用MCU的普通GPIO控制这样方便软件上通过拉低拉高产生片选时序。SCLK和SDI/SDO在闲置时最好有确定的电平避免干扰导致误读写可以在SCLK上加下拉电阻或者在代码里把SPI外设设为在片选拉高时才激活。原理图阶段还有一件事值得提前做把MCU的引脚分配表列出来。比如我用STM32F103C8T6的时候三个PWM通道用TIM1的CH1、CH2、CH3及互补输出SPI用SPI1的PA5、PA6、PA7、PA4作为片选三个ADC通道用PA0、PA1、PA2。这些提前定好画原理图时引脚不会乱画PCB时走线也更顺畅。我把DRV8301常见引脚整理成一个简化表格方便画原理图时对照引脚功能引脚名连接目标关键注意事项电源输入PVDD母线电源、滤波电容靠近芯片放0.1uF电容栅极驱动电源GVDD去耦电容、自举二极管4.7uF以上电容高边栅极输出GH_A/B/C栅极电阻→高边MOS栅极走线尽量短低边栅极输出GL_A/B/C栅极电阻→低边MOS栅极走线尽量短开关节点SH_A/B/C高边源极、低边漏极、电机相线自举电容回接点自举电源BST_A/B/C自举二极管、自举电容电容靠近芯片放置电流采样输入SP_x/SN_x采样电阻两端开尔文连接电流放大器输出SO_xMCU ADC加RC滤波SPI接口SCLK/SDI/SDO/nSCSMCU SPI注意时序、片选故障输出nFAULTMCU GPIO中断上拉电阻10kΩ4. PCB布局布线的实战原则功率回路、采样走线与散热设计4.1 功率回路要“小环”不要“大圈”PCB布局里最重要的一件事是缩小功率换流回路的面积。三相桥的每个半桥都有一条关键的换流回路母线输入电容经过高边MOS、开关节点、低边MOS再回到电容负极。这条回路在开关瞬间di/dt非常大回路面积越大寄生电感越大关断时产生的电压尖峰就越高。我前一版板子就是因为母线电容放得离MOS管太远相线上测到的尖峰电压比母线电压高了将近一倍后来把电容挪到靠近MOS管漏极和源极之间尖峰马上降了下来。在实际布局时我会把母线电容放在半桥电路的正上方或正下方MOS管排列成一条线栅极驱动芯片靠近它们整个换流回路尽量重叠。对于电流比较大的走线可以用公式估算或经验值外层1oz铜厚10mil走线大约能过1A电流20mil能过2A但这是非常保守的经验值。功率路径我更推荐用大面积的铺铜或者加开窗镀锡而不是用一根细走线扛电流。特别是MOS管源极到采样电阻的连接必须用铺铜来减小电阻和电感。4.2 栅极驱动、自举电容与走线寄生参数栅极驱动信号GH、GL是高频开关信号走的路径虽然电流不大但阻抗要低、寄生电感要小。GH到栅极电阻之间、栅极电阻到MOS栅极之间走线长度尽量控制在毫米级不要绕来绕去。走线宽度建议在15mil以上能铺铜更稳妥。自举电容的位置很关键。我之前有一版设计自举电容放在芯片同一侧偏远的角落结果高边驱动波形明显塌陷。原因就是电容到芯片BST引脚、再到SH引脚的回路太长。后面改成把自举电容紧贴DRV8301的BST和SH引脚放置同样占空比下波形立刻正常了。还有一点MOS管栅极和SH节点之间其实天然存在一个回路如果栅极走线和源极走线围成的面积大开关时会产生明显的振铃。所以布局要把高边MOS的栅极路径和源极路径靠近走减小环路。4.3 电流采样走线的开尔文连接电流采样走线是信号完整性的重点。SP和SN是差分信号线必须从采样电阻的专用采样焊盘上单独引出并且尽量并行走线中间可以隔地线或者保持紧耦合。它们要远离GH、GL这些开关节点避免被开关尖峰耦合。什么是开尔文连接就是被测电压的引出点和流过电流的路径不是同一个接触点避免接触电阻和走线电阻带来的压降误差。你可以这样理解用万用表测电池电压如果把表笔夹在通往负载的大电流线上测到的电压会包含线缆自身的压降必须用另一对细导线直接触到电池端子上测。采样电阻走线同理。DRV8301的电流放大器是差分输入共模抑制能力不错但前提是SP和SN的走线阻抗尽量对称。如果一根长一根短或者一根离开关节点近一根远差分信号里就会混入不一样的噪声。我在画板时会在采样电阻下面尽量留一块完整地平面SP/SN走线在上面走形成良好的参考平面。4.4 QFN封装底部散热设计与过孔阵列DRV8301用的是QFN封装底部有一个大焊盘这个焊盘既是地连接也是主要的散热通道。如果散热做得不好芯片内部的热保护频繁触发板子会莫名其妙停机。PCB上对应底部焊盘的位置要开相同大小的铜皮区域然后打一排过孔阵列到内层和底层铜皮。过孔孔径0.3mm左右间距0.6到0.8mm注意过孔间距太密会导致焊盘吸热太多、焊接困难。底层对应区域也做成一块大铜皮不要在这个区域下面走敏感信号线否则正好被芯片的发热和开关噪声干扰。如果板子发热量很大还可以考虑把底层铜皮扩大到一定面积后加螺丝孔固定散热片。我在做48V方案时就在底层加了一块25平方厘米左右的铺铜区域芯片温度比不加散热铜皮低了不少。4.5 层叠设计与地平面处理双面板能不能做DRV8301驱动板能但很痛苦。双面板没有完整地平面功率回路和信号回路都靠走线连接寄生参数比较严重。我第一版就是双面板调试的时候电流采样噪声很大后来改成四层板噪声改善特别明显。四层板我推荐“信号/功率层 完整地平面 电源/功能层 信号/控制层”的叠层组合。第二层做完整地平面所有芯片的地引脚就近打过孔下去功率地和控制地在采样电阻的接地点附近单点汇合。很多朋友问功率地和控制地要不要分开。如果分开成两个地网络必须在某个单点连起来而且只能有一个点。这个点选在采样电阻的GND端比较合理这样功率电流不会流经控制电路的地控制地相对安静。但分开地网络也会带来麻烦如果分地没处理好地弹噪声反而更严重。所以我在实际项目里如果功率不是特别大还是倾向用完整地平面靠布局和走线来控制噪声。电源平面也要注意PVDD和Buck输出这些有较大电流的电源走线尽量用铺铜不要用细线。控制信号和功率信号在空间上分开从电气上形成“高低压隔离”的概念这里的隔离主要指爬电间距和电磁耦合不是指安全隔离。安全隔离需要额外的隔离器件不在这个板子的范围内。5. 固件骨架DRV8301的SPI配置与带死区PWM输出5.1 DRV8301的SPI帧结构DRV8301的SPI帧是16位大致结构是1位读写标志、5位寄存器地址、10位数据。具体每一位的定义要以数据手册为准但如果你拿到任何一个DRV8301的例程底层逻辑基本都是这样。写操作时MCU把16位帧通过SDI发进去读操作时MCU同样发一个读命令帧芯片在SDO上把对应寄存器的值移出来。所以读操作需要同时进行发送和接收。SPI模式方面我见过不少例程用的是Mode 1CPOL0、CPHA1但不同版本和不同电路板可能不一样。如果读回来的寄存器值全是0xFF或者0x00优先怀疑SPI模式配置和片选时序。初始化前我强烈建议先读一遍Status寄存器看看上电后芯片处于什么状态。如果故障位已经置1后面配置寄存器也可能不生效。5.2 底层SPI读写函数下面这段是STM32 HAL库风格的DRV8301 SPI底层读写函数。核心就是把16位帧拆成两个字节发送并且片选信号在整帧传输期间保持低电平。#define DRV8301_STATUS1_REG 0x00 #define DRV8301_STATUS2_REG 0x01 #define DRV8301_CONTROL_REG 0x02 #define DRV8301_GATE_CTRL_REG 0x03 #define DRV8301_OCP_CTRL_REG 0x04 #define DRV8301_CSA_CTRL_REG 0x05 static void drv8301_cs_low(void) { HAL_GPIO_WritePin(DRV_CS_GPIO_Port, DRV_CS_Pin, GPIO_PIN_RESET); } static void drv8301_cs_high(void) { HAL_GPIO_WritePin(DRV_CS_GPIO_Port, DRV_CS_Pin, GPIO_PIN_SET); } static uint16_t drv8301_spi_transfer16(uint16_t frame) { uint8_t tx[2]; uint8_t rx[2]; uint16_t result; tx[0] (frame 8) 0xFF; tx[1] frame 0xFF; drv8301_cs_low(); HAL_SPI_TransmitReceive(hspi1, tx, rx, 2, 10); drv8301_cs_high(); result ((uint16_t)rx[0] 8) | rx[1]; return result; } static void drv8301_write(uint8_t reg, uint16_t data) { uint16_t frame ((uint16_t)(reg 0x1F) 11) | (data 0x3FF); drv8301_spi_transfer16(frame); }读操作类似只是帧的读写位要置为读方向同时SDI这边发0或者发无关数据。一般读函数我会封装成static uint16_t drv8301_read(uint8_t reg) { uint16_t frame ((uint16_t)(reg 0x1F) 11); return drv8301_spi_transfer16(frame); }注意这只是一个框架在实际工程里要把片选引脚、SPI句柄换成自己的定义。还有一点DRV8301的片选信号在两次传输之间要保证有一定的高电平时间太短的片选间隔可能导致寄存器写入不稳定。5.3 初始化配置的关键寄存器初始化配置主要是死区时间、过流保护阈值、电流放大器增益这几个。死区时间关乎上下管会不会直通过流保护阈值决定最大允许电流电流放大器增益影响ADC采样的分辨率。下面是我常用的一段初始化流程void drv8301_setup(void) { // 等待芯片上电稳定 HAL_Delay(10); // 先读一次状态寄存器确认没有上电故障 uint16_t status1 drv8301_read(DRV8301_STATUS1_REG); if (status1 0x0001) { // 最低位一般对应故障汇总具体位定义以手册为准 } // 配置Gate Driver Control寄存器死区时间、驱动电流 // 死区时间根据所用MOS管和PWM频率调整常用几百ns到1us // 这里的0x0002是示意值需对照寄存器位域逐位确认 drv8301_write(DRV8301_GATE_CTRL_REG, 0x0002); // 配置OCP Control寄存器过流保护阈值、过流响应模式 // 阈值要结合采样电阻和电机峰值电流来选 drv8301_write(DRV8301_OCP_CTRL_REG, 0x0005); // 配置CSA Control寄存器电流放大增益、采样保持等 // 增益选择20V/V对应CSA_GAIN某个编码具体看手册 drv8301_write(DRV8301_CSA_CTRL_REG, 0x0002); // 配置完后再读一次状态确认没有新故障 status1 drv8301_read(DRV8301_STATUS1_REG); }这里我特别想强调不要直接照抄寄存器数值。不同批次、不同后缀的DRV8301寄存器位定义可能有差异而且每个人用的MOS管和采样电阻不一样死区时间、过流阈值必须按自己的实际情况算。代码里的数值只是示范真正调的时候要拿数据手册对照每一位把注释写清楚。5.4 带死区的PWM输出配置PWM输出一般用MCU的高级定时器来做互补PWMSTM32F103用TIM1STM32F405可以用TIM1和TIM8。互补输出的意义在于同一相的高边和低边PWM信号能够自动插入死区时间防止上下管同时导通。以STM32F103在72MHz主频下输出20kHz PWM为例如果预分频设为1那么计数器频率是36MHz要得到20kHz的PWM自动重装载值等于36MHz除以20kHz等于1800所以ARR设置为1800减1。死区时间一般在几百纳秒到微秒之间通过定时器的BDTR寄存器配置。下面是简化的代码逻辑// 假设已配置TIM1_CH1为PWM1模式且使能了互补输出 htim1.Init.Prescaler 1; htim1.Init.Period 1800 - 1; htim1.Init.CounterMode TIM_COUNTERMODE_CENTERALIGNED1; HAL_TIM_PWM_Init(htim1); // 配置死区时间例如1us对应BDTR寄存器DTG值需要换算 TIM_BreakDeadTimeConfigTypeDef sDeadTimeCfg; sDeadTimeCfg.DeadTime 72; // 示意值需按时钟计算 sDeadTimeCfg.OffStateRunMode TIM_OSSR_DISABLE; sDeadTimeCfg.OffStateIDLEMode TIM_OSSI_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(htim1, sDeadTimeCfg); // 启动PWM和互补PWM HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); HAL_TIMEx_PWMN_Start(htim1, TIM_CHANNEL_1);使能顺序也很重要先初始化DRV8301的SPI配置确认nFAULT没有报警再使能PWM输出。如果先开PWM再去配置DRV8301芯片在默认配置下可能死区时间不够轻则波形不对重则烧MOS管。6. 上电调试实录从nFAULT报警到电流波形毛刺的排查过程6.1 上电前检查清单板子焊好之后不要直接插母线电源。我每次都会按下面的清单走一遍看起来繁琐但能省下后面一大半调试时间用万用表二极管挡测PVDD和GND之间是否短路重点排查MOS管安装方向和采样电阻。测3.3V或MCU供电网络对地阻抗避免上电后烧MCU。目视检查DRV8301 QFN封装有没有虚焊特别是底部散热焊盘的过孔有没有透锡到背面。用可调电源限流上电比如先限流100mA观察电流是否正常。如果上电瞬间电流就很大立刻断电排查短路。用示波器看GVDD电压是否正常确认栅极驱动供电建立。这一步做到位很多低级问题就不会带到后面。6.2 nFAULT被拉低时的排查分支nFAULT拉低是最常见的“板子不工作”表现。它可能指向多种故障不能只看外观。我的排查方法是用MCU读Status1和Status2寄存器把故障位解析出来。如果看到PVDD欠压位置位检查母线电压是否真正加到芯片PVDD引脚可能是滤波电容虚焊或者走线不通。如果看到GVDD欠压位检查GVDD引脚上的电容是否正常自举二极管是否装反。如果看到过流或短路位问题多半出在MOS管或者外部驱动回路比如某一路GH/GL没有输出导致半桥直通。如果看到过热位先检查散热焊盘是否焊接好再确认工作电流是不是真的超出设计范围。还有一个实际经验DRV8301在刚上电、还没配置寄存器时某些版本会默认把nFAULT拉低这不代表一定故障。所以代码里要先执行初始化流程再读状态和故障引脚避免被初始化前的假报警误导。6.3 波形没出来从GVDD到自举电压逐个查如果nFAULT正常但电机不转波形也没有我一般按这个顺序检查先用示波器量GVDD确认栅极驱动供电有了。然后量MCU输出的PWM到DRV8301的IN引脚确认PWM信号真的进来了。接着量GH和GL引脚看有没有对应的栅极开关波形。最后量SH节点和电机相线输出确认半桥中点确实有电压输出。有一次我的板子A相高边完全没有波形低边正常。排查下来不是芯片坏而是自举电容到BST_A和SH_A的回路中间焊盘开路了。因为自举电容没参与工作高边栅极完全没有悬浮电源自然输出不了波形。把电容重新焊接后高边波形恢复。还有一个高频坑PWM占空比设得太高自举电容充电时间不够。比如占空比开到99%高边长时间导通低边导通时间极短自举电容靠那点时间充不回来高边栅极电压会慢慢掉。解决方法是限制最大占空比比如不要超过95%或者用可编程死区时间配合自举充电策略。6.4 电流采样噪声大不是换电容那么简单电流采样波形毛刺大是画驱动板的人几乎都会碰到的问题。我第一次画板时SO引脚出来的波形在PWM开关沿附近全是毛刺ADC采到的值完全没法用于FOC。当时第一反应是给SO加滤波电容结果毛刺少了但信号也滞后了动态响应变差。后来发现问题的根源在布局SP和SN走线绕了一大圈还从GH走线旁边穿过开关噪声直接耦合进采样回路。重新布局把SP/SN按差分紧耦合走线、包地处理、远离开关节点之后噪声大幅下降。所以遇到采样噪声先查布局和走线再考虑滤波。如果走线已经改不了也可以通过软件手段改善。比如FOC算法里在ADC采样时刻选择上尽量避开PWM开关瞬间或者在PWM中心对齐模式下触发采样因为这个时刻电流纹波最小。这个技巧配合硬件布局效果会好很多。提示先用低占空比单脉冲模式看SO波形确认采样电阻上的压降确实存在并且方向正确再去优化噪声和滤波。这样能分清是电路问题还是布局干扰问题。6.5 一个很实用的调板小技巧最后分享一个我在调DRV8301驱动板时经常用的小工具强制六步换相逻辑。在还没跑FOC之前我写了一个简单的方波控制程序让MCU按固定的六步顺序输出PWM一步一停。这样如果某一路MOS管接错或者器件有问题会立刻在对应的相线上暴露出来。有了这个基础再切到FOC闭环调试难度会降低很多。另外给驱动板单独做一个测试工装也很有必要。用排针引出GVDD、三个SO、nFAULT、SPI信号样机阶段焊接一个简单的测试小板调试时把探头夹在对应的测试点上会比直接去戳QFN引脚方便很多。这个习惯我保持到现在每次画完板子都会留几个关键测试点后面调试省下来的时间远超这些测试点占用的那点面积。
返回列表