news 2026/10/18 1:04:11

FOC驱动板NTC测温改造:从选型到软件保护完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FOC驱动板NTC测温改造:从选型到软件保护完整指南

先说结论:这次改板,核心就两个动作——给FOC驱动板补上温度采样链路,然后把NTC读数接进控制逻辑里。FOC板本身不算复杂,难就难在NTC那颗小元件从选型、摆放到软件读数,每一步都有坑。这篇记录我把整个过程中踩过的、见过的、想明白的问题都写出来,给同样在折腾无刷电机驱动板的朋友一个参考。

开头先解释一下标题里的“26.9.27”,这是我项目记录本上的一个日期编号,也就是9月27号那天做的改造。当时手里有一套六轴机械臂的驱动板,用的无刷电机,FOC控制跑得挺稳,但板子上的MOS管在长时间高负载下烫得厉害,原板只做了过流保护,没有过温保护。所以当天就干了一件事:改FOC板,加NTC测温。整个过程从硬件改到软件调,花了差不多一天,最后把温度信号真正接进了FOC的控制环里。

这篇内容适合正在做无刷驱动板、ESC、FOC控制器,或者想在自制电机驱动板上加温度保护的朋友。哪怕你还没接触过FOC,只要搞过单片机ADC采样,也能从里面找到可对号入座的电路和排查思路。

1. 改造FOC板,为什么偏偏要用NTC测温

1.1 FOC板热管理的几个真实痛点

FOC板不是普通直流电机驱动板,MOS管处于高频开关状态,每一路桥臂都在不断导通、关断,开关损耗和导通损耗叠加在一起,热量非常集中。如果散热做不好,MOS管结温会一路飙升,性能下降还是小事,严重的时候直接炸管。

我见过不少板子,电流环调得挺好,转速稳、噪声低,但一堵转或者高负载跑几分钟,MOS管就热到烫手。很多人以为电流保护能兜底,但实际堵转工况下,电流往往没有超过设定阈值,温度却已经超过MOS的极限。这个时候就需要一个独立的过温保护机制,而保护策略的输入信号就是NTC测到的温度。

另一个痛点是在FOC算法里,温度不只是用来报警,它还能参与降额控制。比如温度升高到某个点后,主动限制Iq电流指令值,让功率降下来,等温度回落再恢复。这种做法在机器人关节、电动工具这种负载波动大的场景里特别有用,比单纯断电停机实用得多。

1.2 对比几种测温方案,为什么NTC胜出

温度检测方案其实不少,我简单对比过热电偶、数字温度传感器、红外测温、NTC热敏电阻这几种。

热电偶测温范围大、响应快,但需要冷端补偿和放大调理电路,对FOC板来说体积和成本都太高。数字温度传感器接线简单,读数直接,但一般插件或较大封装居多,板子空间紧的时候不好摆,而且采样速率普遍不高。红外测温不用接触,但探头贵、安装位置受限,小型驱动板根本塞不下。

剩下就是NTC。它的优势非常明显:贴片封装,0603就能用,直接贴在MOS管旁边或者散热铜箔上,热耦合好;响应速度够用,价格便宜,几毛钱一颗;电路就一个分压电阻加一个电容,不增加复杂度和成本。缺点是非线性,需要用查表或公式换算。但在FOC板这种几十度到一百多度的场景里,这个缺点完全可以通过软件处理掉。

所以NTC是兼顾成本、体积、性能和可靠性的最优选择。改造FOC板测温度,用它既是偷懒,也是务实。

2. 改板前的器件选型与布局思考

2.1 先搞懂NTC的三个关键参数

选NTC之前,至少要把三个参数看明白:R25、B值、封装功耗。

R25就是NTC在25摄氏度时的标称阻值。最常见的规格是10kΩ,也就是R25=10k。B值是热敏指数,反映电阻随温度变化的快慢,常见的有3435K、3950K、3380K。B值越大,同样温度变化对应的阻值变化越明显,但非线性也更严重。第三是封装,FOC板上一般用0603或0805,封装越大,能承受的功耗越高,但在被测对象上引起的“热阻”也越大,影响测温速度。

我的选择很简单:R25=10k,B值3435左右,0603封装。原因后面讲电路会体现——10k与10k上拉电阻分压,在25℃时中点电压正好是电源电压的一半,ADC读数落在量程中间,既能留出低温段的余量,又能覆盖到150℃以上的高温区,不用频繁改增益。

2.2 探测点放哪,直接决定保护有没有用

NTC装得不对,后面软件写得再好也白搭。热保护保护的对象是MOS管,所以探测点必须贴近热源,而不是随便找个位置测“板温”。

我这次改的板上,MOS管集中在散热铜箔区域,铜箔与PCB走线连接。最可靠的装法是让NTC紧贴MOS管本体侧面,或者焊在靠近MOS漏极引脚的大面积铜箔上。注意不要让NTC悬空在PCB上方,中间留一条长引脚,那样热传导路径太长,测到的温度会比实际MOS温度低不少,保护动作就滞后了。

还有一个容易忽略的点:如果NTC是装在散热器上,中间要垫绝缘导热垫。散热器往往与MOS管漏极相连,电压可能是母线电压,直接让NTC外壳碰上散热器,轻则读数干扰,重则把ADC通道甚至单片机电掉。垫一层绝缘导热垫,既保证热传导又保证电气隔离。

如果板面上没有靠近MOS的合适位置,也可以把NTC用导热胶贴到MOS封装顶部,再用飞线引出。我当时就是这样处理的,后面实操部分会具体讲。

2.3 原板没有预留焊位怎么办:飞线思路

很多驱动板出厂时不带NTC,板上也没有对应的焊盘。这时候不要急着否定方案,先做两件事:看原理图里有没有预留的ADC通道,看板子上有没有空的0603焊盘。

我之前改的板子,原理图里其实留了一个“可选温度采样”的标注,但PCB上只给了两个裸焊盘,没位号没丝印。用万用表量了一下,一个接3.3V,一个接MCU的ADC引脚,这就好办多了,直接把NTC焊上去就行。

没有预留位的话就走飞线。飞线要注意几点:NTC信号线尽量短,不要贴着MOS桥臂的PWM输出线走,也别跟电感挨太近;如果线长超过10cm,可以考虑用双绞线或者屏蔽线,屏蔽层单端接地;手头没有屏蔽线就尽量把线绞起来,减小环路面积,降低差模干扰。

别小看飞线,我之前见过有人把NTC信号线从MOS管上面跨过去,结果PWM一开,ADC读数直接跳几十个数,以为软件滤波不行,其实全是耦合噪声灌进来的。

3. NTC采样电路设计:分压、滤波与ADC输入阻抗

3.1 最简单的分压电路,藏着两个工程细节

NTC测温的本质是“电阻随温度变化”。要让单片机读到这个变化,得先把电阻变化变成电压变化,这就是分压电路的作用。

我用的电路很标准:3.3V接一颗10k上拉电阻,电阻另一端接NTC的一端,NTC的另一端接GND,上拉电阻与NTC的连接点引到ADC引脚。这样当NTC阻值随温度变化时,中点电压跟着变化,单片机读ADC就能换算温度。

这个接法里有个细节值得展开。NTC我放在低侧,也就是NTC一端接GND。为什么不用高侧?假设NTC焊接开路,低侧接法会让ADC读到电源电压,容易判断为“温度极低”甚至满量程,至少你能知道链路出了问题;反过来如果NTC短路,ADC读到0V,也能识别出来。如果NTC放高侧,开路和短路产生的故障信号反而不直观,排查起来费劲。

另一个细节是上拉电阻阻值。固定3.3V供电时,上拉越大,流过NTC的电流越小,自热效应越轻微;但上拉太大,分压输出阻抗就大,对ADC采样会有影响。10k是比较折中的值,配合R25=10k,25℃时输出阻抗约5k,大多数单片机的ADC源阻抗要求都能接受。

3.2 采样信号链路里的噪声处理

FOC板上最不缺的就是噪声。MOS栅极驱动、相线电流采样、开关电源,各种干扰源都在抢信号,NTC这条链路如果不做处理,读出来的温度会像心电图。

常规做法是RC低通滤波。我在ADC引脚前加了一颗1k串联电阻和一颗100nF对地电容,构成一阶低通,截止频率约1.6kHz。温度信号本身变化很慢,这个截止频率完全够用,但对PWM开关频率处的噪声能压掉一大截。

注意电容不能随便加。100nF容值不算大,但如果串联电阻和电容组合不当,会让输出阻抗变得很高。ADC采样瞬间,保持电容需要从源端充电,如果源阻抗太高,采样时间内充不满电,读数就会有固定偏差。这就是为什么软件里要把NTC通道的采样时间拉长,而不是所有通道都共用默认配置。

还有一点,NTC信号线的地要单独走,别跟MOS管电流采样地混在一起。功率地有大电流流过,噪声非常大,模拟信号地如果跟它捆在一起,滤波电容再好也压不住。理想做法是模拟地单点接回主电源地。

3.3 不同电压系统下的参数换算

分压电路的输出电压可以算得很明白。假设NTC阻值为Rntc,上拉电阻为Rpull,电源为Vref,低侧NTC接法下:

Vadc = Vref × Rntc / (Rpull + Rntc)

当Rntc=Rpull=10k时,Vadc=Vref/2。以3.3V系统为例,25℃时ADC输入约1.65V。温度升高,NTC阻值下降,Vadc下降;温度降低,NTC阻值上升,Vadc上升。

如果板子是5V系统,而MCU ADC是3.3V供电,就不能直接用5V分压。要么把上拉接到3.3V,要么用电阻分压把电压搬到合适范围。我建议把NTC采样链路独立供电到与ADC参考一致的电平,避免量程浪费。

给个实际换算例子:设R25=10k,B=3435,在100℃时NTC阻值大约1kΩ左右。代入公式,3.3V供电下Vadc≈0.3V,ADC如果是12位,读数约372(按4096满量程)。低温端0℃时NTC阻值约33kΩ,Vadc≈2.55V,ADC读数约3165。这个动态范围完全够用,分辨力足够区分1℃的变化。

4. 软件侧读数与标定:别指望一条公式走天下

4.1 ADC采样配置:慢就是快的秘密

接好硬件,打开工程,以为读个ADC就完事,这种想法最容易翻车。NTC通道的ADC配置有讲究。

因为RC滤波把源阻抗抬高了不少,ADC采样时间必须加长。很多单片机的ADC采样时间是可以配的,从几个周期到几百个周期不等。默认配置通常偏短,适合源阻抗较低的信号;接NTC这种高阻信号,如果采样时间太短,保持电容充不满,读数会偏低,而且这种偏差很难用软件滤波消除,因为它是系统性的。

我把NTC通道的采样时间配成最慢档。以常见的12位ADC为例,采样周期选最长的那个档位,不是所有通道均匀分配,而是单独给NTC通道配置。这么做会拖慢一点转换周期,但温度链路完全不需要高速,多花一点转换时间完全无所谓。

采样模式上,我保留了连续扫描,但会在DMA中断里对NTC通道做移动平均。为什么不直接按单次转换读数?因为PWM开关噪声虽然被RC滤得差不多,但总会有残余毛刺,偶尔一次转换结果可能偏差很大。移动平均窗口取50到100毫秒,温度变化本身就慢,这个窗口不会让响应迟钝。

4.2 温度计算:B值公式和查表法怎么选

得到稳定的ADC读数后,下一步是换算温度。理论上可以用B值公式:

Rntc = Rpull × Vadc / (Vref - Vadc)

然后根据NTC特性:

温度T = 1 / (1/T0 + (1/B) × ln(Rntc/R25)) - 273.15

其中T0=298.15K,R25=10k。这个公式在单片机里用math库的log函数,能算,但每次调用log会吃不少CPU时间,在实时控制里不划算。

工程上常用查表法。把ADC值0到4095按步长映射成温度,生成一张表,运行时二分查找甚至直接索引。表怎么生成?可以在PC上用脚本算出任意ADC值对应的温度,或者每隔1℃采样一组数据直接固化。

我实际用的是分段线性查表,每5℃存一个温度点对应的ADC值,中间用线性插值。误差在±1℃以内,对过温保护来说足够。表占的内存也很少,几十个字节就够。

注意标定问题。同一批NTC,R25和B值都有离散性,直接套数据手册值往往会差好几度。最有效的办法是至少做一次室温标定:在板子通电且温度稳定到室温时,读一次ADC,以实际室温为基准修正R25。要求高一点的话,可以再在恒温箱或者油浴里做高温点标定,修正B值。对大多数驱动板来说,室温单点标定已经够用。

4.3 用温度做FOC保护,阈值和滞环这么设

读数准了,要真正起作用,得把温度用进控制逻辑。直接的做法是在温度超过上限后关断PWM,但这样太粗暴,正常工作中会造成突然停机,机械惯性冲击不小。

我采用分级保护:第一级温度到80℃时只记录状态,算预警;第二级到100℃时开始限制Iq电流指令值,电流环目标值按比例削减;第三级到120℃时直接关断PWM输出,并置故障标志位。阈值不是拍脑袋定的,得查所用MOS管的结温上限,留出20%的余量再结合散热条件调整。

还有一个关键参数是滞回。温度到120℃关断后,如果等温度降到100℃再恢复,能避免在临界点反复开关。如果只有单阈值,系统会在高温点附近频繁重启,对MOS和电机都是折磨。我给停机温度设置了10℃左右的滞回,恢复温度设在110℃,两档之间的“降额-恢复”也做了同样的滞回。

软件实现上,温度采样放在慢速任务里,比如每100ms读一次,但读取结果会在FOC中断里被查用。不要在PWM高频中断里做ADC和数学运算,免得挤占控制周期。中断里只做一个判断:当前温度是否超过阈值,是就对Iq限幅,否则放行。

5. 实操过程记录:从飞线到实测数据

5.1 改造现场:从找预留焊盘到焊好NTC

我那天拿到的板子是一块双面PCB,逆变部分用了六颗MOS管,三相桥臂。先用放大镜扫了一遍MOS管附近,没看到NTC的丝印,但发现有两个疑似空焊盘,就在MOS管排列区域旁边。拿出万用表量了一下,果然一端是3.3V,另一端拉向MCU引脚。这板子原设计里应该预留过温度检测,只是量产配置没焊。

确认焊盘用途后,我把一颗0603封装的10k NTC焊上去。焊接时要注意温度和时间,NTC是半导体陶瓷材料,长时间高温会导致阻值漂移。用烙铁低温快焊,避免在器件上反复加热。

电源端我检查了一下,3.3V焊盘的电压很稳,不需要额外外接上拉电阻——板上的分压电阻已经在预留设计里做了。如果自己从零画板,一定要把上拉电阻放在NTC附近,不要让NTC信号线长距离走线后再接上拉,那样长走线会接收噪声。

为了让NTC更贴近发热源,我还做了一步加固:在NTC背面涂了一点导热硅脂,让它贴住旁边MOS管的散热铜箔,再用低粘性的贴片胶带固定,等胶干了再通电。这一步看着随意,实际对测温响应速度影响很明显,贴合前用手摸MOS管要过好几秒NTC读数才开始动,贴合后基本一两秒内就有反应。

5.2 上电读数与实测对比

改造完先做简单功能验证。上电后主控跑起来,我读了一下NTC通道的原始ADC值,室温约26℃,读数稳定在2030左右。用公式反算阻值约10.2k,跟标称R25=10k对得上,心里踏实了不少。

接着做温度响应测试。我用热风枪在远处低温档对着NTC区域吹了几秒,温度到40℃左右时停手,同时用手持热电偶温度计测MOS散热铜箔的温度做参照。下表是记录的一组数据:

测试点ADC原始值换算阻值(kΩ)计算温度(℃)热电偶实测(℃)误差(℃)
室温203510.126.426.2+0.2
热风枪吹后13805.146.845.5+1.3
冷却1分钟18207.833.533.9-0.4
再次加热12104.253.952.8+1.1

误差基本在1℃左右,对过温保护来说可以接受。误差来源主要是NTC贴装位置的温度与热电偶测量点不完全一致,还有B值参数的批次离散性。如果想进一步减小误差,就做两点标定,把B值修正好。

5.3 把温度信号接进FOC控制环

读数稳定后,我在固件里加了一个慢速任务,每100ms读一次温度,换算成温度值后写到一个全局变量里。然后在FOC电流环里加入保护逻辑,大致思路是:

/* 温度保护:Iq限幅 */ float Iq_limit = IQ_MAX; /* 默认电流限幅 */ if (ntc_temp > 80.0f) { /* 预警:只记录状态,不动作 */ } if (ntc_temp > 100.0f) { /* 降额:按温度比例线性削减Iq限幅 */ Iq_limit = IQ_MAX * (120.0f - ntc_temp) / 20.0f; } if (ntc_temp >= 120.0f) { /* 停机:清PWM输出并置故障标志 */ fault_flags |= FAULT_OVERTEMP; pwm_enable = 0; }

这里最关键的是Iq限幅的计算方式。我没有在100℃时直接跳到限制值,而是从100℃开始线性下降,到120℃降到零。这样机械臂在高负载下会先感到“力气变小”,而不是突然停住,对电机和减速机都友好很多。

恢复逻辑也做了滞回处理:温度降到110℃以下才清掉停机标志,重新允许PWM输出。实测跑了一段往复运动负载,MOS温度维持在90到110℃之间波动,降额生效后电机输出明显变柔和,没有再出现温度继续飙升的情况。

6. 常见问题与排查技巧实录

6.1 典型故障速查表

整理一下这次改造过程中和之前其它板子上遇到过的NTC相关问题,做成一个速查表,方便大家对照排查。

故障现象可能原因排查与解决
读数跳到满量程或0VNTC焊点开路/短路、上拉电阻虚焊万用表量NTC两端阻值,确认阻值随温度变化
温度偏高且跳动PWM噪声耦合、采样时间太短加RC滤波、拉长ADC采样时间、信号线远离相线
温度读数稳定但明显偏低NTC离热源远、导热路径不当移至MOS附近并贴合,加导热垫/导热硅脂
换算温度与实测差好几度B值/R25与实际器件不符做室温单点标定,条件允许时再标B值
上电一瞬间温度异常ADC读数在电压稳定前被采样启动延时,丢弃前几组采样值,等滤波窗口填满
温度在临界点反复跳变没有滞回逻辑保护阈值加滞回,至少5-10℃

6.2 几个容易被忽略的细节

表里的问题都是能直接排查的,但实际项目中还有几个隐藏细节,不一定会立刻导致故障,却会影响长期可靠性。

第一个是NTC封装附近不要有大的铜皮过孔群。铜皮把热量导走是好事,但过孔如果上下连通功率地,会把开关噪声直接耦合到NTC焊盘附近。改板的时候我特意检查了一下,确认没有功率过孔靠近这颗NTC。

第二个是不要用热缩管把NTC包起来测“传感器自身温度”。有些朋友担心短路,把NTC整个包上绝缘热缩管,再贴散热器,这样做热阻会显著增加,响应慢很多。正确做法是NTC本体留出接触面,只对引脚和焊点做绝缘处理。

第三个是助焊剂残留问题。NTC焊接后,助焊剂如果残留在陶瓷体表面,长期在高温高湿环境下可能产生电化学迁移,导致阻值漂移。用洗板水或者酒精把焊区彻底清洁,这个动作别省。

第四个,如果手头只有其它阻值的NTC,比如100k@25℃或20k@25℃,千万不要直接替换后沿用10k分压的软件表。分压电路和查表都要一起改,否则温度误差会大到离谱。实在没办法,可以用两颗同阻值NTC并联来凑R25,但B值一致性要尽量接近,串并联对B值的影响要自己算清楚,不建议新手这么玩。

最后再说一个排查技巧:遇到读数异常,先把NTC从电路里断开,用万用表直接量它的阻值,再拿电烙铁或者手指头给它加热,看阻值是否连续变化。如果阻值随温度变化正常,问题基本在板级或软件;如果阻值不动或者乱跳,直接换一颗NTC再测。这个方法比盯着ADC波形调半天效率高得多。


这次改完板,我最大的体会是:温度采样在FOC系统里经常被当成一个“可有可无的附属功能”,但实际出事的时候,它往往比电流环还重要。发热是累积的,电流是瞬时的,很多情况下电流环没来得及反应,温度已经先拉响了警报。给FOC板加NTC,本质上不是多焊一颗电阻,而是给整套驱动系统加了一层“慢变量保护”。如果你也在改板路上卡在了“问NTC”这一步,不妨照着上面的流程走一遍,从选型、摆放、分压、滤波、采样、标定到保护逻辑,每一步都确认到位,这套温度链路基本一次就能打通。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 1:03:33

台风烧录器实战:从SPD读取到内存超频与救砖全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 1:03:15

STM32+ESP8266环境监测实战:从传感器采集到云平台告警完整方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 1:02:38

树莓派Python与C混合开发实战:环境搭建、性能优化与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 1:02:17

2023年7月IPC标准更新解读:焊点验收与CAF测试关键变化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 0:28:45

SolidWorks Routing界面变英文?排查语言包与帮助文件快速恢复中文

简介:针对Solidworks Routing模块界面显示英文、希望切换为中文的使用需求,这份docx文档提供了系统的语言调整方案。资源面向机械设计、管路布线工程师以及刚接触Routing插件的入门用户,重点说明中文语言包的检查与安装、系统选项中的文件位置…

作者头像 李华