ARTICLE DETAIL

资讯详情

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

DRV8703D-Q1半桥驱动SPI初始化与PWM调试要点

DRV8703D-Q1半桥驱动SPI初始化与PWM调试要点 简介DRV8703D-Q1 芯片调试文档面向电机驱动开发者与硬件工程师围绕芯片从电路搭建到 SPI 软件配置给出系统调试指引。文档先梳理半桥电路、SPI 接口和电源电路三块电路板设计要点再详解 SPI 初始化参数包括上升沿输出/下降沿输入、16 位数据长度、波特率 37.5M/100 等同时解释 16 位传输格式中 W0 位对读写命令的区分。寄存器章节逐个说明 FAULT Status、VDS and GDF、Main Control、IDRIVE and WD、VDS Control、Config Control 六个寄存器的功能与初始化值例如 Main Control 写入 0x0019、IDRIVE and WD 写入 0x0087方便读者直接参考配置。资源为 1 个 docx 文档压缩包大小 528KB可作为芯片调试的速查手册。目前该资源已有 2589 人学习适合需要快速掌握 DRV8703D-Q1 寄存器配置或定位电机驱动异常的技术人员。1. DRV8703D-Q1 上电先配 SPI 再谈 PWM半桥驱动的六寄存器任务一块电机驱动板上电后 nFAULT 直接拉低、SPI 写寄存器始终不生效这往往不是 PWM 配置问题而是 SPI 帧在对齐之前就被芯片丢弃了。DRV8703D-Q1 是 TI 的车规级半桥栅极驱动器MCU 通过 4 线 SPI 写六个寄存器完成死区、栅极驱动电流、VDS 过流阈值和看门狗配置配置完成后半桥才允许响应 IN1/IN2 的 PWM 输入。硬件调试时最容易忽略的是芯片 SPI 时序的主从边沿匹配以及 Main Control 寄存器要分 0x0019 和 0x0031 两阶段写入。这篇文章把这套调试流程拆开从 F2812 的 SPI 参数设置、16 位帧结构、6 个寄存器的初始化矩阵到最后的回读验证和 nFAULT 定位。2. F2812 SPI 边沿对齐与 DRV8703D-Q1 的 CPOL/CPHA 匹配2.1 芯片要求的通信沿上升沿发送下降沿接收DRV8703D-Q1 的 SPI 从机逻辑定义很明确SDO 在 SCLK 上升沿更新数据主机在下降沿采样 SDO同时主机应在上升沿发送数据到 SDI芯片在下降沿锁存 SDI。这就是 SPI Mode 0即 CPOL0、CPHA0SCLK 空闲为低电平数据在第一个边沿上升沿被驱动在第二个边沿下降沿被采样。F2812TMS320F281x的 SPI 模块初始化为上升沿发送、下降沿接收正好与芯片对齐。硬件调试中如果出现写寄存器后读回全是 0xFFF或者寄存器写进去了但行为不对第一步检查 SCLK 空闲电平是不是低第二步检查主设备是不是在下降沿采样。把这两点确认好比拿着示波器逐 bit 数数据更省时间。SpiaRegs.SPICCR.all 0x000F; // 16位字符长度时钟空闲为低上升沿发送 SpiaRegs.SPICTL.all 0x0006; // 主模式使能发送 SpiaRegs.SPIBRR.all 0x0063; // 波特率 37.5MHz / (991) 375kHz SpiaRegs.SPICCR.bit.SPISWRESET 1; // 完成配置后软件复位使能 SPI0x000F 的低 4 位全为 1表示 SPI 字符长度是 16 位这一点必须与 DRV8703D 的 16 位帧对齐bit6 的 CLOCK_POLARITY 为 0SCLK 空闲为低。SPICTL 的 0x0006 中 bit21 是主设备模式bit11 使能发送如果不置 TALK 位TXBUF 的数据不会出现在 SDO 上抓波形只能看到时钟和片选在跳数据线完全没反应。SPISWRESET 必须放到最后置 1SPICCR/SPICTL/SPIBRR 的修改在复位状态期间才会被正确锁存。2.2 375kHz 波特率与字符宽度取舍SPIBRR 寄存器写 0x0063十进制 99实际波特率用 LSPCLK / (SPIBRR 1) 计算37.5MHz 时钟下得到 375kHz。这个速度对于 16 位帧来说单帧传输时间大约 42.6us配置周期很短同时线缆容忍度高适合调试阶段使用。如果板子上 SCLK 走线较长或者电机相线靠近 SPI 排线375kHz 比强行跑到 1MHz 以上可靠得多。SPIBRR 写入值十进制分频系数SCLK 频率0x006399100375 kHz0x00314950750 kHz0x001521221.704 MHz把波特率调高之前建议先用回读命令确认 SDO 数据稳定。DRV8703D 没有像 I2C 那样的 ACK 应答写命令是否生效只能通过后续读命令把寄存器内容拉回来验证。把 SCLK 提上去之后如果发现回读数据偶尔跳变优先降回 375kHz不要急着改线缆。这里补充一点给使用 STM32F103 平台的参考用 CubeMX 生成 SPI 时同样选 Mode0MSB First16 位数据帧如果驱动代码里只能发 8 位就按先高字节后低字节的顺序发送先发 W0 和地址段所在的高字节再发数据低字节否则帧边界会错位。3. DRV8703D-Q1 的 16 位帧格式与六寄存器地址映射3.1 W0 位、地址段与数据段的划分DRV8703D 的 SPI 帧固定 16 位最高位 W0 决定读写方向W00 是写命令W01 是读命令。芯片只暴露六个寄存器地址段用 3 位足够数据段占满剩余 12 位。帧布局可以理解为bit15 为 W0bit14:12 为寄存器地址bit11:0 为数据。构造命令帧时最容易犯的错误是把地址左移位数搞错。地址要放到 bit14:12不是放在最高字节里否则芯片解析出来的地址段全是 0命令全部落到 FAULT Status 这类只读寄存器上写操作被静默丢弃。#define DRV8703_SPI_WRITE(addr, data) (0x0000 | ((addr 0x7) 12) | (data 0x0FFF)) #define DRV8703_SPI_READ(addr) (0x8000 | ((addr 0x7) 12)) uint16_t drv8703_frame; drv8703_frame DRV8703_SPI_WRITE(0x03, 0x0087); // 写 IDRIVE and WD 寄存器写宏把地址段限制在 3 位数据段限制在 12 位避免越界位污染 W0。读宏直接把 bit15 置 1发送后从 SDO 拿到的返回帧低 12 位就是目标寄存器内容。注意全双工 SPI 下 SDO 移出的数据是发送命令之前锁存的值所以想读到刚写完的寄存器需要连发两次读命令第二次返回的才是有效内容。3.2 六个寄存器的角色与初始化值六个寄存器中FAULT Status 和 VDS and GDF 是只读寄存器其余四个读写。只读寄存器在调试阶段的价值很大上电先读一次 FAULT Status等于让芯片向 MCU 汇报自身状态再决定要不要继续往下配。地址寄存器名读写属性调试初始化值作用0x00FAULT Status只读读取检查汇总 VDS、GDF、UVLO 等故障0x01VDS and GDF只读读取检查锁定过流与栅极驱动故障来源0x02Main Control读写0x0019 后切 0x0031输入逻辑与半桥运行模式0x03IDRIVE and WD读写0x0087死区、看门狗、栅极驱动电流0x04VDS Control读写0x0070VDS 比较阈值与重试机制0x05Config Control读写0x0021斩波与电流镜放大器开关地址按芯片手册的六寄存器顺序排列如果手头手册的地址偏移不同替换宏定义里的地址段即可帧构造方式不变。VDS and GDF 寄存器记录的是故障发生瞬间的状态芯片内部会锁存读完后需要清除故障源并重新初始化对应功能否则 nFAULT 一直保持低电平。我自己调试时会先读 0x00再读 0x01两个值组合起来判断是桥臂过流还是栅极驱动异常。4. 寄存器初始化矩阵从 0x0019 到 0x0021 的配置序列4.1 Main Control 为什么写两次Main Control 在初始化流程里要写两个不同数值这是 DRV8703D 调试中最容易抄错的地方。上电后第一帧写 0x0019展开成二进制是 00011001bit0、bit3、bit4 被置位这个阶段的作用是让 IN1/IN2 输入引脚的电平参与内部逻辑使 PWM 信号能够进入芯片但半桥输出级此时还不具备完整的驱动配置。完成其余寄存器写入后再把 Main Control 改写为 0x0031也就是 00110001bit4、bit5 相比第一阶段被置位半桥进入实际运行状态。我的理解是 0x0019 相当于预配置模式先打通输入通路让后续 SPI 写入不受输出级状态干扰0x0031 才是真正的运行模式。如果把 0x0031 直接作为第一步写入内部驱动级参数还是默认值此时如果 PWM 已经跑起来输出桥臂可能处于未知状态故障保护逻辑会被噪声误触发。两阶段切换时 PWM 引脚应保持无效电平等 0x0031 写完后再放开 PWM 输出。4.2 IDRIVE、VDS、Config 三个寄存器的参数语义IDRIVE and WD 写 0x0087对应二进制 10000111。bit7 置 1 是关闭看门狗避免调试过程中长时间不发 SPI 命令导致芯片复位低 3 位为 111选择高边驱动电流 440mA、低边 430mA死区时间配置为 120ns。这个电流档位配合 IRFSL4310 这类 N 沟道功率管栅极充放电速度足够。现场如果电机出现明显的振铃或尖叫声把驱动电流调低一档比盲目加大栅极电阻更有效栅极电阻过大会把开关损耗推到 MOS 管上散热问题更麻烦。VDS Control 写入 0x0070即 01110000把 VDS 比较阈值推到较高档位同时关闭电流镜和重试机制。本设计中低边使用 0.03Ω 采样电阻并联做电流采样电流环由 MCU 通过采样电阻闭环控制VDS 只负责最后一道短路防线。关闭自动重试后过流故障直接锁定到 nFAULTMCU 读取 FAULT Status 再做策略处理不会出现桥臂反复重启把 MOS 管打穿的情况。Config Control 写入 0x0021即 00100001禁止斩波电流设置同时关闭电流镜放大器。纯电压 PWM 驱动场景下电流斩波在电机启动瞬间容易被相电流误触发放大器的开关噪声也会耦合到模拟比较器上。采样电阻如果走的是 MCU ADC 回路就不需要让芯片内部的电流镜参与。void drv8703_init(void) { // 1. nSCS 拉低发送第一帧Main Control 进入预配置状态 spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x02, 0x0019)); spi_cs_high(); // 2. 依次配置死区、驱动电流、看门狗、VDS 阈值 spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x03, 0x0087)); spi_cs_high(); spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x04, 0x0070)); spi_cs_high(); spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x05, 0x0021)); spi_cs_high(); // 3. 全部配置完成后Main Control 切到运行态 spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x02, 0x0031)); spi_cs_high(); }每一帧都是独立的片选周期nSCS 拉低、SCLK 移 16 位、nSCS 拉高。代码里每次写寄存器都单独拉低再拉高片选是因为 DRV8703D 按帧识别数据SCLK 第 16 个边沿之后 nSCS 必须释放一次。有人把片选全程拉低连续发 5 帧芯片会把后续帧当作前一帧的延续最终只有最后一帧被正确解析。4.3 初始化时序与 PWM 释放顺序整个初始化流程在实际板卡上执行时间很短但顺序不能调整。先给 VM 上电等待 DVDD 稳定nSLEEP 拉高让芯片退出 sleep之后依次写 0x0019、0x0087、0x0070、0x0021最后写 0x0031。每一步之间不需要额外延时因为 SPI 时钟 375kHz 下每一帧本身就有几十微秒间隔芯片内部逻辑有足够时间锁存。注意整个初始化期间 PWM 引脚必须保持无效电平。有些工程师先在 MCU 里配好 EPWM再回头调 SPI结果配置过程中 PWM 已经输出高电平半桥直接导通VDS 保护动作把 nFAULT 拉低。调试时要养成习惯先完成 DRV8703 的全部寄存器配置读取 FAULT Status 确认无故障最后才使能 PWM 输出。用串口调试助手打印每个关键步骤的返回值能直观看到哪一帧没写进去。5. 回读验证与 nFAULT 故障定位技巧5.1 两次读命令确认寄存器最终状态Main Control 写完 0x0031 之后用读命令把寄存器内容拉回来比对着看。第一次发送读命令SDO 返回的是上一次 SPI 事务结束时锁存的数据第二次发送相同读命令返回的才是 0x0031。如果第二次回读得到的还是 0x0019说明第二阶段写命令没有生效优先检查 nSCS 的帧边界而不是怀疑寄存器数值。uint16_t drv8703_read_main_control(void) { uint16_t resp; spi_cs_low(); resp drv8703_spi_xfer(DRV8703_SPI_READ(0x02)); // 第一帧丢弃 spi_cs_high(); spi_cs_low(); resp drv8703_spi_xfer(DRV8703_SPI_READ(0x02)); // 第二帧有效回读 spi_cs_high(); return resp 0x0FFF; }回读值取低 12 位因为返回帧的 bit15 是芯片回填的状态位bit14:12 是地址回显数据段固定在低 12 位。如果连续多帧读回 0x0FFF大概率是 SDO 线悬空芯片根本没有应答检查 nSCS 是否真正拉低、SCLK 是否进入芯片。5.2 用故障寄存器区分 VDS 和 GDF 故障源nFAULT 拉低后先读 0x00 和 0x01两个只读寄存器配合起来能缩小排查范围。FAULT Status 为 0x0000 表示无故障这是正常状态。如果读到非零值0x01 寄存器里 VDS 相关位被置位说明桥臂出现过流重点查 MOS 管的 DS 电压和负载回路栅极驱动故障位被置位则查 GH/SH/GL/SL 四路栅极驱动到 MOS 管栅极的走线以及 VM 电源是否掉到欠压阈值以下。回读现象可能原因排查动作回读全 0x0FFFSDO 无应答查 nSCS 帧边界、SCLK 极性FAULT Status 非零VDS 位置位桥臂过流或短路查 MOS 管、采样电阻、电机相线FAULT Status 非零GDF 位置位栅极驱动异常查 GH/GL 输出、VM 电压Main Control 回读 0x0019第二阶段写入被丢弃查片选时序、PWM 是否提前使能把 SDO 回读数值与 0x0031 比对就能判断第二阶段配置是否锁定如果回读一直停在 0x0019优先查 nCS 帧边界而不是寄存器值。本文还有配套的精品资源点击获取
返回列表