线性插值法详解
作者简介 一个平凡而乐于分享的小比特中南民族大学通信工程专业研究生研究方向无线联邦学习擅长领域驱动开发嵌入式软件开发BSP开发❄️作者主页一个平凡而乐于分享的小比特的个人主页✨收录专栏硬件知识本专栏为记录项目中用到的知识点以及一些硬件常识总结欢迎大家点赞 收藏 ⭐ 加关注哦线性插值法详解一、什么是线性插值生活中的例子想象你在爬一座山山脚下0米处温度是25°C山顶上1000米处温度是15°C你现在爬到400米的高度想知道这里的温度是多少直观推理从山脚到山顶高度上升1000米温度下降10°C平均每上升100米温度下降1°C你现在上升了400米温度应该下降4°C所以400米处的温度 25°C - 4°C 21°C这就是线性插值的核心思想在两个已知点之间按比例估算未知点的值。二、数学原理图解2.1 基本概念图温度(°C) ↑ 25 ┼───────● (0米, 25°C) │ \ 24 ┼ \ 23 ┼ \ 22 ┼ \ 21 ┼ ● (400米, 21°C) ← 我们要求的值 20 ┼ \ 19 ┼ \ 18 ┼ \ 17 ┼ \ 16 ┼ \ 15 ┼ ● (1000米, 15°C) └──────────┴──────────┴──────────→ 高度(米) 0 400 10002.2 数学公式图解已知点A (x₁, y₁) 和 点B (x₂, y₂) 求点P (x, y) 其中 x₁ x x₂ 公式y y₁ (x - x₁) × (y₂ - y₁) / (x₂ - x₁) 图解 y₂ ┼───────● B │ ╱ │ ╱ y ┼──────● P ← 高度差比例 水平距离比例 │ ╱ │ ╱ y₁ ┼───● A │ └───┴───┴───┴───→ x₁ x x₂三、NTC热敏电阻应用详解3.1 问题背景NTC热敏电阻的特点是温度升高电阻下降负温度系数。我们需要通过测量电阻值来反推温度。3.2 R-T关系曲线电阻(Ω) ↑ 200k ┼──● (-40°C, 198.4k) │ \ 150k ┼ \ │ \ 100k ┼ \ │ \ 50k ┼ \ │ \ 10k ┼ ● (25°C, 10k) │ \ 5k ┼ \ │ \ 1k ┼ ● (90°C, 1k) └──────────┴──────────┴──────────→ 温度(°C) -40 25 903.3 R-T数据表部分温度(°C)电阻(Ω)说明-40198,400低温时电阻很大-35151,100-30116,000-2589,800-2070,200-1555,300-1043,900-534,800027,800冰点522,4001018,1601514,8002012,140室温附近2111,6702211,2202310,8002410,3902510,000标称值269,625279,266288,922298,593308,278356,891405,767454,851504,101602,995702,219801,667901,263100965120589150308高温时电阻很小四、三种典型场景详细对比场景1正好落在表格点上情况测得电阻 10,000Ω查找过程 电阻表: 10,000Ω 正好对应 25°C 结果: 温度 25.00°C图解电阻 10,000 ┼───● (25°C, 10,000Ω) │ │ │ └───────→ 温度 25°C结论直接查表无需计算场景2落在两个表格点之间情况测得电阻 10,600Ω步骤1确定区间查找电阻所在范围 24°C → 10,390Ω 23°C → 10,800Ω 10,600Ω 介于 10,390Ω 和 10,800Ω 之间步骤2可视化分析电阻(Ω) 10,800 ┼───● A (23°C, 10,800) │ \ 10,700 ┼ \ │ \ 10,600 ┼ ● P (?, 10,600) ← 我们在这里 │ \ 10,500 ┼ \ │ \ 10,400 ┼ \ 10,390 ┼ ● B (24°C, 10,390) └────────┴────────┴────→ 温度(°C) 23°C 24°C步骤3比例计算电阻差计算 总电阻差 10,800 - 10,390 410Ω 已下降电阻 10,800 - 10,600 200Ω 比例 200 / 410 0.4878 温度计算 总温度差 24°C - 23°C 1°C 温度增量 0.4878 × 1°C 0.4878°C 最终温度 23°C 0.4878°C 23.49°C场景3超出表格范围情况A电阻大于最大值测得电阻 200,000Ω( 198,400Ω)电阻 200k ────● 超出范围 ╱ 198.4k ┼───● 表格最大值 (-40°C) │ └──────→ 温度 -40°C结果温度 -40°C按边界值处理情况B电阻小于最小值测得电阻 300Ω( 308Ω)电阻 308 ──● 表格最小值 (150°C) ╲ 300 ──● 超出范围 结果温度 150°C五、计算对比表为了更直观地理解插值过程我们来看不同电阻值对应的计算过程测量电阻(Ω)所在区间计算公式计算结果(°C)27,800正好是0°C点直接查表0.0025,0000°C-5°C之间25,000在27,800和22,400之间约2.522,400正好是5°C点直接查表5.0020,0005°C-10°C之间20,000在22,400和18,160之间约7.818,160正好是10°C点直接查表10.0015,00010°C-15°C之间15,000在18,160和14,800之间约13.214,800正好是15°C点直接查表15.0012,140正好是20°C点直接查表20.0011,00020°C-21°C之间11,000在12,140和11,670之间约20.810,60023°C-24°C之间详细计算见上文23.4910,390正好是24°C点直接查表24.0010,000正好是25°C点直接查表25.009,50025°C-26°C之间9,500在10,000和9,625之间约25.88,278正好是30°C点直接查表30.00六、算法流程图七、代码实现逐行解析staticfloatBSP_NTC_ResToTemp(uint32_tresistance){uint8_ti;/* 1. 边界检查超出表格范围的情况 */if(resistancentc_res_table[0])/* 电阻太大 → 温度太低 */return(float)ntc_temp_table[0];/* 返回 -40°C */if(resistancentc_res_table[NTC_TABLE_SIZE-1])/* 电阻太小 → 温度太高 */return(float)ntc_temp_table[NTC_TABLE_SIZE-1];/* 返回 150°C *//* 2. 遍历表格查找电阻所在的区间 */for(i0;iNTC_TABLE_SIZE-1;i){/* 注意电阻值随温度升高而降低所以是递减序列 条件当前点电阻 ≥ 实际电阻 ≥ 下一点电阻 */if(resistancentc_res_table[i]resistancentc_res_table[i1]){/* 3. 计算比例因子 分子从当前点下降到实际电阻的差值 分母当前点到下一点的电阻总差值 */floatratio(float)(ntc_res_table[i]-resistance)/(float)(ntc_res_table[i]-ntc_res_table[i1]);/* 4. 线性插值计算温度 当前点温度 比例 × 温度差 */return(float)ntc_temp_table[i]ratio*(float)(ntc_temp_table[i1]-ntc_temp_table[i]);}}return25.0f;/* 默认值正常情况下不会执行到这里 */}八、数据流向图┌─────────────────┐ │ ADC采样值 │ │ (0-4095) │ └────────┬────────┘ ↓ ┌─────────────────┐ │ 计算电阻值 │ │ R f(ADC) │ └────────┬────────┘ ↓ ┌─────────────────┐ │ 电阻值 R │ │ (单位: Ω) │ └────────┬────────┘ ↓ ┌─────────────────────────────────────┐ │ 查表插值过程 │ ├─────────────────────────────────────┤ │ ┌──────────────┐ │ │ │ R ≥ 198,400? │───是──→ 温度 -40°C │ │ └──────────────┘ │ │ ↓ 否 │ │ ┌──────────────┐ │ │ │ R ≤ 308? │───是──→ 温度 150°C │ │ └──────────────┘ │ │ ↓ 否 │ │ ┌──────────────────────┐ │ │ │ 查找区间 i 使 │ │ │ │ table[i] ≥ R ≥ table[i1] │ │ │ └──────────────────────┘ │ │ ↓ │ │ ┌──────────────────────┐ │ │ │ 计算比例 (T[i]-R) │ │ │ │ / (T[i]-T[i1]) │ │ │ └──────────────────────┘ │ │ ↓ │ │ ┌──────────────────────┐ │ │ │ 温度 temp[i] │ │ │ │ 比例 × (temp[i1]-temp[i]) │ │ └──────────────────────┘ │ └─────────────────────────────────────┘ ↓ ┌─────────────────┐ │ 最终温度值 │ │ (单位: °C) │ └─────────────────┘九、精度分析9.1 误差来源误差类型原因影响程度表格离散化只有离散点没有连续曲线主要误差线性近似R-T关系实际是非线性的中等ADC量化ADC分辨率有限较小电阻计算参考电压精度、分压电阻精度较小9.2 不同区间的线性度温度区间 线性度 最大误差 ───────────────────────────── -40°C ~ 0°C 较差 ±1.5°C 0°C ~ 50°C 较好 ±0.3°C 50°C ~ 100°C 中等 ±0.8°C 100°C ~ 150°C 较差 ±2.0°C十、总结线性插值法的核心思想可以概括为一句话“按比例分配”就像分蛋糕一样先看总共有多少电阻总差看你拿了多少实际电阻差按同样的比例分温度温度差这种方法虽然简单但在工程应用中已经足够精确而且计算速度快非常适合嵌入式系统。