做FOC电机驱动这些年,我养成了一个习惯:项目归档时直接用日期命名,比如26.9.27,后面跟一句当天要解决的问题。这次文件夹里写的是“改FOC板,问NTC”。起因是一块改版后的FOC驱动板,电机转得挺好,电流环速度环都正常,唯独板上那颗NTC温度采样让我在调试台前耗了一个多小时——室温下读数乱跳,偶尔直接冲破过温保护阈值,把驱动器整个锁死。后来把分压电阻的供电从某路DCDC输出挪到基准源上,问题当场消失。
这种问题在改FOC板时特别典型。NTC看起来只是一颗电阻,实际牵一发动全身:它既要给过温保护、降额输出提供依据,又会间接影响FOC算法对电机参数的判断。如果你也正在做驱动板,或者准备在现有板子上动温度采集电路,这篇就把改FOC板时NTC相关的选型、计算、布局、软件处理、校准排错一次讲清楚,省得你走我这一小时的弯路。
1. 改板之前先想清楚:这颗NTC在FOC板上到底要干几份活
很多人提到NTC,第一反应就是“测温度,过热保护”。这话没错,但在FOC板上,NTC的作用其实可以拆成两条线来看,而且这两条线对传感器选型、安装位置、精度要求的影响完全不同。
1.1 第一身份:散热保护,过温之前先降额
这是NTC最本职的工作。功率板上一般会把NTC贴在散热器上,或者靠近MOS管、二极管等发热器件,持续监测功率级温度。一旦温度超过设定阈值,控制器先降额输出电流,再往上就彻底关断,防止器件结温超限。
在这个身份下,NTC的安装位置比精度更重要。你真正想保护的是MOS管的结温,但NTC能测到的是散热器某个点的温度,两者之间隔着封装热阻、导热硅脂、散热器本身的温度梯度。所以工程上更常见的做法不是追求NTC读数多精确,而是留足裕量:比如结温允许到150℃,散热器上的NTC保护点设置在105℃就停机,95℃就开始降额。
1.2 第二身份:FOC算法的参数补偿探头,很多人忽略
这个身份才是“改FOC板”时真正要小心的点。FOC的核心是转子磁场定向控制,电流环PI参数、磁链观测器、弱磁控制都依赖电机模型参数,其中定子电阻Rs受温度影响很大。铜绕组的电阻温度系数大约是0.0039/℃,意思是绕组温度从25℃升到105℃,电阻增加约31%。如果控制器里的Rs参数还是按冷机状态标定的,热机之后低速重载工况下电流环表现就会变差,启动抖动、转矩不准这类问题随之而来。
这时候NTC测到的温度数据就可以用来在线修正Rs:Rs(T) = Rs_25 × (1 + 0.0039 × (T - 25))。公式本身很简单,难点在于“用哪个温度”。散热器上的NTC读数是散热器温度,不是绕组温度,直接拿它修Rs会有明显滞后。更合理的做法是搭配热模型估算绕组温度,这个第五章展开细说。
1.3 身份定了,再决定选型方向
做保护用,选中等B值、常规精度、封装灵活、贴近热源安装的NTC就够了,成本优先。想做参数补偿,就得关注R25精度和B值一致性,最好挑1%精度、B值离散度小的料,甚至每批料都做一次标定。同一块板上如果只放一颗NTC,通常优先满足保护需求,补偿算法往后放;如果空间允许,我会放两颗,一颗测散热器,一颗测环境温度,做热模型估算用。
这块想清楚之后,再去算分压电阻、布板、写软件,思路就顺了。
2. 分压电阻与B值选型:一套能够直接套用的计算流程
NTC本身是负温度系数电阻,温度升高、阻值下降,非线性很强。MCU的ADC读不了电阻,只能读电压,所以必须用一个固定电阻和NTC组成分压网络,把阻值变化转成电压变化。工程上常见配置是:参考电压Vref经过固定电阻RF接到采样节点,再经过NTC接地;或者反过来,NTC在上、固定电阻在下。选型计算其实就三步。
2.1 先背熟这个基础公式
NTC的阻值-温度关系一般用B值公式近似:
R(T) = R25 × exp(B × (1 / (T + 273.15) - 1 / 298.15))
其中T是摄氏温度,R25是25℃时的标称阻值,B是材料常数,常见规格有3435K、3950K、4380K。B值越大,曲线越陡,同等温度变化下阻值变化越大,灵敏度越高。
2.2 三步确定分压参数
第一步,明确测量范围。比如目标范围-10℃到125℃,这是大多数驱动板的散热温度范围。第二步,选R25和B值。通用户外、控制器场景,10kΩ@25℃、B=3435是性价比很高的选择,货源多、一致性也好。第三步,选固定分压电阻。我一般先取RF和R25同值,也就是10k,这样在25℃附近输出电压恰好是Vref的一半,ADC量程利用最充分。
以Vref=3.3V、RF=10k、NTC=10k@25℃、B=3435为例,几个关键温度点算出来是这样:
| 温度 | NTC阻值 | 采样节点电压 |
|---|---|---|
| -10℃ | 约46kΩ | 约2.70V |
| 0℃ | 约28.7kΩ | 约2.45V |
| 25℃ | 10kΩ | 1.65V |
| 50℃ | 约4.1kΩ | 约0.96V |
| 100℃ | 约0.99kΩ | 约0.30V |
如果MCU是12位ADC,参考电压3.3V,每个LSB约0.806mV。折算下来低温段分辨率非常好,25℃附近大约0.03℃/LSB,100℃附近也不差。整个量程没有明显浪费。
2.3 分压位置与断线方向:这里决定了失效是否安全
分压网络有两种接法,看起来只是上下颠倒,实际对失效保护的影响完全不同。
接法A:固定电阻接Vref,NTC在下接地。温度升高时NTC阻值变小,采样节点电压下降。如果NTC开路,节点电压会被固定电阻拉高到接近Vref,对应到温度曲线是“低温”方向;如果NTC短路,节点电压跌到0V,对应“高温”方向,触发保护。
接法B:NTC在上接Vref,固定电阻在下接地。温度升高时NTC阻值变小,分压结果让采样节点电压升高。此时NTC开路,节点电压被下拉到接近0V,对应“低温”方向,这是偏危险的方向;NTC短路则会读到接近Vref,对应“高温”方向。
无论哪种接法,都存在一种断线状态下读数偏向低温的隐患。所以我在软件里从不依赖单一侧极限值判断故障,而是常规读值限定一个有效区间,比如0.05V到3.25V之外直接判传感器故障,进入保护逻辑。这样不管哪种接法都能兜住。
2.4 自热与分压电阻取值平衡
NTC工作时会有电流流过自身,产生自热。一般要求自热引起的温升控制在0.1℃以内。计算很简单:P = V² / R。用上面的10k/10k分压,25℃时NTC两端电压约1.65V,功耗约0.27mW,NTC耗散常数通常2mW/℃左右,自热约0.14℃,完全可接受。
但如果为了降低功耗选100k+100k配置,自热确实更低,代价是采样回路阻抗高,ADC采样保持电容充电时间变长,容易读数跳动,要么加长采样时间,要么加一级运放缓冲。我的建议是,常规FOC板用10k级别分压最省心,除非走线特别长、噪声特别大,再考虑上缓冲器。
3. 硬件改板时NTC最容易踩的四个坑
改板子和新设计最大的区别是:板子上已经有一堆大电流环路、开关节点、散热结构,NTC采样电路是后加进去的“小信号电路”,在功率级面前非常脆弱。以下四个坑我基本都踩过,写出来供你排查时对照。
3.1 采样走线贴着三相开关节点走
FOC板的U、V、W相输出是高频开关节点,电压跳变速度非常快,dv/dt动辄每秒几伏到几十伏。NTC采样线如果和这些相线平行走了一段,寄生电容会把开关毛刺耦合到采样信号上。现象很典型:用万用表量节点电压是干净的直流,示波器一看全是尖刺,ADC读数在几个固定值之间反复横跳。
解法是采样线尽量短,做包地处理,并且和相线拉开距离。如果结构上避不开,就在采样节点加RC滤波。RC的时间常数要控制好,不能为了滤波把采样响应拖慢。比如先用4.7kΩ串联电阻加100nF电容,时间常数约0.47ms,对秒级变化的温度来说响应足够快,对几十纳秒的开关尖刺压制也很明显。
3.2 分压固定电阻贴着热源放
这是我遇到过的非常隐蔽的坑。NTC本身测得好好的,但分压网络里那颗固定电阻正好放在高压放电电阻旁边。热量通过PCB铜皮传导过来,固定电阻阻值随温度漂移,采样节点电压跟着漂,读数整体偏高十几度。最坑的是它不是恒定偏差,负载起来之后才漂,负载一停又慢慢恢复,看起来很像是NTC响应慢。
固定电阻即便用常规厚膜电阻也有温漂,100ppm/℃的电阻在100℃温升下就是1%阻值变化,反映到采样结果可能就是好几度误差。处理办法很直接:分压电阻尽量远离热源,要么用低温漂电阻,要么至少把两颗分压电阻对称放置,让它们的温漂方向一致,对分压比的影响相互抵消一部分。
3.3 采样地线处理得过随意
ADC采样参考地这个问题,新手特别容易忽略。NTC分压网络看起来简单,好像随便找个GND过孔就行,但在FOC板上,功率地回路有大电流流过,地弹噪声不小。如果采样地上有几十毫伏的噪声,ADC读数波动几个LSB很正常。
我的做法是:NTC分压支路的地单独引回MCU的模拟地,和功率地在一点单点汇合,不要在采样支路中间串入功率地电流。如果板子实在紧凑,至少确保NTC分压网络附近的高速开关地回路不要和采样支路共享同一条细过孔路径。
3.4 滤波电容和采样时间不匹配
有同事在NTC节点上放了一个10uF的大电容,以为越大越稳,结果软件里ADC采样时间还是按短配置走,每次采样电容还没充满就开始转换,读数反而飘得更厉害。ADC采样保持电容充电需要时间,输入回路阻抗越高、外部并联电容越大,需要的采样时间就越长。
一般建议外部滤波电容用100nF左右,采样时间按MCU手册最大档来设,或者干脆用运放缓冲后再进ADC。如果既想滤波又想响应快,可以在硬件滤掉高频尖刺,细节部分交给软件做数字滤波,后面第四章会讲。
3.5 安装工艺影响:导热和绝缘的平衡
NTC贴在散热器上时,导热硅脂要涂得均匀,紧固力度要一致。不同螺丝扭矩会导致接触热阻差异,实测温度能差好几度。更关键的是电气绝缘,NTC焊盘和散热器之间必须做好绝缘处理,否则高压侧击穿直接窜到采样回路,板子就不是温度不准的问题了。
4. 软件端从ADC读数到温度的完整处理链路
硬件改完,软件这边的链路也很长。ADC配置、转换算法、滤波策略、保护逻辑、断线识别,一步做不好前面硬件全白搭。
4.1 ADC配置里的两个细节
第一个是参考电压。我在前面案例里踩的坑就是NTC分压网络用了某路DCDC直接输出的3.3V,而ADC参考用的是另一个基准源。DCDC输出随负载波动,采样节点电压跟着波动,ADC读数自然乱跳。正确的做法是分压网络的Vref和ADC参考共用一个源头,或者都用同一个低噪声基准源,这样DCDC波动在分压比和ADC转换里被同步抵消。
第二个是采样时间。NTC分压网络输出阻抗至少是几kΩ到几十kΩ,如果用了100k级别的分压,输出阻抗更高。ADC采样保持电容从外部源充电,采样时间不够就会充不满。我会把NTC通道的采样时间配成芯片支持的最大值,同时配合100nF外部电容,实测非常稳。
4.2 从ADC码到温度:查表法比公式法好用
拿到ADC值之后,先反推采样节点电压,然后直接把温度表建在ADC码域上。更稳妥的做法是先把电压反推成NTC电阻:
R_ntc = RF × (Vref / Vout - 1)
然后用电阻查温度表。这样做的优势是:查表不依赖数学库,不用调用log函数,执行时间固定,对MCU实时性更友好。
温度表按每5℃一档建,比如从-20℃到150℃共35个点,用线性插值,精度完全够。如果你不想自己算表,可以在PC上按B值公式生成数组,再烧到板子里。后续如果发现某颗料实际偏差点大,直接把整个表用实测标定值替换就行,不用改代码结构。
4.3 滤波策略:显示用慢滤波,保护用快通道
温度是慢变量,适当滤波很合理,但要注意别把过温保护也滤波滤迟钝了。我一般做两路处理:一路是给显示、上位机、温度补偿算法用的平滑值,用一阶低通,滤波系数取0.1~0.2,采样周期100ms左右,显示曲线很顺滑;另一路是给过温保护用的原始值加窗口比较,不沉淀滤波,每20ms判一次,温度一旦超过阈值立刻动作。
原因很简单,一阶低通本身有滞后,如果滤波系数太小,真实温度已经冲到临界点了,软件还在慢慢爬升,保护动作会晚几百毫秒。功率器件的热容很小,这几百毫秒可能就是过温损坏和正常停机之间的差别。
4.4 分级保护策略
有了可靠的温度读数之后,保护逻辑不建议一把梭。我常用的三档设计是:预警、降额、停机。
预警温度,比如80℃,只上报状态,不干预控制;降额温度,比如95℃,电流指令线性减小,随着温度升高、允许电流上限逐步压低,让系统自己退回安全工况;停机温度,比如105℃,直接关断PWM并锁存故障,必须断电或收到明确复位指令才恢复。
降额曲线我习惯用最简单线性公式:I_max = I_rated × (T_stop - T) / (T_stop - T_derate)。参数按实际散热条件标定,别照抄别家数值,散热器尺寸、风道、热容都不一样。
4.5 断线和传感器短路识别
前面硬件章节讲过,单一极限值不能可靠识别断线。软件里我加了一个有效区间判断:ADC读数小于满量程的2%或者大于98%,直接进入传感器故障状态。这个状态和过温是分开的代码,上报到上位机时能明确区分。故障状态下的默认策略是保守的,按电机参数不复用温度补偿处理,同时把电流限制到安全值,避免传感器失效时系统毫无防备地继续跑。
5. 用NTC补偿定子电阻:温度数据不止用来保护
到了这一节,才算是真正回答标题里“改FOC板”这部分。如果NTC数据只是用来过温保护,那它在算法层面几乎没有存在感。但如果你把温度数据接进FOC的参数修正链路,价值立刻不一样。
5.1 为什么FOC需要在线修正Rs
FOC电流环调节的是定子电流,控制器输出的电压指令里包含电阻压降项。在低速重载工况下,定子电阻压降占输出电压的比例很高,Rs不准直接影响电流环解耦和电压前馈。而铜绕组电阻温度系数约0.0039/℃,温差30℃就有12%的电阻变化,这对闭环参数来说不是小数字。如果冷机时电流环调得很顺,热机后同样的PI参数可能出现振荡或者响应变钝,就是因为Rs参数已经偏离实际值。
5.2 一个实用的估算热模型
直接把散热器NTC的温度当作绕组温度来修Rs是不准确的,因为绕组到散热器之间还有热阻,大电流时绕组温度可能比散热器高不少。我用的办法是一个简化热模型:
T_winding ≈ T_ntc + I_eff² × Rs × R_th_w
其中I_eff是有效值电流,Rs是当前估计的定子电阻,R_th_w是绕组到NTC测点的等效热阻,这个值可以实测标定:让电机带固定负载跑到热平衡,对比内埋温度传感器和NTC的差值,反推出R_th_w。
软件实现时,每个控制周期用I_eff做低通,再累加估算温升。这个模型不需要精确的热容参数,因为电机热时间常数通常几十秒到几分钟,控制周期一两百微秒,做二阶低通完全够用。
5.3 I²t保护可以做得更精细
有了绕组温度估算之后,过载保护可以升级成I²t模式。I²t等于电流平方对时间的积分,本质是电机铜损的热累积。举个例子,额定电流10A跑半小时温升到80℃,那15A的电流跑同样温升,时间就短很多,I²t可以粗略跟踪这个趋势。当绕组温度估算值接近阈值时,不是立即停机,而是按百分比限制电流指令,让系统贴着安全边界运行,既不憋死负载,也不烧电机。
5.4 注意边界:散热器NTC替代不了内埋传感器
这个补偿方案有它的适用范围。散热器NTC测的是热源下游的温度,任何热模型都只是间接估算,精度受到散热条件、风道变化、老化等因素影响。要求高的时候,还是要靠电机内部预埋的NTC或者后端在线参数辨识。我的经验是,用散热器NTC+热模型做出来的Rs修正精度足够支撑大多数驱动应用,但不要指望它能做到精密伺服那种程度。
6. 校准与排错复盘:读数和实际温度之间差多少
NTC标称值是一回事,实际到手又是另一回事。B值离散度、R25精度、ADC偏置都会让读数和真实温度有偏差。一块改完的板子,温度链路最好做一次完整校准。
6.1 低成本两点校准法
工程上我一般做两点校准。一个点是冰水混合物,0℃很稳定;另一个点是沸水,100℃,但是海拔不同沸点会变,可以用一个精度稍好的温度计实际测一下。把NTC探头放进水浴,注意别碰杯壁,等读数稳定后记录ADC值和反推的电阻值。
有了两个温度点的实测电阻R1、R2,就能反推实际的B值:
B_actual = ln(R1 / R2) / (1 / (T1 + 273.15) - 1 / (T2 + 273.15))
把标称B值替换成实测B值,重新生成查表数据,误差可以压缩到1℃以内。如果还想更精细,做三点校准后套Steinhart-Hart方程,不过对大多数FOC驱动板来说两点足够。
6.2 常见误差来源对照表
| 误差源 | 典型幅度 | 处理方式 |
|---|---|---|
| B值离散 | 25~100℃可能差2~4℃ | 实测标定替换B值 |
| R25精度 | ±1%约2.5℃偏差 | 选1%精度料或软件基点校准 |
| 分压电阻温漂 | 见热串扰坑 | 低温漂电阻、远离热源 |
| 接触热阻 | 视绝缘与导热工艺 | 规范涂导热硅脂和紧固 |
| ADC偏置误差 | 数个LSB | 采样前校准,软件减偏置 |
| NTC自热 | 一般小于0.5℃ | 控制电流在0.5mA以下 |
6.3 典型故障信号快速诊断
| 故障现象 | 可能原因 |
|---|---|
| 读数随机跳变 | 走线干扰、采样时间不足、参考电压纹波 |
| 读数整体偏高,随负载漂移 | 分压电阻热串扰、软件滤波滞后 |
| 读数卡满量程附近 | NTC开路、虚焊、接线断开 |
| 读数卡接近0V | NTC短路、焊桥、接错分压方向 |
| 读数刷新极慢 | 外部滤波电容过大、软件滤波过重 |
如果板子出问题,我习惯先把传感器从板子上拆下来,用万用表测室温下的阻值,判断NTC本身好没好。接着量分压节点电压,然后示波器看ADC引脚波形,最后再查参考电源。按这个顺序走,绝大多数问题十分钟以内能定位。
6.4 一个小经验:焊盘上预留断线测试位
改板时我会在NTC分压节点附近留一个0201封装的电阻位,平时不贴,怀疑断线时焊一个短接电阻上去,就能快速区分是NTC本体断线还是线路断裂。这个小改动成本几乎为零,排错时非常省事。
改FOC板问NTC这件事,表面上是问一颗电阻怎么选怎么算,本质上是在问:温度数据在整个驱动系统里到底要承担多少责任。它既要保护硬件不烧,又要参与电机参数修正,还要保证失效时系统能安全退出。把这几点理透了,再回头看选型、布局、软件,你会有一种“原来如此”的通透感。
我每次改完板子,都会先做一遍温度链路自检:恒温源校准、断线测试、满载温升标定。这套流程走完,NTC相关的坑基本就提前踩完了。希望这篇能帮你少走点弯路。