ARTICLE DETAIL

资讯详情

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

TC3xx电机控制电流采样:PWM触发ADC与FOC实现详解

TC3xx电机控制电流采样:PWM触发ADC与FOC实现详解 1. 为什么电机电流采样是绕不开的坎做电机控制这几年我越来越确认一件事电流采样不是搭个ADC读数值那么简单它直接决定了整个控制环路的性能上限。不管是永磁同步电机PMSM的FOC还是直流无刷电机BLDC的方波控制电流环本质上都依赖ADC实时、准确地反馈绕组电流。如果你电流采出来的波形毛刺大、相位滞后后面PID算得再漂亮也白搭。英飞凌TC3xx系列在工业驱动和汽车电控里非常常见像TC275、TC364、TC387这些型号最大的优势是它把PWM生成、ADC采集、故障保护这些外设做得非常闭环友好。具体来说TC3xx里有好几套PWM方案CCU6是比较经典的电机控制单元GTMGeneric Timer Module更灵活、通道多常用于复杂时序ADC方面则是EVADCEnhanced Versatile ADC支持多通道同步转换、队列、外部触发。这些模块单独用都不难难的是把它们组合到一起形成一条高效的PWM触发ADC、ADC喂给控制环、控制环再调PWM的流水线。这篇文章我打算从方案选型、外设配置、代码框架到实际调试把整个链路走一遍。适合正在用TC3xx做电机控制、或者想从STM32这类MCU往更高端平台迁移的工程师参考。你会看到我实际配置时的参数选择也会看到我踩过的坑比如ADC采样点没对准、触发源选错、滤波过度导致相位延迟之类。这些内容参考手册里不会写得很直白但实际调试时全是硬骨头。2. 整体设计思路PWM和ADC如何协同工作2.1 电流采样拓扑怎么选先明确一个底层问题你要采什么位置的电流。常见有三条路线——高端采样、低端采样、相位采样也叫桥臂采样。高端采样是在母线正极串采样电阻能直接看到直流母线电流但共模电压高需要隔离放大器或高共模抑制比的运放成本高、布线麻烦。低端采样是在逆变器下桥臂MOSFET的源极和地之间串电阻共模电压低电路简单开发阶段最常用。但它最大的问题是采样窗口受限当某个下桥臂占空比接近0或接近100%时流过采样电阻的电流很小或者根本没有这个时刻采不到有效值。相位采样则是把采样电阻放在电机相线输出端配合运放差分采样能准确反映相电流FOC里最常用。我在这个项目里用的是三电阻低端采样PWM中心对齐的方案。原因有两个一是硬件改动最小三相下桥臂各放一个毫欧级采样电阻就能满足需求二是TC3xx的EVADC支持多通道同步采样可以在同一时刻把两相或三相电流一起采进来这正好匹配FOC需要的同时刻电流矢量。2.2 为什么必须在PWM中心点触发ADC这个点我最初理解得不够深后来被波形教育了。PWM驱动电机时MOSFET在开关瞬间会产生很高的dv/dt和di/dt这些噪声会通过寄生电容耦合到采样电阻和运放上。如果你用固定周期去采ADC采到的值会包含大量开关毛刺让人根本分不清是真实电流还是噪声。解决思路是让ADC采样点避开开关边沿落在PWM导通区间中段也就是中心对齐PWM的计数器归零或计数到周期值的时候。这时上桥臂已经稳定开通下桥臂同步续流也稳了采样电阻上的压降能真实反映相电流。TC3xx里的CCU6或GTM都可以产生周期性的同步事件比如T12的周期匹配事件这个事件直接作为EVADC的外部触发源。用这种硬件触发采样的方式ADC采样点天然地和PWM同步不需要CPU介入也不会因为中断抖动导致采样相位漂移。我建议直接用硬件触发不要用定时器中断去启动ADC。曾经图省事在PWM中断里用软件触发ADC结果发现中断响应延迟不同步高速运转时电流波形有明显的相位抖动。后来改成事件触发干净利落。2.3 TC3xx中的触发链路规划TC3xx里实现PWM触发ADC有几种常见接法。如果你用的是CCU6可以直接把CCU6的T12周期匹配事件映射到EVADC的请求源选择同步转换或队列转换模式。如果你用的是GTMGTM的ATOM或TIM模块可以生成触发信号经过GTM内部的信号路由输出给EVADC触发输入。还有一种是利用DPLL和GTM的MCSmulti-channel sequencer做复杂时序编排但一般电机应用用不上那么重。我这次用的是CCU6EVADC的方案触发链是CCU6的T12工作于中心对齐模式产生互补PWM输出带死区。T12周期匹配时产生触发事件。该事件作为EVADC的GxREQTRIG信号使能通道组的同步转换。转换完成后DMA或中断读取结果寄存器。这里有个关键点采样时刻需要根据死区时长和电流建立时间做补偿。也就是说触发信号最好比PWM中心点稍微偏移一点让采样电阻上的电流先稳定。TC3xx的EVADC支持同步转换触发延迟可以在触发链路上插入延时具体参数得根据实际板子上的RC时间常数去调。3. 核心配置实操从CCU6到EVADC3.1 CCU6的PWM通道配置CCU6模块里做电机控制主要用T12三路捕获/比较单元每路可以输出一对互补PWM比如CC60和COUT60中间插入死区。我先说死区这是很多人上来就忽略的参数。死区时间是防止上下桥臂同时导通导致直通的保护时间一般根据MOSFET的关断延迟和栅极驱动延迟来定常见值在500ns到2us之间。我用的IGBT模块死区设了2us如果是快管MOSFET1us左右就够。配置死区时要注意TC3xx的死区时间单位。CCU6的死区寄存器T12DTC里的DTM是以CCU6的时钟周期为单位的如果你配错了单位实际死区可能会比预期大很多导致波形畸变和效率下降。我用的是fGTM为100MHz的时钟死区2us就写200。换算公式很简单死区时间 死区计数值 / 模块时钟频率。CCU6还有故障输入模块这个强烈建议提前配好。电机过流时硬件比较器输出一个低电平信号接到CCU6的CTRAP引脚配置为故障输入一旦触发就立即封锁PWM输出把输出引脚置为安全电平。这个功能比软件中断快得多是真正能救命的机制。PWM故障保护这个词在热词里也出现了确实是最关键的一环。我见过不止一次因为软件保护反应慢导致MOSFET炸管的事故所以现在做项目都先配故障保护再做控制逻辑。3.2 EVADC的通道和触发配置EVADC配置的第一步是把通道分好组。TC3xx的EVADC通常有多个独立转换器组比如G0、G1每个组有自己的触发源和结果寄存器。我把三相电流采样通道分配在同一个组里启用同步转换模式这样一次触发就能同时采样三相电流。同步转换是EVADC一个很有用的能力它保证多个通道的采样保持电路在同一个时刻抓取电压值对于FOC这种需要同时刻三相电流的算法来说至关重要。采样时间也要仔细算。EVADC每个通道都可以独立配置采样时间Sample Time它决定采样保持电容充电的时长。如果采样时间太短采到的电压还没稳定误差会很大。我给电流采样通道配的是最大采样时间并且把转换结果分辨率设在12位。换算下来单通道转换时间大约在1us级别三通道同步转换也在几微秒内完成完全不会拖慢控制周期。有一点需要提醒采样电阻上的电压非常小。常见的采样电阻是10毫欧相电流假设是10A上压降也只有0.1V必须用运放放大后再进ADC。EVADC的参考电压一般是3.3V或5V你得把运放增益配到合适值让最大电流对应的电压在ADC量程的80%左右留出余量。如果运放输出超过满量程ADC读数会饱和电流波形就会被截平控制环路会表现出奇怪的震荡。3.3 电流重构和数值处理如果用的是三电阻采样理论上每个PWM周期都能同时读到三相电流。但在实际情况中当某一相的占空比接近0%或100%时该相下桥臂的导通时间太短采样电阻上有效压降的窗口不够导致采样值失真。这就是低端采样方案的重构盲区。解决办法是对于不满足采样条件的相用三相电流之和为零的约束推算出来在这个项目里是星形连接电机所以ia ib ic 0。数值层面的处理同样重要。EVADC读出来的是二进制码需要先换算成电压V (ADC值 / 4096) * Vref再根据运放增益和采样电阻阻值换算成电流I V / (Gain * Rshunt)这里有一个很多人忽略的零漂校准问题。运放本身存在输入失调电压ADC也存在偏移误差即使电流为零采样值也不一定是零。我做法是硬件初始化时PWM不输出先让电机相线处于开放状态然后读一批ADC值求平均把这个平均值作为零漂偏置存起来。之后每次采样都先减去这个偏置再做换算。这一步精度提升明显尤其是小电流工况下如果没有补偿低速转矩控制会很难受。滤波这一层我的经验是不要一开始就上重滤波。数字滤波会带来相位延迟电流环对延迟很敏感延迟一大带宽上不去动态响应就差。我建议先做轻度的中位值滤波或一阶低通滤波截止频率选在PWM频率的1/10左右把采样毛刺修一修如果还嫌噪声大再考虑从硬件上改进比如调整采样点、优化地线布局。4. 从采样到闭环电流环和速度环的实现4.1 离散化PID控制器电流采样搞定了下一步就是把它用起来形成闭环。闭环控制最核心的就是PID控制器。对于电流环一般用PI就够了因为电流响应快微分项容易引入噪声。控制周期通常是PWM频率的整数倍比如PWM为10kHz电流环控制周期就设为100us。PI控制器的离散化公式写成增量式比较方便float pid_current_single(float err, float kp, float ki, float ts, float *integral) { *integral err * ts; // 积分限幅防止积分饱和 if (*integral INTEGRAL_LIMIT) *integral INTEGRAL_LIMIT; if (*integral -INTEGRAL_LIMIT) *integral -INTEGRAL_LIMIT; return kp * err ki * (*integral); }积分限幅非常关键很多人在调试时会遇到启动超调大停不下来这类问题八成是积分饱和了。我一般在代码里还做抗饱和处理当输出已经达到PWM占空比上限时停止继续累加积分。讲一个实际的参数整定技巧电流环可以先只用P项一点一点加大Kp让电流快速跟踪阶跃指令且不振荡然后再加Ki消除稳态误差。Ki加大的时候如果出现低频率振荡几赫兹那种基本就是积分太强。用这个顺序调比网上那些试凑法靠谱得多。4.2 FOC坐标变换和电流环级联如果你推动的是PMSM那么电流闭环还包含坐标变换的过程。三相静止坐标系里的电流是正弦波直接用PI去追正弦波是有静差的所以必须做Clarke变换和Park变换把它变成d-q旋转坐标系下的直流量// Clarke变换三相 - 两相静止 i_alpha ia; i_beta (ia 2.0f * ib) / 1.7320508f; // Park变换两相静止 - 两相旋转 sin_th sinf(theta); cos_th cosf(theta); i_d i_alpha * cos_th i_beta * sin_th; i_q -i_alpha * sin_th i_beta * cos_th;其中theta是转子电角度需要从编码器或霍尔传感器获得。如果转子位置不准Park变换就会把真实电流映射到错误的坐标系里导致Id和Iq控制互相串扰。所以我建议不管你的传感器是什么类型都要做安装校准和零点偏置处理。电流环一般控制Iq转矩电流和Id励磁电流。对于表贴式PMSMId的给定值通常是0Iq给定来自速度环的输出。这就是典型的速度外环电流内环级联结构电流环的带宽要远高于速度环一般电流环响应时间在毫秒级速度环在几十毫秒级。如果你做的电机没有位置传感器还需要加入无感观测器估计转子位置这里就不展开了但我必须说一句电流采样的精度和同步性直接影响观测器的估计精度采样做不好无感算法基本凉一半。4.3 闭环调试的步骤和顺序闭环调试最忌讳一步到位。我踩过几次坑后总结了一个固定的调试顺序每次都照做效率高很多先开环测PWM。给一个固定占空比观察电机是否能正常转动、电流是否在合理范围确认硬件和PWM基本没问题。再做电流采样校准。让电机不转确认ADC读数和零漂然后手动给一个微小占空比对比实测电流和示波器探头测量值确认换算关系正确。闭环电流环。给定一个小的Iq指令逐渐加大看电流响应是否快速、无静差。最后做速度环。速度环输出限幅要特别注意避免速度环饱和后给电流环一个过大的阶跃容易把母线电压拉崩。这四步每一步都有独立的验证目标任何一步过不去都不要往后走。4.4 代码结构怎么放整个控制代码我建议分成三层底层外设驱动层、控制算法层、应用调度层。底层驱动封装CCU6和EVADC的寄存器操作控制算法层只处理纯数学计算输入是电流和位置输出是占空比应用调度层负责中断优先级的分配和状态机切换。TC3xx的控制中断优先级设计需要注意。电流环对实时性要求最高优先级最高一般放在CCU6的周期中断或GTM的中断里而不是放在ADC转换完成中断里。因为我用的是硬件触发ADC转换完成标志只是一个同步信号等它进了中断再去算控制已经来不及了。正确做法是ADC转换完成后由DMA搬到内存周期中断到点后直接读取这些缓存数据做运算。这样最稳定。5. 常见问题与排查技巧实录5.1 采样噪声大波形毛刺多这是我被问得最多的一个问题。排查方向先分硬件和软件硬件方面看运放供电是否干净、采样电阻和地线布局是否合理软件方面先确认采样点是不是和PWM边沿重叠了。我实际遇到的情况中八成以上是采样点没避开开关边沿。你可以写一个测试程序把PWM占空比固定然后慢慢移触发的延时寄存器同时观察ADC读数的波动找到波动最小的那一段那才是真正的采样窗口。另外还要检查运放的带宽是不是够。电流环控制的高频频段一般到几kHz但PWM的开关边沿含有极高频率的成分如果运放的压摆率不够输出跟不上真实电流变化也会表现为波形失真。我这款运放选的GBW增益带宽积在10MHz以上实测够用。5.2 电流波形畸变正弦度不好电流波形畸变通常不是采样的问题而是PWM占空比计算或死区效应。死区时间会导致实际输出电压比给定电压小尤其在低速轻载时死区造成的电压误差占比更大电流波形会出现明显的台阶和零电流钳位现象。本质上是MOSFET开关并非理想瞬间完成死区时间内电流只能靠二极管续流方向不同电压误差符号也不同。方法有两种一是做死区补偿根据电流方向对占空比做修正二是提高PWM频率缩小死区在一个周期中的占比。最简单的方式是先提高PWM频率看波形有没有改善如果改善明显说明死区效应占主要因素。5.3 PWM故障保护误触发CTRAP保护老是误触发原因多在故障输入信号毛刺上。外部比较器输出的故障信号如果没做滤波一个窄的噪声尖峰就会触发封锁。CCU6的故障输入本身可以配置有效电平检测模式还有输入滤波功能。我在实际项目中把故障信号的展宽拉长到2us以上同时使能了输入滤波误触发率大幅下降。如果你遇到上电瞬间误触发还要检查控制信号默认电平是否和故障有效电平冲突。5.4 ADC采样转换结果一直不变或全为0这个问题的根源通常是EVADC的请求源没有正确使能或者触发信号根本没有到达。排查时先绕开硬件触发用软件触发方式读一次看ADC本身能不能工作。能工作的话问题就在触发链路检查CCU6的周期匹配事件是否输出、EVADC的GxREQTRIG寄存器里是否选择了正确的触发源。这块设置涉及多个寄存器联动建议逐项对照参考手册排查。5.5 电流环带宽上不去如果动态响应总是肉肉的滞后明显主要注意这几项控制周期是不是太长。PWM频率10kHz时控制率要在100us内完成如果算法里的三角函数用软件算时间会吃紧。TC3xx有硬件CRC和浮点单元但sinf/cosf库函数仍然要几十微秒建议用查表或多项式近似替代。采样结果有没有做重滤波。重滤波带来的相位延迟会直接压掉电流环带宽。如果噪声允许滤波越轻越好。坐标变换的角度有没有延迟补偿。在高速运行时转子位置在每个周期都变化需要补偿一个角度增量。6. 一些实际经验总结做这套系统下来我最大的体会是TC3xx的外设能力很强但如果只按MCU手册一个个配寄存器很容易迷失在繁多的选项里。更好的方式是从控制需求倒推先确定采样策略和控制周期再决定PWM怎么配、ADC怎么触发。外设是为算法服务的而不是反过来。调试时一定要多看波形。即使有ADC读数也要把DAC输出或调试接口里的实际电流波形和电流探头测到的真实波形对比看。毕竟ADC转换出来的只是一堆数字真实世界发生了什么示波器永远不会骗你。还有一个小技巧调控制参数时把目标电流设成一个低频正弦波比如10Hz然后看实际电流跟踪给定电流的情况。这样能直观看到滞后、增益误差和穿越频率比只盯阶跃响应信息量大得多。我每次都会配合做这个测试能快速定位限幅、饱和和时序问题。如果后续要做更复杂的应用比如FOC无感控制或者带弱磁的高速运行这套采样链路的稳定性会泛化成最基本的保障。再往上做容错控制和功能安全就以它为基础了提前把ADC校准、故障保护、诊断检测这些底层能力搭建好会省下后面很多功夫。
返回列表