ARTICLE DETAIL

资讯详情

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

TC3xx电机电流采样:PWM与ADC硬件同步及电流环落地

TC3xx电机电流采样:PWM与ADC硬件同步及电流环落地 做电机驱动的朋友应该都有体会电流环是整个运动控制系统里最容易被“想当然”处理的一环。很多人觉得PWM输出不就是一个占空比ADC采样不就是定时读一下电压两个功能单独跑都能工作但一旦把二者组合起来做电机电流采样就会发现一堆问题采样点落在开关边沿、ADC结果毛刺严重、相电流波形畸变、闭环一上就啸叫。这篇内容就想把TC3xx上基于PWMADC实现电机电流采样的全套逻辑讲清楚从硬件同步原理、寄存器级配置、采样链路的数据处理一直聊到电流环的工程化落地。我默认看这篇文章的人要么在用AURIX TC3xx做车用电驱要么正在从STM32平台往更高功能安全等级的MCU迁移。TC3xx的CCU6、EVADC、GTM这些模块能力很强但强不等于好用配置不当照样采不到干净的电流。下面这些内容是我实际调试中反复验证过的做法既有原理推断也有可以直接抄走的参数初始值和排查方法。1. 电流采样在电机闭环里的真实地位为什么先聊PWM和ADC的配合1.1 三环结构里电流环的特殊性电机控制通常分成位置环、速度环、电流环。位置环和速度环的带宽可以很低几十赫兹到几百赫兹都够用但电流环作为最内环带宽往往要达到PWM频率的十分之一甚至更高。举一个比较直观的例子PWM频率10kHz电流环闭环带宽如果要做到1kHz左右意味着从电流采样到占空比更新之间整个链路的延迟必须压缩在几十到一百微秒级别。这个延迟一旦过大相位裕度就会恶化电流环表现出来就是震荡、超调、甚至带载直接飞车。电流环控制的直接对象是绕组电流而绕组电流在PWM开关动作下并不是一个平滑的直流信号。可以把它理解为每个PWM周期里电流先在上管导通时上升再在下管续流时下降宏观上呈现一个叠加了开关纹波的波形。电流闭环真正关心的往往不是这个开关纹波本身而是纹波“中线”的变化趋势也就是每个PWM周期内的平均电流或特定时刻的瞬时电流。为了拿到这个电流ADC采样时刻就不能乱选必须和PWM的开关状态对齐。很多刚从MCU裸机编程转过来的人会犯一个典型的错误用固定的定时器中断去触发ADC频率和PWM恰好一样以为这样就算“同步”了。实际上如果定时器中断的相位和PWM载波没有硬件上的绑定关系采样点会随着程序运行一点点漂移一会儿采到上管导通区一会儿采到下管导通区电流波形上就会出现周期性的跳动。这个现象在低速大电流时尤其明显。1.2 为什么PWM和ADC不能各干各的在TC3xx这样的芯片上PWM产生的硬件模块是CCU6、GTM等ADC是EVADC它们是不同的外设。如果只是把二者都配置成工作而不建立硬件触发链路那就等于让两个人各干各的事完全没商量。PWM的占空比更新由CCU6的中断驱动ADC采样由自己的请求源驱动两个时间基准没有公共的同步点数字上看起来频率一致实际相位却一直在漂。要让它们配合核心思路是用PWM事件作为ADC的“起跑信号”。也就是说CCU6在某个确定的载波相位点产生一个触发事件EVADC收到这个硬件触发信号后启动采样。这样ADC永远落在PWM周期里固定的位置不受CPU调度抖动影响。TC3xx里可以用CCU6的T12比较事件直接触发EVADC也可以通过内部信号路由给GTM再转成EVADC触发源。无论哪种路径关键点都是“触发信号来源于PWM时基而不是独立的软件定时器”。这里要特别强调软件触发不是不能用但在大功率电机驱动里不推荐作为电流采样的主要手段。因为中断响应时间受到总线负载、Cache Miss、其他中断优先级的影响可能出现微秒级甚至更大的抖动。电流采样对时间精度要求高抖动直接变成电流噪声。PWM硬件触发的方式延迟是固定的可预测适合做确定性控制。1.3 不同采样拓扑对PWM同步的要求电机驱动里的电流采样拓扑大致分三类三电阻、双电阻、单电阻。每种拓扑对PWM和ADC的配合要求不一样。三电阻方案在每个PWM周期里需要同时采样两相的下管导通电流或上管导通电流以此重构三相电流。它要求在某一对开关管稳定导通的时间窗口内完成两路ADC同步采样所以对采样窗口宽度的要求是“够用就行”相对宽松。双电阻方案需要采两相电流第三相由基尔霍夫定律算出来它在某些特殊扇区会出现某一相PWM占空比过小、采样窗口不足的问题这时候需要对PWM波形做移相处理或者放弃重构等待下一个周期。单电阻方案的要求最苛刻它需要在一个PWM周期内捕捉两次不同的开关状态分别对应两个非零电压矢量然后从母线电流的两次采样中还原出相电流。单电阻方案对采样窗口的死区、最小脉宽、开关振铃时间都非常敏感硬件同步不好基本跑不起来。不管哪种拓扑有一个共同原则ADC采样必须避开死区、开关边沿振铃和栅极驱动传播延迟的几个关键时间段。这就是为什么“PWM配置”和“ADC配置”在电机控制项目里必须一起设计先定采样窗口再定触发时刻最后才是写寄存器。2. TC3xx相关硬件块梳理CCU6、EVADC、TRIG与中断路径2.1 CCU6的PWM输出与同步能力TC3xx是英飞凌AURIX 2G系列电机控制里常用的PWM生成模块是CCU6。CCU6包含T12和T13两个时基单元T12可以生成三相PWM非常适合无刷直流电机和PMSM的六步换相或空间矢量调制。每个通道都有独立的比较寄存器可以配置成中心对齐或边沿对齐模式。电机控制更常用中心对齐因为在一个载波周期的开始和中间三相开关状态比较“整齐”电流采样窗口更容易安排。CCU6另一个不太显眼但非常重要的能力是事件生成。T12计数到达特定值或者比较匹配时可以产生内部事件信号这个信号能直接连接到其他模块。比如T12在周期匹配时触发一次EVADC采样或者在PWM比较匹配时触发保护动作。这样一来PWM波形、ADC采样、故障保护都建立在同一个时基上确定性很好。配置CCU6时死区也是重点。电机驱动绝不允许上下桥臂同时导通所以要在每路PWM输出上加入死区时间。CCU6的插入死区方式比较灵活可以选择基于T12的事件生成互补信号并在上升沿延迟一段时间形成死区。死区时间大小要根据功率管的开关特性和栅极驱动电阻来定太短有直通风险太长会压缩采样窗口并增加电流谐波。2.2 EVADC的通道、请求源和触发TC3xx的ADC模块叫EVADC和普通MCU上的ADC相比它的主要特点是支持多个独立的转换内核可以并行采样而且触发机制特别丰富。EVADC每个内核对应一组通道通道之间通过模拟多路开关复用。在电机电流采样中至少需要同时采集两路电流所以最好使用两个不同的ADC内核避免因为通道复用而导致两路采样之间存在时间差。EVADC的请求源分为几种队列请求、背景请求、扫描请求等。队列请求用于按优先级顺序转换一组通道适合多通道扫描背景请求通常优先级最低。电流采样场景下我一般配置成“外部触发 队列转换”的模式由CCU6触发事件发起一次转换转换队列里放两个通道或者用两个内核各自转换一个通道。还有一个经常被忽略的点是EVADC的采样时间设置。TC3xx EVADC支持可编程的采样时间采样电容充电时间不够的话转换结果会偏小而且通道阻抗越大误差越明显。电流采样前级一般有运放输出阻抗不高但PCB走线和滤波电容的搭配仍然会影响采样精度。建议给运放输出留足够的建立时间并且将ADC采样时间设置得比最小要求略大一些。2.3 同步信号路径与延迟估算从CCU6的事件信号到EVADC真正开始采样中间有一段硬件路径。TC3xx内部有信号路由矩阵可以把CCU6的事件连接到EVADC的外部触发输入。如果使用MCAL或iLLD这项配置通常藏在底层驱动里但你必须看懂它在干什么。考虑延迟时要区分“触发事件产生”和“ADC开始采样”两个时刻。触发信号经过内部总线或路由逻辑会有几纳秒到几十纳秒的延迟ADC模块收到触发后还要经过触发同步逻辑然后才进入采样阶段。这段延迟虽然很小但在高频PWM或者采样窗口特别窄的单电阻方案里不能完全忽略。更稳妥的做法是不要把采样点安排在理论窗口的最边缘而是留出至少几百纳秒的裕量。还要注意中断路径的延迟。EVADC完成转换后通过结果寄存器或中断通知CPU。如果实时性要求高可考虑使用DMA将ADC结果直接搬到内存在PWM同步中断里读取整批数据。这样能减少CPU从外设寄存器读取数据带来的总线延迟也方便在中断服务里集中处理。3. 从零配置先算清楚时间参数再写寄存器3.1 载波频率与采样窗口的关系配置PWM和ADC之前第一件事不是打开开发环境而是拿笔算时间。电机PWM频率常见的是10kHz、12kHz、16kHz高速电机可能到20kHz以上。PWM频率越高电流纹波越小但开关损耗越大同时每个PWM周期留给采样和控制计算的时间越短。采样窗口在哪里以最常用的低端电流采样为例电流采样电阻放在下管和地之间只有当某相下管导通时流过该相的电流才会在采样电阻上建立电压。如果使用中心对齐PWM在载波周期中心也就是计数器归零或匹配点附近开关状态处于最“平均”的状态此时三相下管导通时间不一定同时满足采样窗口要求所以需要根据当前输出电压矢量来确定能采到哪一相以及在哪个时刻采样。很多人在配置ADC触发时刻时会把触发点放在PWM周期中间这是一个合理起点。但要结合死区和振铃做调整。如果PWM频率是10kHz周期100us中心点附近有50us的正负区间看起来窗口很充裕可实际上“充裕”指的是开关状态稳定时间而不是整个半周期。死区、功率管开关时间、电流建立时间都会消耗窗口。3.2 采样电阻上有效采样窗口的计算要量化有效采样窗口可以列一个简单的不等式窗口时间 死区时间 开关振铃消隐时间 采样电容充电时间 ADC转换时间其中死区时间通常在几百纳秒到几微秒之间由功率管决定。开关振铃消隐时间取决于栅极驱动强度、PCB寄生电感和采样电路滤波一般留0.5us到2us不等。采样电容充电时间就是EVADC可配置的采样阶段通常几十纳秒到几百纳秒。ADC转换时间对于12位转换大概在0.5us到1us级别。举个例子PWM周期100us某一相下管导通占空比如果是20%也就是20us看上去足够。但如果死区2us、振铃1us、采样阶段0.3us、转换1us那有效窗口还有15us以上怎么采样都够。问题出在占空比很小的时刻比如空间矢量调制中某一相占空比低于5%此时下管导通时间只有5us扣除死区和振铃剩下的窗口可能只有1.5us左右对ADC采样和转换来说就非常紧张。这也是为什么单电阻采样比多电阻采样难做。它必须在极窄的窗口里完成一次可靠的ADC转换稍有延迟就会采到开关边沿。如果你在做单电阻方案建议先量化各个时间参数不要只靠示波器猜。3.3 ADC采样时间、转换时间的配合TC3xx EVADC支持设置采样时间通常用若干个ADC时钟周期表示。ADC内核时钟一般由CCU频率分频得到具体取决于芯片配置。比如ADC内核时钟20MHz采样时间设为10个周期那就是0.5us12位转换时间如果是13个周期那就是0.65us。这只是一笔初始估算实际值要以数据手册的电气特性为准。使用多路同步采样时要注意所有参与同步采样的ADC内核它们的采样窗口应尽量重合。TC3xx模块本身支持同步触发但不同内核如果配置不同采样时间结束时刻会有差别。我在项目里习惯把所有电流采样相关通道配成完全一样的采样时间和转换参数保证两路电流的采样时刻一致性。另外不要在转换过程中去改触发配置。EVADC转换过程中如果收到新的触发请求会把它排队或忽略具体行为取决于GPX相关配置。电流采样这种需要周期触发的场景适合配置成“单次转换、每次由外部触发启动”的模式而不是自由运行模式。自由运行模式虽然省事但无法保证和PWM同步。3.4 一个可用的初始配置参数示例下面给一组我常用的出发点参数适合三相永磁同步电机PWM频率10kHz母线电压48V额定电流20A采样电阻1mΩ运放增益20倍。这组参数不是最终参数但作为初始值足够跑通。CCU6 T12计数周期100us中心对齐模式死区时间2usEVADC采样时间0.5us10个ADC时钟周期EVADC转换时间0.65us12位模式ADC触发源CCU6 T12周期匹配事件ADC触发时刻载波中心点后移4us双电阻采样使用ADC内核0和内核1各采一个通道代码层面以TC3xx的iLLD为例核心动作是配置CCU6的 event 和中断优先级以及EVADC的 gate/trigger。产品代码里建议用MCAL但调试阶段iLLD更快。下面是一段思路性的配置伪代码具体API以你使用的SDK为准。// CCU6: 中心对齐10kHz死区2us ccu6_init_timer(T12, CCU6_UP_MODE_CENTER, 100us); ccu6_init_deadtime(2us); ccu6_enable_period_match_event(T12); // EVADC: 由CCU6事件触发采样两路电流 evadc_init_kernel(ADC_KERNEL0, 12bit, sample_time_10_clk); evadc_init_kernel(ADC_KERNEL1, 12bit, sample_time_10_clk); evadc_set_ext_trigger(ADC_KERNEL0, TRIG_CCU6_CM, rising_edge); evadc_set_ext_trigger(ADC_KERNEL1, TRIG_CCU6_CM, rising_edge); evadc_add_channel(ADC_KERNEL0, current_u_channel); evadc_add_channel(ADC_KERNEL1, current_v_channel);实际项目里触发时刻的调节通常不通过改PWM周期而是通过修改CCU6事件产生的位置或者在信号路径中增加延迟。TC3xx的GTM非常擅长做这件事如果你发现CCU6直接触发ADC的时间点不够灵活可以改用GTM的TIM/TOM模块产生输出和触发灵活性更大。基本思路是一样的先算好窗口再调位置最后验证波形。4. ADC采样值到真实电流的转换链路偏置、定标、滤波与重构4.1 零点偏置校准为什么不推荐简单取平均值电流采样通道里运放的输出通常有一个固定的直流偏置让零电流时ADC读数不是0而是处在中间值附近。这是为了兼容单电源运放。校准时很多人会在电机静止状态下采1000个点取平均然后把平均值作为零点偏置。这个方法在常温下没问题但它没有考虑温度漂移和运放失调随时间的缓慢变化。更可靠的做法是设计一种“在线校零”机制。比如在电机每次上电初始化阶段确保功率管全部关闭没有电流流过采样电阻此时采集的ADC值作为零偏。如果系统允许还可以在运行过程中寻找零电流矢量时刻进行校正比如FOC控制里零矢量持续期间理论上母线电流为零可以趁机更新偏置。在校零时要注意采样电阻本身的热电动势和PCB地平面电位差。尤其是大电流发热厉害时采样电阻两端会因为温差产生微小的热电动势导致零点出现缓慢漂移。这种漂移很难通过软件完全消除但至少可以做到每次上电重新校准并在环境温度变化较大时触发校正。4.2 定标计算与单位统一ADC原始值是一个整数码字要换算成实际电流必须建立完整的换算链。以低端采样为例电流流过采样电阻R_shunt产生电压V_sense I * R_shunt。电压经过运放放大G倍并叠加偏置V_offset送到ADC引脚。ADC测量量程是V_ref12位分辨率对应4096个码字。理论换算公式是I (adc_code * V_ref / 4096 - V_offset) / G / R_shunt实际代码里要避免每个控制周期都做浮点除法。最常见的做法是事先算好一个定标系数比如“每LSB对应多少安培”然后在控制中断里用乘法和加法完成转换。要注意V_ref的精度TC3xx EVADC可以用内部基准也可以外部基准内部基准有温漂高端电机控制对电流精度要求高时建议用外部精密基准或校准过的基准。另外单位一定要在项目开始就统一。有人用安培有人用毫安还有人直接把定标值放到IQ格式里。早期不统一后面调PID时会把人逼疯。我习惯在ADC读取函数里就返回以“毫安”为单位的整数电流值控制环里全部用Q15或者Q12格式避免浮点运算的不确定性。4.3 滤波方法的选择采样回来的电流一定带有噪声但电流环里不能随便加低通滤波。一个严重的误区是为了追求电流波形光滑在反馈路径上加入截止频率很低的低通滤波器结果电流环带宽被拖没负载突变时电流响应慢半拍。电流环反馈滤波应该以“去除开关噪声”为目标而不是把电流“变平滑”。对于开关频率附近的噪声更有效的手段是让采样时刻避开开关边沿并在硬件上做RC滤波。RC滤波的截止频率要远高于电流环带宽同时又要能抑制几百MHz的高频振铃。常见做法是在运放输出到ADC引脚之间串联几十欧姆电阻并联几百皮法电容构成一个截止频率在几MHz到几十MHz的低通滤波。这个滤波器不是用来滤开关纹波的而是用来滤振铃和采样电容电荷注入噪声的。软件上我倾向于在PWM周期里做多次采样然后取平均但前提是多次采样的时刻都在有效窗口内并且不增加控制延迟。如果用的是单次ADC转换在控制环外用一个滑动平均窗口处理低优先级监控变量是可以的但反馈到电流环内部的电流值应该尽量少做额外处理。4.4 双电阻/单电阻的相电流重构关键点相电流重构是很多项目的拦路虎。三电阻方案一般没什么难点同时采两相第三相取负和即可。双电阻方案需要根据PWM占空比判断哪些相的电流可以采某一相占空比太小时采样窗口不足需要做PWM移相。移相会导致实际输出电压和指令有偏差所以必须在软件补偿。单电阻方案更加复杂。它需要在一个PWM周期内采两次母线电流两个采样点分别对应两个不同的非零电压矢量然后通过坐标变换关系解算出三相电流。两个采样点的时间间隔不能太长否则电流变化导致重构误差。很多单电阻方案会设定一个最小采样窗口阈值当某个电压矢量的持续时间低于阈值时使用相电流预测或强制修改PWM占空比。重构时还有一个容易忽略的问题采样点处电流其实对应的是PWM周期内某一小段时间的瞬时电流而控制算法需要的是周期平均电流或特定时刻的电流。如果采样点靠近周期边缘电流纹波导致值和平均值偏差较大。规范的做法是在载波峰值附近采样并以这个值近似作为本周期电流。比较讲究的做法是考虑纹波斜率做补偿但多数应用里只要采样点稳定不需要额外补偿。5. 电流闭环控制功能的代码组织与调参顺序5.1 中断周期与控制延迟电流环的执行节奏最好和PWM周期严格一致。在TC3xx里我通常配置一个PWM同步中断中断标志来自CCU6周期匹配事件。中断服务程序里先读取ADC结果寄存器然后做定标和电流重构再进行PID计算最后更新CCU6比较寄存器以改变占空比。这里有一个关键问题ADC触发时刻和PWM中断时刻不能是同一个时刻。如果PWM中断在周期匹配点触发而ADC也在同一个事件触发那么中断里读到的ADC结果其实是上一个周期甚至更早时候采样的。因为ADC转换需要时间数据还没出来。所以通常要让ADC触发早于PWM中断一点或者PWM中断里等待ADC转换完成后读取。前者更高效后者会浪费CPU等待时间。控制延迟可以用下面这条链路估算采样电容充电时间 ADC转换时间 中断响应时间 PID计算时间 占空比更新到实际PWM输出的时间理想情况下电流环应该在ADC采样完成后立即执行并在下一个PWM周期开始前更新占空比。如果PID计算时间太长占空比更新会推迟到下一个周期多出整整一个PWM周期的纯延迟。这就是为什么电流环代码要精简不要在中断里做日志、打印、浮点三角函数这些操作。5.2 PID电流环的实现细节电流环PID比普通控制里的PID更简单也更需要小心。电流环反馈变化快微分项很容易引入噪声所以很多电机控制工程项目只用PI控制不加微分。PI调节器的离散方程可以写成增量式delta_u Kp * (e[k] - e[k-1]) Ki * T * e[k]u[k] u[k-1] delta_u增量式的优势是天然方便做输出限幅不会出现位置式PID里积分项累积导致的大幅超调。但它对Kp的符号很敏感如果电机相序或电流反馈方向接反闭环一瞬间就会正反馈。上电调试时应该先用手动开环方式验证PWM输出和电机转向的关系再闭合电流环。代码实现上建议把PI参数和当前状态封装成结构体多个轴或通道共用一份代码。参数用定点或浮点都可以TC3xx带FPU但如果你追求确定性Q15定点也能跑得很好。关键在于每个控制周期更新参数时注意各变量的物理单位要保持一致。下面是一个简化的电流环PI代码片段方向是“电压型”输出即输出为PWM占空比增量。typedef struct { float Kp; float Ki; float Ts; float integral; float last_error; float max_output; float min_output; } CurrentLoopPI; float current_pi_update(CurrentLoopPI *pi, float ref, float fb) { float err ref - fb; float delta_u pi-Kp * (err - pi-last_error) pi-Ki * pi-Ts * err; pi-last_error err; pi-integral delta_u; if (pi-integral pi-max_output) { pi-integral pi-max_output; } else if (pi-integral pi-min_output) { pi-integral pi-min_output; } return pi-integral; }注意这里的变量名“integral”并不严格是传统积分项而是增量式PI输出累积量。最终给到PWM模块的占空比应该是这个累积量映射到CCU6比较寄存器值的线性关系。5.3 限幅、积分饱和与异常保护电流环输出必须限幅否则PI控制器会输出远超PWM调节范围的值导致恢复时出现长时间饱和。限幅包含两层第一层是PI输出限幅第二层是实际占空比限幅。实际占空比通常不能到0%或100%要给死区留出裕量也要避免最小脉宽过小导致采样窗口不足。积分饱和是一个很隐蔽的问题。很多PI实现里只对输出限幅不处理积分项导致控制器在饱和状态下积分项持续增长等误差反向时积分项要花很长时间才能“消化”表现为电流阶跃响应出现较大的反向超调。解决办法有几种简单一点是输出饱和时停止积分累加这叫积分限幅更平滑一点是使用条件积分或积分分离误差超过一定范围时直接令积分增益为零。异常保护不能完全依赖软件。TC3xx的CCU6有硬件紧急停止机制可以通过故障引脚或外部比较器信号直接关闭PWM输出避免软件跑飞时桥臂直通烧功率管。在正式产品上这个功能必须做成硬件链路比较器检测过流输出给CCU6的TRAP输入然后PWM通道立即置为安全状态。软件过流保护作为第二道防线在判断到电流超过阈值后主动触发PWM关闭逻辑。5.4 初始调参顺序与波形判断电流环调参不要一上来就调Ki。先把Ki设为0Kp设为一个很小的值给一个固定电流指令观察电流响应。如果电流振荡说明Kp已经偏大或者采样反馈噪声过大如果电流响应太慢再逐步增大Kp。等Kp能让电流稳定跟踪指令时再缓慢增加Ki消除稳态误差。调参过程中不要只看电流平均值一定要看示波器或调试器里的实时波形。比如用DAC输出一个内部变量通过引脚引出到示波器可以很方便地观察电流实际波形和指令波形的关系。TC3xx上如果DAC资源不够也可以在空闲时间用UART把数据发出去但要注意串口输出会干扰控制时序建议把控制变量单独缓存在非控制周期内发送。一个常见的起步方式是PWM频率16kHz电流环频率16kHz给定一个方波电流指令频率在100Hz到200Hz观察上升沿的超调量。超调量控制在5%以内调节时间尽量短。如果发现超调很大但稳态正常多半是Kp太大如果稳态有误差那是Ki不足如果高频振荡优先检查采样点位置和ADC噪声而不是继续调参数。6. 实测调试中最常见的五个坑及排查链路6.1 采样点落在PWM边沿附近导致毛刺现象电流波形上出现固定重复的尖峰频率等于PWM频率或开关频率的倍数且每个周期内位置固定。用示波器同时看PWM的COUT引脚和ADC触发信号可以发现ADC触发位置恰好落在PWM边沿附近。为什么会有这个问题PWM寄存器比较值和实际功率管栅极驱动输出之间存在延迟。死区插入、栅极驱动芯片的传播延迟、功率管米勒平台的建立时间都会让实际开关动作比CCU6输出引脚变化晚一段时间。如果ADC触发时刻只盯着计数器的比较匹配点而没有把这段延迟算进去就容易刚好采在开关过渡过程。排查链路先在示波器上同时看三相PWM输出和下管栅极电压确定从CCU6引脚到功率管真正导通或关断的延迟范围。然后把ADC触发点往后移确保采样时刻落在功率管完全导通且电流建立稳定的区间。修改时一次移0.5us观察毛刺是否减少。找到合适位置后再验证全温度和全负载范围内的稳定性。6.2 ADC结果偏小且随温度漂移现象ADC读到的电流值明显小于用钳表测得的实际电流而且随着运行时间增加偏差越来越大。原因往往是两方面一是采样电容充电时间不足信号源内阻较大时采样电容在极短的采样窗口内没有完全充到输入电压。二是运放的工作点设计不合理运放输出范围接近电源轨时线性度变差导致大电流时增益压缩。排查方法用信号发生器和精密电阻给采样电路输入一个已知直流电压直接测ADC码值和理论值对比。如果发现码值偏低先增加ADC采样时间再看结果是否改善。同时测量运放输出电压和输入电流的关系确认在前大电流范围内是否保持线性。若温度漂移严重查看运放偏置电流和失调电压指标必要时换成精密运放或在软件里做温度补偿。6.3 电流环发散或震荡现象给了一个固定电流指令反馈电流大幅震荡甚至直接冲顶飞车。这是新手最容易慌的故障。最常见的因素是电流反馈符号错误。比如把UV两相互换了或者采样电阻电压方向接反导致闭环形成正反馈。排查时先在开环下给定一个占空比记录电机电流方向和电机转速方向然后和电流控制器输出做逻辑对比。还有一个因素是控制延迟过大PID计算跟不上PWM周期。可以在中断里加一个GPIO翻转用示波器测量中断耗时如果占空比更新发生在PWM周期结束之后必须想办法精简代码或调整触发顺序。另一个隐蔽因素是电流环参考给定方向没统一。速度环输出是电流给定如果速度和电流的正方向定义不一致看起来是电流震荡实际是速度环在激振。遇到这种情况先把速度环断开只用开环速度或直接给定电流指令确认电流环稳定后再接速度环。6.4 PWM故障保护误触发现象负载稍微一波动PWM就自动关闭故障标志置位重新使能后又能跑一阵。这种问题如果发生在现场会让人非常头疼。排查要从硬件保护阈值入手。比较器或ADC过流检测的阈值到底设了多少如果阈值和额定电流离得太近电机启动瞬间的大电流就会误触发。启动过程通常有较大的冲击电流要允许它在短时间内超过稳态额定值保护阈值应该结合电机堵转特性和散热设计不能简单等于额定电流。还要注意故障信号的处理方式。有些比较器输出在过流时是高电平有些是低电平配置错误会导致永远触发保护。TC3xx的CCU6 TRAP输入支持不同极性MCAL里也有对应配置。误触发时先在调试器里读CCU6状态寄存器确认是哪个TRAP通道触发的再看对应的硬件电路不要盲目改阈值。6.5 采样通道间的串扰现象两路电流采样波形看起来形状相似像是在互相跟随或者某一相的采样值受到另一路PWM边沿的干扰。仔细看时ADC输入引脚上的毛刺频率和相邻通道的开关频率一致。串扰通常是PCB布局导致的也可能来自EVADC内部通道间电荷共享。如果两路采样共用一个ADC内核的不同通道而且转换时间间隔很短前一个通道的采样电容残留电荷会影响到后一个通道。避免这一类问题最好给关键电流采样通道使用独立的ADC内核或者在模拟前端增加运放输出驱动能力减小信号源阻抗。PCB布局上采样信号线要远离PWM输出线和功率级走线并用地线隔离。电流采样信号属于毫伏级模拟信号旁边跑着几十伏、几十安的开关信号如果平行走线超过几厘米容性耦合就足以让ADC结果出现周期性尖刺。排查时可以用示波器探头直接点在运放输出引脚上比较和ADC引脚上的波形差异判断干扰是在PCB走线上耦合进来的还是在ADC模块内部产生的。7. 算是我自己的几条体会供你在项目里少走弯路如果上面这些内容只能记住一点我希望是那句“先同步再采样最后谈闭环”。很多项目做到一半发现电流环不稳回头找原因最后都落在采样点不对、触发没同步或者软件滤波破坏了相位这些基础问题上。PWM和ADC单独看都是成熟外设组合起来才是真正的系统设计。我在TC3xx平台上做电机驱动的时间不算短有一个体会越来越深芯片外设的功能开关写在寄存器里只是一瞬间的事真正花时间的永远是时间参数的取舍。比如死区给多少、采样窗口卡多紧、采样点放在中心还是边缘、PI的Kp能从多大起步这些值必须结合实际功率级电路去调。不要把别人的参数表直接抄过来因为栅极驱动电阻不同、功率管不同、电机不同最优采样点和死区就是不一样。调试手段上我强烈建议早期的固件里多留几个调试点。用DAC输出PID内部变量也好用示波器观察PWM同步信号和ADC触发信号也好都比只看一个电流寄存器值要直观得多。控制类项目最怕“黑盒调参”波形对了就有方向波形不对至少知道是哪一段链路出了问题。最后分享一个小技巧每次改完和采样窗口相关的参数不要只在示波器上看电流还要看PWM通道的实际波形。很多时候你以为采样点在安全区实际上因为死区、栅极驱动延迟和PCB寄生参数的影响真正表现出来的开关边沿已经被挪了好几微秒。把示波器两个通道接成“PWM引脚和ADC触发信号”把两者对齐到同一个时间轴再微调触发时刻你会少走很多弯路。
返回列表