ARTICLE DETAIL

资讯详情

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

英飞凌TC3xx DSADC旋变软解码实战:从配置到故障排查

英飞凌TC3xx DSADC旋变软解码实战:从配置到故障排查 我们直接进入实战现场。英飞凌TC3xx系列在电机控制器和底盘域控制器里用得非常多其中旋变解码是一个绕不开的环节。用DSADC做旋变软解码本质上就是利用芯片内部集成的Delta-Sigma ADC、载波发生器和混频器把旋变反馈回来的正弦包络信号先调制、再解调最终在软件里通过atan2算出转子角度。这套方案最大的好处是不用外挂解码芯片成本低、电路简单而且把解算逻辑握在自己手里标定什么都很方便。但这几年我在多个项目里见到的现象是很多工程师配置完DSADC之后发现软件读出来的角度要么跳变、要么零点漂移、要么高速时误差大得离谱最后追了半天才发现是配置参数根本没对齐。这篇文章我会从示波器实测波形说起把DSADC旋变软解码的完整链路拆开讲配合VX1000的数据记录手把手带你把初始化配置、参数计算、滤波带宽、软件解算、故障排查整个流程走一遍顺便把我踩过的那些坑都列出来。如果你是刚接手TC3xx旋变解码的新人或者已经调通但对精度和稳定性还不满意这篇文章应该能给你省不少时间。1. 先把原理摊开DSADC旋变软解码到底在干什么1.1 旋变信号长什么样软解码要处理哪些东西旋变本质是一个小型的旋转变压器。它的初级绕组接激励信号两个次级绕组分别输出sin和cos两路信号转子转到哪个角度这两路信号的幅值就按正弦和余弦规律变化。硬件上激励频率通常是10kHz左右的正弦波次级输出则是幅度被转子角度调制的正弦包络信号。举个例子激励信号是10kHz正弦波如果转子实际角度是30度那么sin通道输出的包络幅度大约是0.5倍峰值电平cos通道输出的包络幅度大约是0.866倍峰值电平。软件要做的就是从这两个包络中提取出当前角度核心公式只有一个[ \theta \text{atan2}(\sin_value, \cos_value) ]这里有两个容易忽视的问题。第一硬件反馈回来的不是干净的包络而是叠加在10kHz载波上的调制信号。如果直接去采样原始反馈电压不做解调那读到的是一个高频正弦波根本提取不了包络信息。所以必须先解调把载波分量搬移掉只留下低频的包络成分。第二sin和cos两路信号之间存在幅值误差、直流偏置、相位不正交等非理想因素。这些误差不修正角度算出来就会有周期性的波动。这也是为什么很多人调完DSADC发现角度在某个位置特别准、在另一个位置误差特别大的直接原因。1.2 DSADC方案比外挂解码芯片强在哪外挂解码芯片的方案比如市面上常见的AD2S1205好处是硬件自动出角度SPI直接读软件负担小。但它贵、占PCB面积而且角度更新率固定想在里面加滤波和补偿逻辑很麻烦。TC3xx内部的DSADC模块把很多事情都做了。每个DSADC通道内部有一个输入多路选择器、一个Delta-Sigma调制器、一个数字抽取滤波器部分通道还带载波发生器和混频器专门用来做解调运算。以TC3xx常见的配置为例一片芯片里通常有多组DSADC通道每组都能独立配置成载波模式、混合模式、脉冲模式等旋变解码用的就是其中的载波模式。我见过不少团队在初期选型时犹豫觉得软解码费CPU。实际上DSADC的解调过程在硬件里完成CPU要做的只是读取解调出来的结果寄存器然后做一次atan2运算和简单的误差补偿开销很小。在TC3xx这种主频300MHz级别的芯片上跑一个2000Hz电流环的电机控制加一组旋变软解码CPU占用率增加的那点量根本可以忽略。1.3 软解码的适用边界和性能预期软解码能不能做好很大程度上取决于你的应用转速。对于新能源车驱动电机、转向系统电机这类应用转速通常在0到上万转每分范围旋变极对数一般为1对极或2对极。DSADC的载波解调带宽和抽取滤波器如果选得合理在几千赫兹的电频率范围内都能保证较好的幅值精度。这里要有一个预期管理软解码不是免费的万金油。如果转速极高比如电频率超过1kHz以上DSADC的抽取滤波器会引入相位延迟导致角度滞后。这时要么提高滤波器带宽要么做相位补偿。后面我会详细说怎么通过VX1000实测来判断延迟大小以及用什么方法补偿。2. 动手之前的关键决策通道规划、时钟、载波频率和滤波器2.1 通道资源和引脚如何规划TC3xx系列的DSADC通道数量因具体型号而异。以我常用的TC277、TC397和TC364这类芯片为例DSADC通道一般有6到8组。规划通道时要注意两个问题。第一旋变需要同时采集sin和cos两路反馈信号所以至少要占用两个DSADC通道这两个通道最好属于同一个DSADC模块组或者至少能共用一个载波发生器否则两路数据的载波相位不一致会影响解调结果。第二很多TC3xx的DSADC引脚和普通ADC、IO共用得去查芯片数据手册里的引脚复用表确认所选引脚是否真的能连接到目标DSADC通道的模拟输入前端。曾经有个同事把信号接在PF0上软件却配置成PF1的DSADC通道结果读到的数据一堆噪声排查了足足半天。引脚分配建议做成一个简单的表格方便评审和后续维护。信号建议通道引脚示例说明旋变激励信号无需DSADC通道由PWM或DAC产生-给旋变初级供电不使用DSADC采集旋变Sin反馈DSADC通道0见芯片引脚复用表使用差分输入或单端接入旋变Cos反馈DSADC通道1见芯片引脚复用表与Sin通道配置尽量保持一致备用通道DSADC通道2-可用于温度采集或电压监测2.2 载波频率和激励电压怎么选旋变的激励频率通常由旋变厂家给出常见的有10kHz、12.5kHz、20kHz。原则上激励频率要小于DSADC调制器采样频率的若干倍数工程上一般取调制器时钟的1/1000到1/2000。以TC3xx的DSADC为例调制器时钟可以配置成几十MHz从100kHz到2MHz的载波频率都能支持所以10kHz激励完全没问题。激励电压幅值需要结合旋变变比来定。多数旋变的变比在0.5左右意思是初级加10Vrms激励次级感应出来大约是5Vrms。TC3xx的DSADC模拟输入范围一般是0到5V或者可配置的差分范围如果直接接次级输出可能超出ADC量程这时需要在外围加一级放大或者分压电路。我的建议是不要盲目追求高激励电压。电压太高反馈信号会削顶电压太低信噪比不够。以我项目里常用的旋变为例激励10Vrms、变比0.5次级大概5Vrms经过分压网络后让DSADC输入端的峰值不超过满量程的85%左右这样既有足够的信噪比又留出了过压余量。2.3 抽取率、滤波器带宽和输出数据率怎么匹配这部分是DSADC配置里最影响性能的环节值得说细一点。Delta-Sigma ADC的特点是过采样。调制器输出的是一个高速的1bit数据流后续的数字滤波器把这些数据流抽取成低速的、高分辨率的数值。TC3xx的DSADC抽取滤波器可以配置多种抽取率从8到2048不等。抽取率越大输出的数字分辨率越高但带宽越低、延迟越大。以我常用的配置为例调制器时钟配置为40MHz抽取率选择128那么输出数据率就是40MHz除以128约等于312.5kHz。换句话说每个DSADC结果寄存器大约3.2微秒更新一次这个速度对于旋变解算来说非常快完全够用。关键点在于滤波器带宽。TC3xx的DSADC内部有FIR和IIR两级滤波FIR的带宽由抽取率和滤波器阶数决定IIR滤波器的截止频率可以独立设置。如果抽取率过高滤波器带宽变窄旋变载波解调后的包络信号部分会被衰减导致角度在小信号时的误差变大。如果抽取率过低带宽虽然是够了但数字分辨率下降、噪声变大角度抖动也会变明显。具体怎么选我的经验是这样参数典型取值范围我的推荐一句话说明调制器时钟10MHz~80MHz40MHz取中间值兼顾功耗和性能抽取率32~512128适合10kHz载波的旋变FIR滤波器系数见寄存器配置厂家默认或中等带宽太陡的滤波会带来相位延迟IIR截止频率1kHz~100kHz比载波频率低一个数量级用于平滑解调后的包络噪声这里有个容易被坑的点DSADC配置的滤波器带宽不等于旋变解调带宽。解调之后你其实只关心包络信号的带宽这个带宽取决于转速最大时包络的最高频率。比如一个4对极旋变转子转速6000rpm对应的电频率是400Hz。包络信号带宽撑死1kHz滤波器不需要开到非常宽否则高频噪声全进来了。这也是为什么IIR截止频率设成载波频率的1/10左右就够了比如载波10kHzIIR截止频率设成1kHz既能滤掉载波残留又不伤包络信号。3. 初始化配置和软件解算关键代码与参数计算3.1 模块初始化流程TC3xx的DSADC初始化用英飞凌官方提供的iLLD库最稳妥。以IfxDsadc库为例初始化的核心步骤是这样IfxDsadc_Dsadc dsadc; IfxDsadc_Dsadc_Config dsadcConfig; IfxDsadc_Dsadc_initModuleConfig(dsadcConfig, MODULE_DSADC); // 配置调制器时钟和参考电压等 dsadcConfig.modulatorClock IfxDsadc_ModulatorClock_div8; dsadcConfig.adcMode IfxDsadc_AdcMode_continuous; // 连续转换模式 IfxDsadc_Dsadc_initModule(dsadc, dsadcConfig);初始化模块之后每个通道需要单独配置。以Sin通道为例IfxDsadc_Dsadc_ChannelConfig chSinCfg; IfxDsadc_Dsadc_initChannelConfig(chSinCfg, dsadc); chSinCfg.channelId IfxDsadc_ChannelId_0; chSinCfg.inputPin IfxDsadc_InputPin_a; // 选择引脚复用 chSinCfg.inputMode IfxDsadc_InputMode_singleEnded; // 或者差分 chSinCfg.sampleTime IfxDsadc_SampleTime_48; chSinCfg.rcFilter ...; IfxDsadc_Dsadc_initChannel(chSin, chSinCfg);我的习惯是把Sin和Cos两个通道的配置封装成同一个函数传入不同的channelId这样能保证两个通道的配置完全一致。曾经有项目因为Sin通道开了滤波器、Cos通道没开导致角度在四个象限边界上周期性跳变查了很久才定位到。3.2 载波发生器与混频器配置这是旋变软解码和普通DSADC采集最大的区别。旋变解调时DSADC通道必须被配置为载波模式并且载波源要选择内部产生或者外部激励同步。chCfg.cicMode IfxDsadc_CicMode_carrier; chCfg.carrierSignalSource IfxDsadc_CarrierSignalSource_internal; // 内部载波 chCfg.carrierFrequency ...; // 配置载波频率通常等于旋变激励频率 chCfg.mixerEnable TRUE; // 使能混频器内部载波模式下DSADC会用本地产生的载波信号和输入信号做乘法运算也就是混频。混频之后原来的载波成分被搬移掉留下低频包络分量。这里的频率偏差非常敏感。如果内部载波频率和实际激励频率不一致解调出来的信号会产生低频波动角度会以载波频率左右“晃动”。所以如果激励信号来自于外部电路比如专用旋变驱动芯片我强烈建议用外部载波同步方式把激励信号同时送到DSADC的载波输入引脚让DSADC跟着外部激励一起走。如果激励信号是TC3xx内部PWM产生的那就可以直接用内部载波模式但要保证DSADC载波配置和PWM频率严格一致否则土豆一车都白搭。3.3 物理量到初始化参数的映射计算方法配置项里最容易让人懵的是载波频率寄存器的数值和滤波器截止频率的换算。TC3xx手册里会给一个类似这样的公式[ f_{carrier} \frac{f_{mod}}{N_{carrier}} ]其中f_mod是调制器时钟频率N_carrier是载波分频寄存器值。假设调制器时钟为40MHz旋变激励频率为10kHz那么N_carrier 40MHz / 10kHz 4000。不同芯片的寄存器基地址和位宽略有差异但换算逻辑都是一样。滤波器的截止频率类似。FIR滤波器由抽取率和内部系数表决定IIR滤波器则有独立的截止频率配置寄存器。手册里会给截止频率与调制器时钟、分频系数的关系式直接把目标截止频率代进去算出寄存器值就行。这里我建议你拿到芯片后第一时间写一个小脚本把这些频率换算关系固化成公式方便各项目复用。纯靠手算很容易因为单位搞混而出错。我自己有一次把kHz当成Hz算了载波差了一个数量级波形看起来完全不对。3.4 从结果寄存器到角度输出的软件流程DSADC配置完成后每个转换周期结果寄存器会更新一次解调后的数值。接下来的软件处理流程是// 读取原始值 sint16 rawSin IfxDsadc_Dsadc_getChannelResult(chSin); sint16 rawCos IfxDsadc_Dsadc_getChannelResult(chCos); // 直流偏置补偿 float sinVal (float)rawSin - sinOffset; float cosVal (float)rawCos - cosOffset; // 幅值归一化可选 sinVal * sinGain; cosVal * cosGain; // 角度解算 float angleRad atan2f(sinVal, cosVal); if (angleRad 0.0f) { angleRad 2.0f * PI; }这里有两个容易出错的地方。第一个是atan2f的参数顺序。数学库的atan2(y, x)中第一个参数是Y轴分量第二个是X轴分量。旋变Sin通道对应转子角度的正弦分量Cos通道对应余弦分量所以一定写成atan2f(sinVal, cosVal)。反了的话角度会变成90度减实际角度零位会整体偏转90度。第二是偏置补偿。DSADC结果寄存器里读出来的“0”不一定对应真实的零电平。因为硬件电路会有直流偏置ADC自身的零点也会偏移。这个偏置如果不扣掉角度会在象限切换处出现明显的突变。偏置的标定方法很简单转子放在已知角度位置多采几组数据取平均计算出真实的偏置值。我现在还习惯在角度输出端再加一个简单的滑动平均值滤波把最后一段噪声压掉。滤波窗口一般取4到8个点不要取太长否则会引入额外的相位滞后。4. 示波器波形实测先看硬件再谈软件4.1 示波器测点怎么选择示波器是排查旋变问题最重要的工具之一。测量时要分清几个关键测点不要跟无头苍蝇一样乱戳。一是旋变激励信号。直接测量旋变初级绕组两端正常应该看到干净的10kHz正弦波幅值稳定没有毛刺。二是旋变反馈信号。测量次级Sin和Cos的输出端正常情况应该是幅值随转子角度缓慢变化的包络信号。注意这里说的是“包络”因为示波器显示的是整个高频波形看起来像一团正弦波其外沿的起伏就是转子角度调制出来的包络。三是DSADC输入端信号。这部分要看板级电路比如分压电阻后面的电压。这里要注意DSADC引脚对信号源有输入阻抗要求如果前级运放驱动能力不足接进去后信号幅度会掉一截。4.2 正常波形应该长什么样一个正常的旋变解码前端波形信号幅度、包络有没有削顶、有没有叠加噪声这些都能一眼看出。我在调试时总结了几个观察要点。激励波形必须是对称的正弦波如果顶部或底部出现削平说明激励驱动电路供电不足或者运放输出摆幅不够。激励对称性差会直接导致反馈信号的偶次谐波变大。反馈波形如果看起来幅值波动不大可以试着用手缓慢转动旋变转子观察包络是否从最大值到最小值连续变化。如果某一角度下包络卡住不动了说明绕组接触或者电路通道可能有问题。DSADC输入端的波形还要注意共模电平。TC3xx的DSADC输入范围对共模电压有要求如果电路设计成了单端输入务必确认静态工作点落在ADC输入范围的安全区间内。我遇到过板上运放供电为5V、信号偏置在2.5V的情况相对3.3V的ADC如果采用3.3V参考就会出现量程截断波形看起来就是包络上下不对称。4.3 用波形快速判故障的实战方法排查时先用示波器逐级看可以快速缩小问题范围。我也总结了一个基础判断思路。观察点异常现象可能原因激励信号幅值不够/削顶/带毛刺供电不足、驱动电路设计不合理、布线耦合反馈信号包络幅值突变/无包络旋变接线断、绕组损坏、链路漏电DSADC输入端信号超过ADC量程/偏置异常分压电阻选错、运放接错、接地错误解调后波形残留载波/被滤波器削弱混频器相位不匹配、滤波器带宽过窄有一次现场排查遇到一个很诡异的现象反馈峰值随转速变化转速越高峰值越小。示波器一看其实是反馈路径上多了个电容和绕组电感形成了LC低通滤波高频分量被衰减了。这种问题如果只盯着软件配置永远找不到答案。5. VX1000数据记录把内部变量拉出来对比5.1 VX1000在旋变调试里的三个作用VX1000是ETAS的一套测量和标定工具链在英飞凌AURIX的调试中很常用可以实时读取芯片内部变量、记录标定参数、抓取特定条件下的事件数据。很多工程师习惯只用调试器和printf但配合VX1000做旋变验证效率会明显不一样。我在旋变软解码调试中用VX1000主要做三件事。第一件是观察DSADC结果寄存器的原始值。rawSin和rawCos有没有偏置、有没有噪声、变化规律是否正确直接在VX1000的标定界面里拉曲线一目了然。第二件是记录角度输出。把经过偏置补偿和atan2运算后的角度变量放到VX1000里实时看角度曲线。如果角度在零点附近跳动、象限边界跳变能直接看出来。第三件是做数据对比基准。在台架上把电机轴和外部高精度编码器同轴相连同时记录VX1000的旋变角度和编码器角度两个曲线做差就能得到旋变软解码的静态和动态误差。5.2 变量描述文件与测量配置的关键点要让VX1000读到变量需要把编译产生的变量地址信息导入工具。AURIX项目一般用ELF文件里面带有调试信息可直接导入。导入后再把要观测的变量拖进测量窗口设置采样周期。这里要注意VX1000的采样周期和DSADC结果更新周期是两个独立的概念。如果VX1000采样周期比DSADC结果更新慢比如DSADC 312.5kHz更新VX1000 1kHz采样那么你看到的rawSin就是“抽了样”的曲线会有阶梯感这是正常现象不要误判成DSADC问题。如果想把DSADC高频噪声特征看清楚建议VX1000采样率至少开到10kHz以上。再高也不是不行但数据量和缓存窗口会受限够用就好。5.3 用数据验证角度误差的实际案例我调一个旋变解码参数时先在台架上固定转子角度通过VX1000读取静态角度发现角度值在0度和180度附近误差小在90度和270度附近误差很大差值接近3到5度。从现象推测幅值误差或正交误差。我把rawSin和rawCos拉出来发现两个通道的峰值差了差不多8%。进一步看数据Sin通道的偏置和Cos通道的偏置也不一致说明前端运放的零点没有校准。修正方法有两个方向。第一是硬件上把放大倍数调到一致第二是在软件里增加幅值和偏置补偿系数。我一般两种都做硬件保证基础一致性软件做精细补偿。补偿后再用VX1000记录数据误差就降到了0.3度以内。这类问题关键在于没有VX1000这种工具时想靠肉眼从波形里去判断几个毫伏级的幅值差异几乎不可能。搞一套数据记录工具链对旋变软解码调试来说很值得投入。6. 常见问题与排查技巧实录6.1 我收集过的高频坑位汇总把这么多年踩过的坑和身边同事遇到的典型问题整理成了表格给各位省一些弯路。现象根本原因处理办法角度在某个点附近固定跳变Sin/Cos接线反了检查旋变接口定义调整接线或用软件交换角度整体偏移固定角度零位标定未做或标定值错重新标定零位写入偏置角度随转速升高而滞后滤波器相位延迟提高滤波器带宽或做相位补偿角度在低转速时抖动明显偏置未消除或噪声过大增加偏置补偿降低滤波器截止频率角度曲线有明显周期性波纹Sin/Cos幅值不一致做幅值归一化检查前端增益rawSin数值恒为最大值输入信号超量程检查分压和输入范围调整电路rawSin数值始终为0通道配置错误或引脚未连接检查复用配置和硬件接线载波残留过多混频器参数不匹配检查载波频率同步和滤波器设置6.2 调试时要有的“对照思维”旋变软解码的坑很大一部分不是某一个环节单独出问题而是多个环节叠加导致的结果。排查的时候一定要建立“对照”的思维。第一步先做静态对照。把转子卡在固定角度观察角度输出是否稳定原始数值是否和理论计算一致。第二步做慢转对照匀速低速转动转子看角度曲线是否平滑变化有没有台阶和跳变。第三步再做快转对照高速转动时观察角度是否滞后、幅值是否衰减。三个阶段对应的问题维度不一样。静态对照暴露偏置和零位问题慢转对照暴露通道间一致性和幅值归一化问题快转对照暴露滤波带宽和相位延迟问题。哪个阶段出问题就往对应维度去查。还有一个小技巧是保留每一版配置的VX1000记录文件。调整参数之前先记录一份数据作为基线改完之后再记录一份两个文件对比能非常直观地看出调整带来的变化。我靠这个方法在DevOps般的配置迭代中基本没有出现过改完参数越改越差却找不到问题的情况。6.3 最后的建议到底哪些参数最值得花时间调有人拿到DSADC感觉寄存器配置一大堆不知从哪里下手。以我的经验来看最值得花时间的参数排序是滤波器带宽、载波同步、偏置补偿、幅值归一化、零位标定。滤波器带宽直接决定角度噪声和相位延迟这是软解码性能的上限必须认真算。载波同步决定解调是否正确是正确性的基础。偏置和幅值归一化决定精度的细节几乎每个项目都要调。零位标定则是最后一步装车环境不同零位可能要切换。把这些按顺序调完再用VX1000做一次完整的误差验证旋变软解码这套链路基本就稳了。我个人在实际项目中感受最深的一件事就是把示波器的“硬件视野”和VX1000的“软件视野”结合起来之后很多之前看起来很玄的故障现象一下子变得特别清晰。你不需要去猜是哪里的问题波形和数据会自动告诉你答案。这也是这篇文章最想传递的核心思路把硬件波形和软件数据对照起来看旋变软解码就没什么秘密可言。
返回列表