十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

TC3xx旋变软解码实战:etpu_set_Resolver配置与调试

TC3xx旋变软解码实战:etpu_set_Resolver配置与调试 简介一套基于eTPU的旋变软解码函数包面向使用NXP MPC55xx/56xx/57xx系列MCU的电机控制、伺服驱动与新能源电驱开发者旨在通过软件方式完成旋转变压器位置解码从而省去硬件解码芯片的成本与外围电路。压缩包共28个文件以24个h头文件为主配合2个C源文件、1个chm帮助文档和1个txt说明头文件覆盖MPC5533/5534/5553/5561/5565/5566/5567/563M/5674F/5676R/5777C等多款芯片的寄存器变量定义源文件则提供eTPU旋变软解码函数接口便于跨平台迁移与集成。chm文档给出eTPU工具链的API参考txt文件简述配置流程可直接参考实现旋变零位偏置补偿、转速与角度估算等关键逻辑。压缩包整体仅190KB改动轻量适合已有eTPU基础、希望在项目中快速验证旋变解码方案的中高级嵌入式工程师目前已有933人学习与下载。1. etpu_set_Resolver 到底是什么从旋变软解码的职责说起做电驱控制器的人对 Resolver 旋变都不陌生转子位置要精确到零点几度信号链却容易被当成「上电就能用」的黑盒。过去旋变解码靠专用芯片转到 TC3xx 这类 MCU 上做软解码后你会发现时序才是真正的拦路虎——什么时候给励磁、什么时候采 Sin/Cos、什么时候算角度一旦对齐关系没建好角度在低速时抖得没法看。etpu_set_Resolver 这个名字容易让人误以为只是配一下 PWM 占空比实际上它是整个旋变软解码的入口函数eTPU 负责产生激励和采样触发EDSADC 负责采集软件在这条链路上完成解调、归一化和角度解算。这篇文章就从原理到实现把这套方案的参数怎么定、函数怎么落、调试时看哪些现象讲清楚。2. 旋变软解码原理与 eTPU 的选型逻辑2.1 Resolver 为什么需要「软解码」从硬解码芯片说开去旋变本身是一个小型的旋转变压器转子励磁绕组通入高频正弦激励两个定子绕组分别感应出随转子角位置按正弦和余弦规律变化的电压。解码要做的就是把 Sin/Cos 两路信号的包络幅值提取出来还原出转子角度。专用解码芯片的做法是在片内完成激励产生、同步解调、滤波和跟踪环路MCU 只需要通过 SPI 读出角度。听起来省事但代价是 BOM 上多一颗芯片温度范围、失效率、诊断能力都受它约束。更重要的是芯片把角度环路封死了滤波带宽、跟踪速度这些关键特性几乎不可调。软解码把这一整套搬进 MCU激励由 PWM 生成Sin/Cos 由 ADC 采集角度由软件解算。省掉一颗芯片的同时采样点位置可编程、滤波可定制、故障诊断可以直接进功能安全监控。代价也很直接时序必须由软件保证激励和采样的相位关系一旦漂移角度误差会在整个转速范围内放大。这就是 eTPU 出场的原因——它是专门为这种时间关键任务准备的。2.2 eTPU 在旋变解码里的三个职责eTPUEnhanced Time Processing Unit是英飞凌 AURIX 系列上的可编程定时协处理器拥有一套独立的微型指令集可以直接读写自己的通道寄存器。它不像普通定时器那样只能做周期匹配而是可以执行一小段时序逻辑基本不占 CPU。在 Resolver 软解码这个场景里我一般把 eTPU 承担的工作拆成三块产生励磁激励输出固定频率的 PWM例如 10kHz 方波经过外部 RC 低通滤波和功放后成为旋变励磁信号。占空比和频率由 eTPU 通道的匹配寄存器决定改参数只需要重写寄存器。给出采样同步触发ADC 不能随便在任意时刻采必须在励磁波形稳定后再采避免开关毛刺和电流噪声。eTPU 的另一个通道产生一个带可编程延迟的触发信号接到 EDSADC 的同步输入上。打时间戳eTPU 通道内部有独立的时间基准TCR在输入边沿到来时能把当前时刻锁存到通道寄存器里这个时间戳是速度计算和采样对齐的依据。前两点是旋变软解码能不能干成的关键第三点是它比普通中断方案优势明显的根源。用通用定时器中断去管这些事定时器优先级竞争和中断延迟抖动会让 10kHz 级别的采样时序产生微妙漂移回到老路上去了。2.3 软解码的信号链与角度坐标系从激励到角度整个链路可以这样拆解励磁 PWM → 滤波功放 → Resolver 转子绕组 → 定子 Sin/Cos 差分信号 → EDSADC 采样 → 数字解调 → 包络归一化 → 转成 sinθ / cosθ 坐标。注意最后一步不要急着做反正切。先把两路包络做归一化得到的是单位圆上的二维坐标。这样做的好处是在进入角度计算之前可以方便地做幅值监控和正交性检查而且后续换用跟踪观测器时坐标形式天然合适。只有当你确定只需要一个原始角度且采样噪声足够大时才直接对坐标做 atan2 求出 θ。采用 EDSADC 而不是普通 ADC原因是旋变信号往往叠加在比较高频率的载波上需要片内的抽取滤波器和解调能力来抑制带外噪声。TC3xx 系列的 EDSADC 专门支持同步采样和多通道复用和 eTPU 的触发接口可以直接对接省去外部调理电路的不少麻烦。3. 手写 etpu_set_Resolver激励、采样同步与角度解算落地3.1 数据结构把 Resolver 参数收拢成一个配置体设计函数前先把参数收拢成结构体避免后续加参数时到处改函数签名。下面这个配置体涵盖了我认为一个 Resolver 通道需要暴露的所有可调项typedef struct { uint8_t ch_exc; /* eTPU 通道号励磁 PWM */ uint8_t ch_sync; /* eTPU 通道号采样同步触发 */ uint16_t exc_freq_hz; /* 励磁频率常见 10000 Hz */ uint16_t exc_duty_x10; /* 占空比单位 0.1%如 500 50% */ uint32_t tcr_freq_hz; /* eTPU 时间基准频率通常为系统时钟分频 */ uint16_t sync_delay_ns; /* PWM 上升沿后多少 ns 触发采样 */ uint16_t sync_width_ns; /* 触发脉冲宽度对应 EDSADC 采样窗口 */ float pole_pairs; /* 旋变极对数电机极对数不等同 */ float zero_offset; /* 零位角度偏移标定用 */ float gain_sin; /* Sin 通道标定增益 */ float gain_cos; /* Cos 通道标定增益 */ } resolver_config_t;字段含义展开讲几点。exc_duty_x10用 0.1% 作单位而不是直接用百分比是为了在整数域凑出更高分辨率10kHz 励磁下周期 100μs0.1% 对应的脉宽变化是 100ns这在多数滤波电路下已经足够细腻。tcr_freq_hz是 eTPU 通道时间基准的实际频率它直接决定下面所有 tick 数的换算精度取值一般来自系统时钟分频链先确认它再谈其他参数。sync_delay_ns和sync_width_ns这两个参数最容易被忽略它们决定 EDSADC 在励磁波形上哪个点位开始采样、采多久软解码的稳态噪声一半以上跟它们有关。3.2 etpu_set_Resolver 的核心逻辑PWM 参数计算与通道绑定函数的核心逻辑就是把上面的配置换算成 eTPU 通道能直接吃的硬件参数PWM 周期、高电平匹配值、同步触发延迟匹配值然后写进对应通道的寄存器并启动。int32_t etpu_set_Resolver(eTPU_MODULE_e mod, resolver_config_t *cfg) { uint32_t period_tick; uint32_t high_tick; uint32_t delay_tick; uint32_t width_tick; /* 1. 把频率换算成 ticks */ period_tick cfg-tcr_freq_hz / cfg-exc_freq_hz; high_tick period_tick * cfg-exc_duty_x10 / 1000; /* 2. 同步通道的延迟和脉宽也从 ns 换算成 ticks */ delay_tick (uint32_t)((uint64_t)cfg-sync_delay_ns * cfg-tcr_freq_hz / 1000000000UL); width_tick (uint32_t)((uint64_t)cfg-sync_width_ns * cfg-tcr_freq_hz / 1000000000UL); /* 3. 配置励磁通道输出模式、周期、高电平匹配值 */ etpu_pwm_init(mod, cfg-ch_exc, period_tick, high_tick); /* 4. 配置同步通道从励磁上升沿开始延时输出单脉冲 */ etpu_one_shot_with_delay(mod, cfg-ch_sync, delay_tick, width_tick); /* 5. 建立两通道之间的链路同步通道由励磁通道的匹配事件触发 */ etpu_link_channels(mod, cfg-ch_exc, cfg-ch_sync); return 0; }逻辑很简单但有几个点容易出问题。第一步的整数除法会截断余数如果周期不是整数 tick实际励磁频率会偏离目标值短时间看不出来但累积相位误差会让采样点缓慢漂移。解决办法是把余数保留下来用 eTPU 支持的「周期累加余数」方式补偿或者直接确认分频链让tcr_freq_hz % exc_freq_hz 0。第三步的high_tick如果为零或等于period_tick硬件行为在部分 TC3xx 系列上是不可预期的代码里要加保护。第五步的通道链接是 eTPU 特有的能力它让同步通道完全由励磁通道的匹配事件驱动而不是靠 CPU 在中断里二次触发这也是时序抖动能压到纳秒级的原因。3.3 EDSADC 触发与时序对齐AURIX TC3xx 采样窗口的计算eTPU 的同步通道给出触发脉冲之后另一端接的是 EDSADC 的同步采样输入。这里要算清楚一组时间关系我通常列成一张表来对照参数典型值说明励磁频率10 kHz由旋变变压器特性和外部滤波电路决定PWM 周期100 μs10 kHz 励磁下对应值TCR tick10 ns100 MHz eTPU 时间基准PWM 高电平时间50 μs占空比 50% 时同步延迟40~60 μs使采样点落在高电平中段采样窗口2~5 μs窗口越短抗噪越好但信噪比下降为什么采样点必须落在高电平中段因为 PWM 边沿附近有开关瞬态而且励磁信号经过功放后存在上升沿振铃采样窗口如果贴着边沿采集到的包络幅值会有明显抖动。把窗口放在最稳定的区间配合 EDSADC 的抽取滤波器等效噪声可以压到很低。TC3xx 系列还有一个特性值得利用EDSADC 支持与 eTPU 的触发事件直接关联采样结果连同时间戳一起进入结果寄存器省掉了 CPU 干预。这样角度解算时能知道每个 Sin/Cos 采样点对应的精确时刻速度计算用相邻两次角度差除以时间差时时间基准是一致的。3.4 从包络解调到角度ISR 里的那一段关键代码硬件链路打通后软件每周期要做一次解调拿到 EDSADC 的 Sin 和 Cos 幅值减去零点偏置乘以标定增益得到归一化坐标再算角度。以下是一个常见的 ISR 片段void resolver_isr(const resolver_measurement_t *m) { float s (m-sin_raw - offset_sin) * cfg.gain_sin; float c (m-cos_raw - offset_cos) * cfg.gain_cos; float mag2 s * s c * c; float theta; /* 幅值监控mag2 应接近 1.0偏差过大说明接线或旋变异常 */ if (mag2 1.5f || mag2 0.2f) { resolver_set_fault(RESOLVER_FAULT_AMPLITUDE); return; } /* 归一化后直接算角度 */ theta atan2f(s, c) - cfg.zero_offset; /* 角度限幅到 [-pi, pi]并缓存在全局变量供控制环使用 */ resolver_output.theta wrap_angle(theta); }offset_sin和offset_cos在初始化时用零输入状态下的 ADC 读数标定gain_sin和gain_cos在旋转状态下用幅值归一化得到。mag2的阈值不是拍脑袋定的正常工作时归一化幅值约等于 10.2 到 1.5 这个区间留出了旋变本身幅值公差和温漂余量。wrap_angle把角度折叠到 ±π否则控制环里的角度差计算会出现 359 度和 1 度之间跳变的问题。这个 ISR 的执行时间一般在微秒量级远低于 10kHz 的周期不影响其他任务。4. 参数标定与调试踩坑让 etpu_set_Resolver 在 TC3xx 上稳定跑起来4.1 必调的 4 个参数励磁频率、采样窗口、极对数与零位旋变软解码跑不跑得稳取决于参数标定。以下是初始化时最该仔细确认的四个参数参数推荐初值错误表现排查方向励磁频率10 kHz角度误差随转速周期性增大确认旋变手册频率范围检查滤波电路截至频率采样窗口位置PWM 高电平中段角度噪声大且噪声频率与励磁一致用示波器对比激励波形与触发脉冲位置极对数与旋变型号一致电角度周期性翻转速度值不对电机转一圈检查角度周期次数零位偏移与机械安装角度对齐对拖时 d/q 轴电流耦合锁定电机轴用编码器或对拖台架找零点励磁频率不要随便改。旋变定子绕组是感性负载频率太高励磁电流上不去信号幅值偏小频率太低则相邻采样周期内角度变化量变大低速性能尚可高速时分辨率不够。常见做法是先用厂商手册推荐值跑通再根据实际信噪比微调。极对数和电机极对数不要混为一谈有些旋变是多对极的角度计算出来后要换算成机械角度否则速度环和位置环的增益系数全部不对。4.2 最常翻车的三处时序问题时序问题没有仿真器能直接抓出来只能靠现象反推。第一处翻车点是采样窗口贴到 PWM 边沿。表现是角度噪声很大而且噪声里明显有励磁频率成分这是因为窗口里混入了开关毛刺。处理方式是用示波器同时看激励输出和 eTPU 同步触发把窗口往中段挪。第二处是 EDSADC 抽取滤波器带来的角度滞后。EDSADC 内置抽取滤波从模拟输入到结果寄存器之间存在固定群延迟表现为角度随转速升高而系统性滞后。这个滞后不能用观测器硬拉回来要在角度环里按转速做前馈补偿转速越高补偿量越大。第三处是角度更新率与控制环带宽不匹配。旋变解码输出如果只有 10kHz而控制环跑到 20kHz就会出现角度值隔周期跳变的情况。解决方向有两个要么把角度更新率提到和控制环一致要么在控制环里用角度外插值补一拍。前者压力在 ISR后者要小心外插误差在高速时变大。4.3 调试手段角度噪声与速度抖动的定位调试时我会先把转台给定一个固定角度然后抓一组角度输出看码值抖动范围。这一步能排除大部分机械和电气问题如果静止状态下角度抖动超过 0.1 度问题基本在采样窗口或滤波参数如果抖动很小再转起来看速度抖动。速度抖动大的时候先别急着调观测器增益而是把原始角度波形直接导出来看有没有台阶跳变。旋变软解码里最常见的「速度毛刺」其实就是角度值在相邻采样点间跳了一个微小台阶微分后被放大成速度脉冲。确认这个问题后要么调整角度滤波要么切换到跟踪观测器后者在第 5 章展开。另外一个比较容易忽略的验证点是采样时间戳对齐。把 eTPU 锁存的时间戳和 EDSADC 完成标志放在同一个 ISR 里打印出来间隔应该是个稳定的常数。如果时间戳跳动量超过 1μs说明触发链路出了问题角度差除以时间差算出来的转速自然不准。5. 把 atan2 换成跟踪观测器旋变软解码低抖动的那个收尾技巧5.1 直接反正切的三个缺点直接atan2f计算角度虽然简单但实际用起来有三个麻烦。第一静止和极低速时采样量化噪声会直接反映成角度码值抖动这个抖动被速度计算微分后放大成很大的速度毛刺。第二角度在 ±π 边界附近跳变时如果后续环节没做好 wrap速度会瞬间出现一个虚假尖峰。第三atan2f完全不利用旋变的物理模型任何单点噪声都会无衰减地进到角度输出里滤波全靠外面额外加。5.2 二阶跟踪观测器写进 ISR 的最小改法改用跟踪观测器是经典的工程做法。它的思路是让一个内部角度模型去跟踪实际角度模型包含角度和角速度两个状态用角度误差驱动模型修正而不是直接用误差本身作为输出。实现代码如下typedef struct { float theta_hat; /* 估计角度 */ float omega_hat; /* 估计角速度 */ float kp; /* 位置环路增益 */ float ki; /* 速度环路增益 */ float ts; /* 调用周期单位秒 */ } rdc_obs_t; float rdc_obs_step(rdc_obs_t *o, float theta_meas) { float err theta_meas - o-theta_hat; /* 误差折叠到 [-pi, pi]避免边界跳变 */ while (err 3.14159265f) err - 6.28318530f; while (err -3.14159265f) err 6.28318530f; /* 角度由角速度积分加位置误差修正得到 */ o-theta_hat (o-omega_hat o-kp * err) * o-ts; /* 角速度由角度误差积分得到 */ o-omega_hat o-ki * err * o-ts; return o-theta_hat; }参数选择上我一般按二阶系统的带宽来定kp 2 * zeta * wnki wn * wn阻尼zeta取 0.7 到 1.0带宽wn取角度更新率的十分之一到五分之一。以 10kHz 更新率为例wn取 1000 rad/s 左右kp约等于 1400ki约等于 1000000注意单位要跟ts匹配。5.3 验证与故障检测的收尾做法替换成观测器后验证方式分两步。第一步静止测噪声固定角度观测器输出的角度码值抖动应该比直接 atan2 低一个量级。第二步匀速扫转速让转台从低速慢慢升到高速角度误差应保持在一个稳定范围不要出现振荡。这里的振荡点就是带宽设得太高的信号往回降wn即可。故障检测也可以顺势挂在观测器上观测器的角度误差持续大于一个阈值且不收敛说明旋变信号异常theta_hat和omega_hat的数值可以直接送给功能安全监控模块。一个额外的收尾技巧是把角度误差的 wrap 限制放在调用处而不是观测器内部这样速度输出在跨越 ±π 时不会产生人为的毛刺配合 eTPU 时间戳做速度微分时整体抖动还能再降一个量级。本文还有配套的精品资源点击获取
返回列表