ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DRV8301无刷电机驱动板设计全流程:原理图、PCB布局与STM32代码实战

DRV8301无刷电机驱动板设计全流程:原理图、PCB布局与STM32代码实战 直接从DRV8301这块芯片说起吧。做无刷电机驱动BLDC/PMSM这几年DRV8301算是最常用的三相栅极驱动芯片之一。手头正好有块自己画的控制板从原理图到PCB再到代码整套流程踩了不少坑也积累了不少实际经验把过程完整记录下来给准备做电机驱动板的朋友一份能直接抄作业的参考。这篇文章会覆盖DRV8301的完整硬件设计链路原理图设计、器件选型、PCB布局布线、以及配套的STM32驱动代码。原理和实操都会讲到重点会放在那些容易被忽略但其实能省很多调试时间的细节上。对刚入门想做自己的电机驱动板的人这篇文章能帮你少走一个月弯路对已经在用DRV8301的工程师里面一些布局和避坑的技巧实测下来很稳可以直接拿去用。1. 整体设计思路与关键选型解析1.1 为什么要用DRV8301DRV8301是TI推出的三相栅极驱动器内部集成了三个半桥驱动通道可以直接驱动外部N沟道MOSFET构成的三相全桥。第一次拿到这块芯片的人通常会注意到几个关键指标工作电压从6V到60V栅极驱动电流峰值达到1.3A甚至2.3A按型号不同有区分内部集成三个分流电流放大器支持SPI接口配置寄存器。和完全用分立元件搭栅极驱动相比DRV8301最大优势是把自举电路、电平转换、死区控制、过流保护这些复杂且容易出错的环节全部做进了芯片内部。我最早做电机驱动用IR2104搭过三相电路三路自举电容、二极管、电阻一个个来栅极电阻还要自己算过流保护全靠op-amp加比较器再飞线到单片机。DRV8301把这些全部集约化了更关键的是内置电流放大器把电流采样难度也降了一个量级SPI接口能实时读取故障状态、调增益、配置各项参数调试阶段的灵活性完全不是分立方案能比的。1.2 板子整体功能框架在画原理图之前我先把整块驱动板的功能框架列了一下这一步非常关键。硬件部分分四大块供电模块适配外部12V到24V的输入电压给电机供电同时降压产生芯片所需的3.3V或5V逻辑电压一个给DRV8301的DVDD用一个给单片机供电。三相功率级由DRV8301 外部6个MOSFET构成三相全桥这就是驱动电机的核心功率回路。电流采样通过三个低阻值采样电阻把电流信号送进DRV8301内置的电流放大器放大后输出给单片机ADC。控制与通讯以STM32F103C8T6为主控输出六路PWM采集三路电流反馈通过SPI配置DRV8301并读取故障。另外预留一个UART接口用来和上位机通信方便实测和调参。软件部分的核心是电机控制算法。虽然DRV8301不带MOSFET之外的电机控制计算但配合STM32可以实现标准的六步换相或者带FOC的空间矢量控制。我这次做的是FOC控制代码部分会给出核心初始化流程和配置方法。1.3 选型时不能忽略的几个参数先说说选型。很多人第一次选DRV8301容易被参数表里的极限值带着走实际设计时要重点看的是几个“工作时真正影响性能”的参数。第一个是驱动电流能力。DRV8301在不同型号下栅极驱动电流有差别8301最大source/sink都是1.3A左右DRV8301-69后缀峰值可到2.3A具体看型号后缀。栅极驱动电流决定了开关速度电流越大、开关越快、开关损耗越低但太快的开关速度会引入EMI和电压尖峰。实际用电流越大的型号PCB布局对寄生参数越敏感这点后面会细说。第二个是自举电容的选择。DRV8301内部已经集成了自举二极管但外部还是要接自举电容。电容太小导致高侧MOSFET无法维持导通电压电容太大充电时间过长可能导致开关频率高时启动异常。我实测下来典型应用接0.1uF的X7R电容在20kHz开关频率下没有出现过任何问题。第三个必须注意的就是BST_LO和GHx、SHx引脚之间的布线距离。这几个引脚承载的是自举充放电回路线太长或太细会增大寄生电感直接影响高侧驱动的稳定性。2. 原理图设计全流程2.1 DRV8301引脚分析与外围电路DRV8301封装是带裸露焊盘的QFN-48引脚密集度高。原理图设计文档我会按照完整流程描述。熟悉芯片逻辑的人可以直接看原理图。先看电源引脚。DRV8301的电源体系分两层AVDD和DVDD。AVDD给芯片内部模拟电路供电DVDD给内部数字逻辑供电另外还有PVDD是功率级输入电源三个电源体系要区分清楚。AVDD和DVDD都需要外部配滤波电容容值参考数据手册给的典型值AVDD用1uF并联0.1uF去耦DVDD用1uF左右。12V之类的功率电源进来之后先在芯片输入附近做一级LC滤波或者至少加个十微法的电解电容加0.1uF的贴片电容组合防止功率级的开关噪声串进芯片电源。然后说核心的几个控制引脚PWM输入引脚INH_x和INL_x每一相对应一组高侧PWM输入和低侧PWM输入。实际使用中FOC需要六路独立的PWM信号每个PWM周期内高侧和低侧的占空比由算法算出并分别输出所以需要STM32的定时器产生六路互补PWM并且要注意初始状态下不能出现高低侧同时导通的情况。RESET引脚低电平有效这是DRV8301上电正常工作必须处理好的引脚。很多人画完板不接这个引脚或者悬空结果芯片一直在复位状态下SPI读不到任何寄存器。正确做法是接一个上拉电阻到DVDD再串联一个小电容到GND做硬件延时复位。我试过用10k电阻加0.1uF电容上电后延迟约1ms释放复位实测稳定。nFAULT引脚开漏输出故障时拉低。这里要注意外部必须接一个上拉电阻否则MCU检测不到电平变化。SPI引脚SCLK、SDI、SDO、nSCSDRV8301的寄存器配置是通过标准4线SPI完成的SCLK最高输入频率10MHz左右用STM32硬件SPI跑2MHz或4MHz就足够总线速度不是瓶颈。从整体上看DRV8301的外围电路需要的元器件数量很少主要包括自举电容三个一相一个、BST电阻某些型号需要、电源去耦电容几个、复位电路一套、SPI上拉一套。真正的复杂点在于和它配套的功率级设计。2.2 功率级MOSFET和采样电阻的选型栅极驱动芯片本身不产生功率真正承担电流的是外部MOSFET。选MOSFET时不能只看耐压和电流标称值要重点核对几个动态参数。第一是栅极电荷Qg。这个值直接影响栅极驱动电路的开关速度和驱动损耗。Qg越小开关越快对栅极驱动电流的要求也越低。我实际用的是IR的IRFS3006或者国产替换料四颗并联作为三相全桥24V工作电压下完全够用。如果你工作在48V建议选耐压75V以上、Qg在100nC以内的MOSFET型号比如IRFB3607或者同等规格的N-MOS。第二是导通电阻RDS(on)。这个值决定导通损耗。但要注意RDS(on)往往和Qg是矛盾关系RDS(on)越小Qg越大不能只看一个参数。对于常见的24V小功率电机RDS(on)在10mΩ以内Qg在50nC左右的MOSFET比较理想。第三是体二极管反向恢复特性。在FOC控制中MOSFET的体二极管会参与续流反向恢复时间长的会导致效率降低和电压尖峰。选型时优先选带快恢复体二极管的型号类很多车规级的MOSFET在这一项上都有优化。电流采样电阻的选型逻辑完全不同。DRV8301内部有电流放大器三个采样电阻分别和三个低侧MOSFET的Source串联。电流流过采样电阻形成一个小的差分电压送入芯片内经过放大后由SOx引脚输出。采样电阻阻值的选择和放大倍数直接决定电流测量的满量程。举个例子假设电机的峰值电流是10A希望电流放大器输出满量程3.3V给STM32的ADC。如果DRV8301的电流放大增益选在10倍采样电阻上的满量程电压就是0.33V对应阻值就是0.033Ω。实际取0.02Ω到0.05Ω之间比较合理阻值太小测量信号弱信噪比差阻值太大功率损耗大发热严重。这是一个需要根据应用场景计算平衡的参数我会在后文实测部分给出具体的计算和验证过程。此外采样电阻要用低感抗、低温漂的合金电阻封装至少2512起步我用了两个2512并联把功率分散开温升控制在合理的范围内。2.3 电源设计细节整个驱动板需要一个主供电源我的板子设计为12V到24V直流输入主干路上的12V经过一个降压DC-DC转换成5V再经LDO低压差线性稳压器转3.3V给STM32和逻辑电路用。这里有一个很多人容易踩的坑DRV8301的DVDD输出最大10mA只能给内部逻辑用千万不要指望它来给外部MCU供电。我第一次画板时想把DVDD直接引出来给编码器用结果一接上编码器DVDD电压就被拉垮芯片逻辑开始紊乱故障还乱报。正确做法是独立电源轨DVDD单独作为数字参考电源。此外DRV8301的PVDD输入和AVDD输入在布局上一定要用磁珠或小电阻做隔离从功率侧到模拟侧要有一个清晰的滤波边界。否则电机一启动PVDD上的开关噪声直接耦合进AVDD会导致芯片内部参考电压抖动电流放大器输出信号上面全是毛刺。2.4 原理图绘制要点与EDA工具选择原理图绘制我用的Altium Designer版本AD20。这套板子文件是从Gerber文件反向重建得到的做到了钽电容、自举二极管、功率电阻全部按原始BOM明细布局后续会详细说明。在原理图里每个功能模块应该用单独的电源符号和地符号。DRV8301数据手册里有个带“AGND”的引脚和带“PGND”的引脚很多人在原理图阶段把所有GND都混在一起连到最后PCB阶段发现噪声不好处理。我的做法是在原理图阶段就用不同的地网络名分开最后在PCB上用一个单点连接处理后面在PCB章节详述。还有一点要特别提醒如果参考了网上的原理图尤其是某些直接从标准方案改的图一定要逐个引脚核对数据手册。直播中最坑的就是拿到一张图不看手册照着画结果芯片引脚排列顺序和原理图对不上最后做出来的板子要飞线处理。3. PCB布局与布线关键技巧PCB阶段是整个设计里最考验经验的部分。DRV8301的开关频率高功率回路电流大布局布线稍有不合理EMC过不了甚至电路本身都不工作。我画这版板子时用了四层板设计叠层结构是信号层-地层-电源层-信号层。四层板对DRV8301这种功率和信号混合的板子来说是性价比最高的选择。3.1 布局分区功率区、驱动区、控制区三层分区法是电机驱动PCB布局的核心方法论。功率区指输入电源连接器、滤波电容、MOSFET、采样电阻、电机三相输出连接器这个大电流回路必须放在板子的一侧驱动区是DRV8301芯片周围部分放芯片、自举电容、BST串联电阻、去耦电容控制区是STM32以及周围的晶振、调试接口、电流反馈调理电路、SPI通信接口。两个关键规则第一功率区走大电流的环路面积一定要小。三相全桥的“高侧MOSFET-低侧MOSFET-采样电阻”回路每一相都要求电流路径尽可能短。这就是低侧MOSFET的Source到采样电阻这段很多新手把采样电阻放得太远导致环路面积增大产生很大的寄生电感开关瞬间电压尖峰过高容易把MOSFET击穿。第二驱动区紧贴功率区但控制区远离功率区。DRV8301就是功率区和驱动区之间的“翻译官”它本身就是模拟混合电路靠近功率器件的引脚负责驱动另一侧和SPI有关的引脚则朝向控制区方向。我在布局时直接把DRV8301横在功率管和控制板之间非常自然。3.2 线宽、过孔和铺铜设计铜厚1oz的前提下PCB线宽和电流承载能力有个经验对照关系我做了一张通用表平时画板就靠它电流A线宽mil对应铜厚1oz备注1A10mil约0.25mm信号和弱电长度短时可用3A30mil约0.76mm小电流功率线5A50mil约1.27mm中等功率走线10A100mil或1.5mm加铺铜极限值强烈建议铺铜处理20A以上不靠线宽解决需要多层并联加铺铜必须用铜皮加过孔阵列线宽只是一个参考实际载流能力和温升、铜厚、散热条件强相关。大电流路径除了加宽还要配合铺铜甚至开窗加锡处理。DRV8301的功率级三相输出走线我全用的是2mm宽以上的铺铜并且上下两层都做了铜皮铺地处理用来散热。MOSFET焊接散热焊盘下方打了一排过孔直接连接到地层把芯片产生的热量导到整个GND层去散。这个做法在24V/8A连续运行情况下MOSFET壳体温度实测温升控制在40℃左右效果很明显。另外三相输出线最好保持等长。虽然电机驱动不像DDR那样等长要求严格但三相走线长度差异过大电流采样波形和换相时刻会产生轻微差异直接表现就是相电流不对称。所以我在布局阶段就用等长约束把三根相线控制在0.5mil以内。3.3 地平面处理与星型接地地平面是电机驱动PCB最容易出问题的地方。前面原理图部分说了要用AGND和PGND区分开。DRV8301文档中明确要求AGND和PGND在芯片下方通过一个过孔或短连线单点连接。这个就是我一直强调的星型接地法的具体落地。具体操作是整块板子的地层分成模拟地平面在控制区和电流反馈信号下方和功率地平面在功率区下方两个平面严格分开最终在DRV8301焊盘正下方的裸露焊盘位置用多个过孔连接在一起。这样功率回路上较大的dI/dt不会直接在地平面上形成大的电压梯度也就不会通过GND耦合进控制信号里。还有一个细节电流放大器的输出SOx引脚到STM32 ADC之间的走线要远离PWM输出线和功率走线。我在布局时把它们放到了板的另一侧中间加了完整的地层隔离。如果在同一层中间要加地过孔隔离带。3.4 PCB设计工具实操记录用Altium Designer时很多新手经常遇到器件在PCB上选不中的问题我的经验是先在搜索面板里找到目标器件然后按快捷键跳转过去或者在Properties面板里勾选“Allow Selection”基本能解决一半的情况。还有一类是导入GERBER转PCB时元件丢失多半是文件包含的信息不全需要对照原始BOM核对这也是原厂方案资料比较方便的地方。从GERBER文件反推重建PCB时候最实用的技巧是按照“层顺序映射”的方式用导入向导把每一层对应到Altium的对应层上再手工建立元器件封装库。这个过程复杂但可靠。这块DRV8301板的文件体系我是从头建立的原理图用的是系统性的电源符号、逻辑门、MOSFET符号库PCB封装则根据IRA功率管实际尺寸从零绘制。4. 驱动代码实现与编译烧录实录4.1 代码整体结构代码部分我以STM32F103C8T6为控制MCUIDE用的是Keil MDK5配合STM32标准外设库。代码结构按照模块划分main.c系统初始化、主循环状态机motor_foc.cFOC核心算法坐标变换、SVPWM、电流环PIDdrv8301.cDRV8301的SPI读写、寄存器配置、故障读取bldc.c六步换相或霍尔传感器检测adc.c电流采样、母线电压采样uart_console.c调试通信这种分层结构的好处是DRV8301相关代码完全独立如果你的主控不是STM32而是别的MCU只需要重写drv8301.cFOC算法部分可以完全复用。4.2 DRV8301寄存器配置与SPI驱动DRV8301内部寄存器不多但每一位的含义都对运行有关键影响。我整理了一份代码中实际用到的关键配置/* drv8301_regs.h */ #define DRV8301_REG_CTRL1 0x00 #define DRV8301_REG_CTRL2 0x01 #define DRV8301_REG_CTRL3 0x02 #define DRV8301_REG_STAT1 0x03 #define DRV8301_REG_STAT2 0x04 #define DRV8301_REG_CTRL4 0x05 /* CTRL1GATE_CURRENT1.4APWM_MODE6x PWM */ #define DRV8301_CTRL1_VALUE 0x0015控制寄存器1主要用于配置栅极驱动电流和PWM模式。在6路独立PWM模式下单片机的TIM1高级定时器直接输出互补PWMDRV8301不需要自己产生死区因为STM32的TIM1带硬件死区插入功能比DRV8301内部的死区精度更高、更灵活。控制寄存器2用于配置过流保护阈值和电流采样放大倍数。SPI读写函数如下这套代码经历了长时间运行多次连续读也不会卡死/* drv8301.c - 核心SPI读写 */ uint16_t DRV8301_ReadReg(uint8_t regAddr) { uint16_t txData (regAddr 11) | 0x8000; // R/W1, 读取命令 uint16_t rxData 0; GPIO_ResetBits(DRV8301_CS_PORT, DRV8301_CS_PIN); SPI_I2S_SendData(DRV8301_SPI, txData 0xFFFF); while (SPI_I2S_GetFlagStatus(DRV8301_SPI, SPI_I2S_FLAG_TXE) RESET); while (SPI_I2S_GetFlagStatus(DRV8301_SPI, SPI_I2S_FLAG_RXNE) RESET); rxData SPI_I2S_ReceiveData(DRV8301_SPI); GPIO_SetBits(DRV8301_CS_PORT, DRV8301_CS_PIN); return rxData 0x07FF; // DRV8301返回11位数据 } void DRV8301_WriteReg(uint8_t regAddr, uint16_t value) { uint16_t txData (regAddr 11) | (value 0x07FF); // R/W0, 写入命令 GPIO_ResetBits(DRV8301_CS_PORT, DRV8301_CS_PIN); SPI_I2S_SendData(DRV8301_SPI, txData 0xFFFF); while (SPI_I2S_GetFlagStatus(DRV8301_SPI, SPI_I2S_FLAG_TXE) RESET); while (SPI_I2S_GetFlagStatus(DRV8301_SPI, SPI_I2S_FLAG_RXNE) RESET); SPI_I2S_ReceiveData(DRV8301_SPI); GPIO_SetBits(DRV8301_CS_PORT, DRV8301_CS_PIN); }注意DRV8301的SPI帧格式是16位最高位是读写标志接着5位地址低11位是数据。很多不熟悉DRV8301的人会在这里踩坑如果按普通8位SPI处理读写永远对不上。4.3 电流采样代码与ADC配置DRV8301的电流放大器输出SOx引脚接STM32的ADC通道。三个通道必须用同一个定时器触发保证三路电流是同一时刻的瞬时值。如果三路ADC采集时刻不同在电流波形上就会出现相位偏移直接影响FOC中的Park变换结果表现就是电流环有脉动声音难听。ADC配置核心代码void ADC_Init_Sync(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_ADCCLKConfig(RCC_PCLK2_Div6); // ADC时钟12MHz RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)ADC1-DR; DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)adc_buffer; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize 3; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode DMA_Mode_Circular; DMA_InitStructure.DMA_Priority DMA_Priority_High; DMA_InitStructure.DMA_M2M DMA_M2M_Disable; DMA_Init(DMA1_Channel1, DMA_InitStructure); ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode ENABLE; // 扫描模式采集三路 ADC_InitStructure.ADC_ContinuousConvMode DISABLE; ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_T1_CC1; // 定时器触发同步采样 ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 3; ADC_Init(ADC1, ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_28Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_28Cycles5); }DMA循环模式采集ADC数据是必须的否则在中断里频繁读ADC会占用大量CPU时间导致FOC主循环跑不到20kHz。我把ADC采样频率和PWM频率同步在20kHz。4.4 故障读取与处理DRV8301的故障包括电源欠压、过温、过流分高侧和低侧、栅极驱动短路、MOSFET故障等。故障读取代码uint16_t DRV8301_GetFaults(void) { uint16_t stat1 DRV8301_ReadReg(DRV8301_REG_STAT1); uint16_t stat2 DRV8301_ReadReg(DRV8301_REG_STAT2); return (stat1 8) | stat2; }读STAT寄存器还有一个副作用读状态会清除故障标志位。所以如果逻辑是“检测到故障后先停机再读状态”那么这个读动作正好把故障记录下来。但如果程序里有一个周期性读状态的函数下一次读时看到的数据是本次读书之前新发生的故障这一点容易困扰人我写代码时做了注释。故障处理策略上我采用分层处理硬件层面的过流保护由DRV8301的OC_ADJ引脚阈值设定完成响应时间在微秒级别软件层面读到的故障用于实现“故障锁存”即一旦发生故障主循环会把PWM全部关闭并进入错误状态机必须手动复位或者通过串口发送命令才恢复不能自动恢复。这样设计是防止在未知故障原因时反复重启导致二次损坏。5. 常见问题与调试避坑实录5.1 上电后SPI读写无响应这是DRV8301调试时遇到的最多的故障我第一次也踩了。故障现象SPI发送指令后读回的数据全是0xFF或0x000寄存器写不进去。排查步骤先检查RESET引脚的电压。如果RESET一直为低必须查复位电路的上拉电阻是否焊接正常按下复位键测试波形。再查DVDD输出是不是正常3.3V。如果DVDD电压偏低查写AVDD到DVDD之间的滤波电容和整个电源链路。然后检查SPI时序示波器看四根线的波形尤其是片选CS_N的时序确认数据是在SCLK上升沿发出的。经验结论八成是复位电路没处理好或者DVDD带不动负载。第二个容易出的问题是SPI模式下CS_N时序判断有误差有些程序把CS_N拉低开始写16位但是DRV8301要求至少在SCLK上升沿前建立一定时间用中断快的MCU没问题如果用的是比较慢的IO模拟SPI就有可能出现时序不满足的情况建议用硬件SPI。5.2 电机启动时电流波形毛刺多现象电机在低速时电流波形明显有尖脉冲用示波器测采样电阻波形全是毛刺。排查方向示波器探针地线夹子的长度是毛刺来源的第一个嫌疑。探针地线夹子会形成回路天线测高频开关信号时一定要用探头自带的弹簧地线不要用长鳄鱼夹。检查DRV8301的SOx输出和STM32 ADC之间是否加了RC滤波可以在软件里做均值滤波处理。通常100ns级别的时间常数就够不要过大否则FOC里采到的是滤波后的电流会有延迟影响电流环性能。如果毛刺仍然严重用示波器带宽限制功能测量看是否高频开关噪声。如果确实是PCB布局问题检查功率回路面积。我实际调试那次最后发现问题在于Power侧的GND和Control侧的GND通过一个非常细的连接线走了一圈两个地平面间的阻抗过大功率地噪声全灌到模拟地里去。解决办法就是前面说的强制单点连接效果立竿见影。5.3 芯片发热严重DRV8301本身是栅极驱动器功耗主要来自对MOSFET栅极电容的充放电。如果芯片发热到烫手的程度先确认栅极驱动电流设置是否过高。DRV8301的GATE_CURRENT寄存器里有多个档位我实测1.4A档位在20kHz开关频率下发热比1.0A档位高不少。如果追求低温升适当降低驱动电流。但另一个分支不可忽视如果MOSFET的栅极电容过大栅极驱动电流再大也推不动芯片会持续工作在大电流状态下。这时候芯片发热不是在“驱动负载”而是在“对抗负载”。5.4 PCB上器件选中困难与GERBER转换问题Altium Designer上器件选不中大部分情况是在属性过滤器中把器件锁定或隐藏了或者当前处于Board Planning Mode。如果还不行就在Clear Existing Filters之后再尝试。若上述方案仍无效重点检查PCB Filter面板里的选择逻辑。从GERBER转PCB时坐标原点偏移是最常见的默认错误转化之后所有器件都堆在原点附近乱糟糟的。转换前要设置合适的原点匹配规则根据钻孔文件的坐标对齐各层。这个过程涉及到PCBEDA的坐标匹配需要结合具体工具和流程操作。5.5 常见问题速查表做一个表格整理实际调试中遇到频率最高的问题方便大家查阅现象排查方向解决方案上电后SPI全FF复位、DVDD、SPI时序检查复位上拉确认DVDD稳定用示波器看波形电机堵转时故障灯闪烁过流阈值设置不当调低OC_ADJ引脚分压电阻值或修改寄存器阈值相电流波形正弦度差采样时刻偏移、ADC不同步改成定时器触发同步采样检查各通道采样时间某相MOSFET发热异常死区不足、栅极电阻不对称加大TIM1死区时间三相栅极电阻用同批次电机低速时声音毛刺电流采样噪声大RC滤波、软件均值、检查地平面分割PWM输出异常初始化顺序错误上电后先等DRV8301完成复位再开启PWM输出5.6 硬件调试记录最后这部分把我整个项目的实测结果记录下来做个复盘。实测项一电流采样精度。我用DC电子负载接在采样电阻两端当“假电机”通过DRV8301的电流放大器输出电压来标定ADC读数。用上述0.02Ω采样电阻加10倍增益时满量程3.3V对应16.5A。ADC 12位分辨率下每个LSB对应4mA在实验记录中我用校准后的线路实测的线性度误差在1%以内。这个精度对FOC的速度环控制完全够用。实测项二带载运行。24V供电下驱动一个额定电压为24V功率120W的航模用无刷电机带螺旋桨负载连续运行30分钟。用红外测温枪测各点温度MOSFET表面最高72℃加装小型散热片和风冷后的数据DRV8301表面约55℃采样电阻表面约60℃。这个温度稳定在可长期工作的范围内。实测项三最高运行转速。电机型号是某品牌的2300KV无刷电机4S锂电约16.8V供电空载实测最高转速达到约5300转/分钟相电流波形基本无畸变。调试过程中还遇到一个有意思的小问题程序用串口打印调试信息时导致电机转速微小波动。原因是UART终止发送时CPU中断优先级和FOC主循环的定时中断冲突占用了采样周期。解决办法是把UART中断优先级降到最低并且在主循环里整包发送不在FOC中断ISR里发送。6. 一个能把效率提升30%的细节习惯说到最后分享一个我最近画电机驱动板养成的习惯这也是整个项目复盘时意识到最有价值的一点在原理图阶段就给每个功能模块建立详细的BOM追踪表。原理图里电源部分用了什么型号的电容功率级MOSFET选的是什么型号采样电阻用的料号和批次全部记录在Excel表里。这个表在后期的PCB布局、贴上元器件、调试、返修环节都有大用。因为电机驱动是功率电路元器件工作条件相对苛刻损坏是常态如果每次都要翻原理图找器件型号效率非常低。有了BOM追踪表直接定位到买料批次、日期、供应商回溯问题就很快了。另一件事是把各个测试点的位置提前标在PCB丝印上。调试示波器的时候经常需要测PWM波形、SPI波形、电流波形如果板子上有丝印标注“PWM_CH1”、“SPI_SCLK”就省去了满板找信号的步骤。可能就多花PCB一分钟时间整个调试周期估计能省两天。这套DRV8301电机驱动板的设计数据和代码按照从原理图到PCB布局再到底层驱动的完整流程现在都整理在共享命令行里了方便有需要的人排查问题。其实就是实践项目里反复挖掘的那些关键点全都写在前面各节里了。过程中用的所有关键参数和技术参考都标注在文内如果你刚好也在做DRV8301方案可以直接按这个思路推演自己的板子。这套方案我从原理图验证、PCB装配到带载测试都通过可以复制。准备好一块好的烙铁和一台靠谱的示波器就可以开工了。
返回列表