ARTICLE DETAIL

资讯详情

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

TC3xx DSADC旋变软解码实战:从波形到角度解算的踩坑记录

TC3xx DSADC旋变软解码实战:从波形到角度解算的踩坑记录 实验室里那块TC377目标板已经在防静电台面上躺了大半年最近项目要上电机位置闭环旋变Resolver成了绕不过去的一环。原计划直接用专用解码芯片结果一看交期和价格直接劝退。想了想手里的英飞凌TC3xx自带DSADC模块性能不差干旋变软解码是现成的路子。前后折腾了几周从示波器上看到第一道调幅波形到最后VX1000里平滑的角度曲线中间踩了不少坑。这篇就当成踩坑记录给后面接手DSADC旋变软解码的同行留个参考。说是“软解码”意思是不靠DSADC那颗专用RDC外设硬算角度而是用DSADC做高速高精度采数然后跑到CPU里面通过软件解调算出转子位置。这种做法省掉了解码芯片成本低了电能想怎么补偿就怎么补偿算法灵活度拉满。但代价也很现实采样同步、相位校准、滤波延迟、角度连续性全得自己一点点收拾干净。我尽量把从示波器看波形到VX1000采数据的整条链路拆开讲硬件部分不深谈重点放在信号理解、DSADC配置、软件解调思路和实战坑位上。1. 为什么放着专用解码芯片不用非要自己软解1.1 旋变信号长什么样旋变从原理上讲就是一个旋转变压器定子上有激励线圈转子上有正交的两相输出线圈。激励线圈通上高频正弦波常用10kHz左右转子转动时输出SIN和COS两路信号的幅值会随着角度发生正余弦变化。所以你在示波器上看到的SIN/COS通道绝对不是简单的正弦波而是被位置信息调幅过的高频载波。对应的数学关系大致是SIN通道包络 A * sin(θ) * sin(ωt)COS通道包络 A * cos(θ) * sin(ωt)这里的ω是激励角频率θ是转子机械角度电气角度。想得到θ最直接的办法就是把这两个调幅波里的包络A·sin(θ)、A·cos(θ)抠出来然后做一次atan2运算。用专用RDC芯片比如AD2S1210芯片内部会把激励产生、包络解调、角度计算、跟踪环路全包干你通过SPI读角度就行。但芯片成本高而且规格书里的最大跟踪速率、分辨率在这种特殊应用下总感觉差口气。软解码等于是把这些全搬回MCU里反正TC3xx主频也不低算一个atan2也就几百个周期的事。1.2 为什么偏选TC3xx的DSADC市面上能做同步采样的ADC不少但TC3xx的DSADC有几个点特别适合旋变一是DSADC是真正的差分输入Delta-Sigma ADC共模抑制能力比普通单端ADC强得多。旋变信号从定子出来线长干扰大还容易带共模噪声差分输入能省一堆调理电路。二是DSADC支持同步触发和多个通道并行采集。旋变解调最关键的一点就是SIN和COS必须同一时刻采样差几个微秒都会引入角度误差。DSADC的同步触发机制能保证这两条通道严格同时刻转出结果。三是DSADC自带CIC抽取滤波器和相位补偿。抽取率配好了可以直接把高频调制分量滤掉一部分减轻CPU算力负担。实际算下来一个10kHz激励、DSADC调制器频率跑个20~40MHz抽取后采样率照样能做到几十kSPS完全够解调使用。但也要泼盆冷水DSADC提供的原始结果是经过滤后的“样本流”它并不知道你采样点相对于激励相位落在哪。真正软解的时候激励相位对齐、包络提取、噪声抑制全得靠上层代码自己搞定。这也是这个项目里花时间最多的地方——不是DSADC本身难配而是信号在哪一个相位上被采样直接决定后面解调结果准不准。1.3 整体方案选型的取舍我实际画的系统框图很简单外部电路产生10kHz正弦激励给到旋变激励线圈旋变的SIN、COS信号经过信号调理分压加偏置或差分放大进DSADC的CH0和CH1DSADC同步采集输出样本软件在每个激励周期内提取包络angle atan2(sin_env, cos_env) zero_offset最后把角度通过变量传给FOC/BLDC控制任务。这套方案和硬件RDC比最大优势是可以随时调整解调算法甚至可以在线做正交误差补偿、幅值不平衡补偿。比如旋变本身存在正交误差导致SIN和COS不是严格90度这在硬件解码芯片里很难单独补偿但软解码在标定阶段测一下相位差反算到算法里就完事了。缺点也很明显角度输出有延迟延迟大小和CIC抽取率、软件滤波阶数挂钩。这就需要靠后面的VX1000测量延迟反推调试参数。2. 示波器波形先把信号底子查清楚2.1 激励信号不是“给上电就行了”旋变软解码的第一关是示波器准确说是从激励信号开始查起。我建议先把激励通道挂上示波器看看波形到底干不干净。理想的激励是一个频率稳定、幅值稳定的正弦波。我用信号发生器加功放板输出10kHz正弦示波器上看到的波形如果存在削顶、毛刺或边沿过冲说明功放带宽不足或者匹配电容没调好这种激励给到旋变后面解调出来的包络会带上高频毛刺角度抖动也会变大。还有一个没那么直观但很重要的点激励波形的过零时刻是否稳定。软解码做同步解调时常见做法是以激励过零或者某个固定相位作为参考基准每个周期内固定点采样。如果激励信号的频率抖动、过零抖动大等于你的采样窗口在不停晃动出来的包络自然忽大忽小。所以示波器上要做的不仅仅是看“有没有波形”还要把时基拉大看频率是否漂移开FFT模式看谐波含量。谐波高的话优先级不是调解码代码而是先查功放和滤波。2.2 正余弦输出波形的判断标准SIN和COS通道的波形大概率是两路“长得很像的调幅波”。示波器上第一眼要确认的是包络是否干净、是否呈现正余弦变化。手动缓慢转动转子包络峰值应该从一个方向最大到另一个方向最小SIN和COS两道包络相差90度。这不过关的话后面全是白做。具体量测时我习惯看几个指标载波频率和激励频率是否严格一致正常应该一样。包络频率和转子转速的关系是否对得上机械转一圈电气角度转过的周期数取决于旋变极对数。两通道的残余直流偏置是不是足够小。如果输出信号在无激励状态下有偏置解调出来的角度会带转频误差速度越高越明显。电压幅值有没有超过后级DSADC输入范围。调理电路设计时我把满幅压到DSADC量程的80%左右别怼到满量程不然DSADC很容易打爆。还有一个容易忽略的是浮地探头问题。一般示波器探头地线夹子接在旋变信号地上看似没问题但旋变激励功率地和信号地之间如果有压差会在波形上叠加共模干扰。有条件尽量上差分探头或者至少确保探头地夹在信号源同一点不要跨接在不同地之间。这个坑我一开始没注意波形上多了一片50Hz的工频干扰排查了很久才发现是接地方式不对。2.3 波形正常了才开始配DSADC我的习惯是波形这关不过DSADC代码一行都不写。因为DSADC配置有问题往往表现得和信号有问题一模一样到时候很难排查。示波器确认好激励干净、正余弦包络正确、幅值范围合适之后再进入芯片外设配置阶段心里才有底。3. DSADC配置从寄存器到落地细节3.1 关键参数怎么选TC3xx DSADC的配置项很多名字在不同型号手册里略有差异但核心逃不出几个调制器频率也跟时钟分频相关。DSADC内部Delta-Sigma调制器需要一个高速过采样时钟。我实际把调制器频率配在20MHz以上过采样率高了分辨率才够。太低的话10kHz激励信号的波形会被严重锯齿化后面解调噪声会非常大。CIC抽取率。DSADC的CIC滤波器用来对调制器输出的高速1bit流进行抽取和滤波。抽取率越大输出数据率越低但分辨率越高也意味着群延迟越大。我用的策略是先把输出数据率拉到是激励频率的4~8倍。比如激励10kHz抽取后输出数据率大概40~80kSPS。这样每个激励周期能拿到4~8个点既能做同步解调又不太吃算力。输入量程和增益。旋变输出一般要先经过模拟前端把电压压到ADC量程内DSADC内部可能还有可编程增益。这里务必留出裕量别把最大角度信号压到满量程边缘。一旦饱和解调出来的角度在峰值附近就会削顶失真出现“到顶之后掉下来”的假跳变现象。同步触发源。CH0和CH1必须同拍采样。DSADC可以配置为同步模式把一个通道设为主通道另一个设置为从通道跟随。这样两个样本的时间戳完全一致。千万别图省事用两个通道独立自由运行再高精度都会因为触发时刻偏差引入角度误差。3.2 时钟、PWM和CCU6的联动从纯DSADC采样的角度看只要SIN/COS两个通道同步就行。但放到电机控制系统里还有一个大坑PWM开关噪声会把角度信号打得全是毛刺。所以我在系统里用CCU6生成6路PWM控制电机同时把CCU6的一个同步事件引到DSADC让采样时刻正好落在PWM周期的非开关区间比如桥臂开关死区窗口外、占空比更新的稳定区间。这里就牵扯到热词里那个“TC3xx CCU6输出3相6路PWM波控制BLDC”和“死区设置”。CCU6输出6路PWM不是难点真正要调好的是上下桥互补PWM的死区时间。死区太短上下管可能直通炸机死区太长电流波形畸变严重还会在采样点附近引入振铃噪声。我项目里死区配置大概0.5~1微秒具体根据IGBT/MOS管的关断延迟来定。设置好死区之后把ADC采样触发放到死区结束后的稳定窗口里DSADC采集到的旋变包络明显干净很多。具体同步触发实现路径要看芯片具体型号和引脚我用的是CCU6的定时器事件输出到GTM再由GTM触发DSADC或者直接用GxTM触发DSADC。关键是保证触发信号相位固定不要因为PWM占空比变化导致采样点位置漂移。你不需要一次把这条链路全部搭起来但至少要意识到采样和PWM的相位关系是软解码精度的重要变量。3.3 软件解调把包络从载波里抠出来DSADC把样本流交给CPU之后最难的一步是解调。解调方案很多我最终用的是“同步积分/相关法”简单说就是在激励周期的某个固定相位窗口内做加权求和把与激励同频的基波分量提出来。具体做法是先检测激励的过零相位如果激励信号也经过另一路DSADC回采可以直接用激励通道作为相位参考我从外部激励模块引了一路同频方波进DIO用定时器捕获过零。然后根据激励过零点决定在正半周采样点做累加负半周做相减这样相当于对每周期内的样本做了一次同步相敏检波。出来的结果就接近A·sin(θ)和A·cos(θ)的包络值。得到包络后角度计算就是简单一行angle atan2(sin_env, cos_env)。但这里有一个细节容易被忽略atan2结果范围是[-π, π]转子的机械角度可是要连续累加的多圈转下来必须在角度输出侧做展开unwrap否则曲线会在±180度处跳变。我在代码里维护了一个角度累加器检测相邻两次角度差是否超过π超过就补偿2π这样VX1000里看到的才是连续增长的锯齿波而不是来回跳变的乱线。解调之后通常还要再加一阶低通滤波。因为DSADC抽取输出还是会有残余噪声直接atan2的角度抖动比较大。我用的是移动平均或IIR低通截止频率视转速定低速时放低一点高速时放宽一点。注意滤波会带来相位滞后如果你后面要做FOC这个滞后必须和电流环采样延迟统一评估。3.4 开发环境与工程建议流程走到这里其实已经可以跑了。开发环境方面我用的是AURIX Development StudioADS加HighTec编译器下载安装都很省事不用折腾许可证。TC264、TC3xx这类芯片用同一套工具链只是外设库版本有差异。之前网上也搜过“英飞凌tc264的编译器”实际上ADS自带的就是HighTec直接用它建工程即可。DSADC的初始化代码用iLLD库就行IfxDsadc模块基本覆盖了配置和读取的接口。不过多啰嗦一句库函数封得再好也建议翻一翻手册里的DSADC寄存器结构。软解码调参数的时候经常要改某个滤波器位或者触发源位域手册不熟光靠库函数配置会走很多弯路。用户手册里关于DSADC和CCU6的部分我翻了好多遍特别是同步触发和CIC滤波那一节基本是当小说看的。4. 从示波器到VX1000数据链路的闭环验证4.1 为什么示波器还不够示波器能看模拟波形但看不了MCU内部算出来的角度值到底对不对。你在示波器上看到SIN包络是干净的只能说明信号源没问题软件解调算法有没有把包络正确提取出来角度是不是连续还得靠调试工具读数据。这时候VX1000就派上用场了。VX1000是ETAS的测量硬件一般配合INCA使用专门用来高速采集ECU内部变量不会像串口打印那样拖慢程序运行。对软解码这种需要看连续角度、动态响应的场景VX1000的优势特别明显。它可以把DSADC原始样本、解调包络、最终角度、甚至转速全部录下来然后在INCA里和手动转动的参考曲线对比。4.2 接线和配置过程我先在INCA里建好工程A2L文件里把关键变量暴露出来DSADC两通道的原始采样值、软件解调后的sin_env和cos_env、angle、还有一个用时间戳记录的角度增量。VX1000通过以太网连接PC另一端接到目标板调试接口上。实际跑的时候VX1000的高速采集模式能拿到很快的数据流。我设置采样率在10kHz左右基本上每个激励周期都能记录到几个点已经足够看角度波形连续性和抖动。采集前要把触发条件设好我用的是“角度值超过某阈值”触发这样每次开始记录的点位基本一致方便对比不同参数下的响应。第一次采出来的数据印象深刻角度曲线是一段非常平滑的锯齿波手动转轴的时候曲线跟着手的快慢变化SIN包络和COS包络的幅值变化也和VX1000里看到的sin_env/cos_env曲线高度吻合。到这个阶段示波器上的模拟世界和在INCA里的数字世界就算打通了。4.3 标定和验证的几个关键动作真正验证软解码做没做对不能只看“有角度输出”。我做了三件事第一零位标定。把电机轴手动转到机械零位用VX1000读当前角度把误差值存成zero_offset加到最终角度输出里。标定之后角度值在零位附近不再有固定偏差。第二全角度线性度。慢速匀速转动电机轴一整圈导出的角度曲线应该是一条斜率恒定的直线局部放大没有阶梯状或突变。如果出现某些区域斜率忽大忽小大概率是幅值不平衡或者正交误差没补偿。第三正反转对称性。正转和反转的角度曲线斜率绝对值应该一致。如果不一致说明解调窗口相位和激励参考之间有固定偏移。这种问题在示波器上很难发现但在VX1000数据上一眼就看出来了。5. 避坑实录我踩过的那些坑5.1 角度跳变和不连续最经典的就是atan2边界问题。软解码刚跑通时转轴一转角度曲线总在±180度位置出现一条垂直跳线。我最初以为解调错了后来确认是输出没做展开。处理方式在3.3里已经提过维护一个连续角度累加器跨边界时自动加减2π。还有一种跳变是正弦包络过零附近出现的毛刺跳变。比如sin_env在0附近时atan2里反正切比值会因为噪声在0左右来回横跳导致角度出现高频小跳变。解决办法是对sin_env和cos_env先做低通滤波再atan2确实有效。滤波参数别太猛不然延迟变大。5.2 角度抖动和噪声问题VX1000里看到的第一个角度抖动数据大概是正负0.5度左右这个量级低速还能忍高速根本不行。排查下来有三层原因一是DSADC采集样本本身带了不少噪声。把CIC抽取率适当调高数据率降低分辨率提高抖动明显小了。二是采样时刻离PWM开关太近。我之前偷懒直接用自由运行模式采样PWM一动作DSADC输入上的尖峰被采进来。后来按3.2的方式做了同步触发噪声立刻降了一截。三是软件滤波不够。加了一阶低通之后角度抖动降到了正负0.1度以内。从这个角度也能看出来软解码的精度很大程度上是靠信号处理堆出来的不是靠芯片性能硬扛。5.3 低速精度差和幅值不平衡旋变输出的包络幅值直接正比于激励幅值。转子转速很低时包络变化很慢理论上角度应该很稳但实测低速段反而抖动变大。查了很久发现是模拟调理电路的偏置电压温漂导致低速段信噪比下降。解决思路是做一次零点校准把信道偏置在初始化阶段测出来并减掉。类似的问题还包括SIN和COS两路幅值不一致这会造成角度误差随角度呈2倍频波动。在标定阶段测出两通道的幅值比然后在代码里归一化效果立竿见影。5.4 信号断路和接线错误旋变线束是耐用件但接插件氧化、端子松脱都会导致角度异常。有一次VX1000里看到的角度突然跳到某个固定值再也不动示波器一查是COS通道没有信号压线端子松了。软解码代码里最好加一个信号失配诊断如果两路包络矢量幅值突然掉到正常值的一半以下直接报传感器异常而不是让控制器硬着头皮用错误角度继续跑。这种保护功能在台架上无所谓装到整车上就特别必要。5.5 常见问题速查表为了方便后面维护我把遇到过得问题和排查顺序整理成了表格现象可能原因排查与解决建议角度在±180°跳变未做角度展开在角度输出侧做unwrap补偿角度高频抖动DSADC抽取率过低、采样点离PWM开关太近、滤波不足调高CIC抽取率、同步采样避开开关区、加低通滤波角度误差随角度周期性变化SIN/COS幅值不平衡、正交误差标定归一化和正交补偿角度整体偏移零位offset未校准手动零位标定低速阶段抖动明显变大通道偏置未校准、信噪比低加零偏校准提高激励幅值角度长时间不动信号线断、激励失效、DSADC通道饱和示波器/万用表量测引脚检查供电6. 这套软解码的边界和后续优化方向软解码不是万能的。硬件解码芯片有内部跟踪环能自动抑制信号幅值波动和噪声软解码这些都需要代码去做。但反过来这也正是软解码迷人的地方所有算法细节都可控。参数放在标定表里整个团队都能看到、都能调。投入的时间成本换来的是长期可维护性也值。从TC3xx的角度来看DSADC本身能力很强制约精度的往往是模拟前端、参考激励质量和采样同步策略。想进一步提升可以从几个方向拓展第一是自动标定上电后自动测零偏和幅值比省去人工操作第二是更高级的解调算法比如用跟踪观测器替代简单atan2能抑制单点噪声第三是在线信号诊断把SIN/COS通道断路、短路、幅值异常状态实时上报这在功能安全项目里几乎是硬需求。我在实际项目里最终把软解码角度送进了FOC电流环配合CCU6输出的6路PWM跑起来之后整体效果能跟上硬件解码芯片的九成功力。剩下的差距主要在极端高温和强振动环境下的稳定性这个靠软件补偿也能追回来不少。如果你也在折腾类似的东西建议按“信号波形→DSADC配置→软件解调→数据验证→标定补偿”这个顺序走每步都验证完再做下一步能少掉很多头发。
返回列表