设备读到了 I²C 数据,数值也在变化,却不一定测到了想要的物理量。贴在发热 PCB 上的温度计可能主要测到板温,运动中的加速度计不能只按重力算倾角,VOC 算法输出的 CO₂ 等效值也不是直接测得的 CO₂ 浓度。理解传感器要沿物理对象、敏感元件、采样和结果解释逐层追踪。
物理量 → 敏感元件 热耦合、安装、方向 调理 / 采样 增益、带宽、ADC 原始数据 / 时间戳 字节序、比例、状态 校准、补偿与估计 带单位的结果 + 有效性 读到寄存器只是链路中间一步:物理安装与解释模型同样重要 数字输出减少外部模拟电路,不会自动消除安装误差、温漂、采样失真或模型偏差。
问题 查阅入口 先区分什么
规格写 16 bit,是否就精确 误差与分辨率 最小码步进、噪声、偏差
NTC 算温度方向反了 分压与反算 上臂、下臂及温度单位
数据平滑但运动不对 采样与滤波 混叠、延迟与真实变化
IMU 积分为何漂移 惯性测量与融合 角速度、比力、可观测方向
环境数值是否可信 安装与模型 直接测量、补偿、推算
ID 正常但数据异常 完整读取流程 配置、转换完成、原子读取与标定
分辨率、重复性和准确度分别回答不同问题
理想 12 bit ADC 在 3.3 V 范围内的码宽约为 3.3/4096 = 0.806 mV。这只是量化刻度,实际还包含偏置、增益、非线性、参考误差与噪声。把数字显示到 0.01°C 不意味着测量误差小于 0.01°C;多次结果相近说明重复性好,也可能整体偏高。
误差预算要区分确定性偏差和随机不确定度。若两个误差只有最大界限,保守总界限可相加;只有在具有相应统计定义且近似独立时,才适合用平方和开方。不能把数据表上的两个“±最大误差”直接 RSS 后当作有保证的最坏误差。
量程也有代价:更大范围通常使每 LSB 对应更多物理量,但噪声、过载恢复与带宽不必按同一比例变化。应先确认峰值不会饱和,再在目标频带和温度下评价有效结果。
NTC:从真实分压方向推回电阻
VEX = 3.3 V R固定 10 kΩ NTC R25 = 10 kΩ ADC 节点 V V = VEX × RNTC / (R固定 + RNTC) RNTC = R固定 × V / (VEX − V) 开路趋近 VEX;短路趋近 0 V NTC 在分压下臂:温度升高时,ADC 节点电压降低 ADC 若使用同源参考,可作比率测量;异常判定仍要考虑引脚漏电、保护及故障位置。
图中固定电阻在上、NTC 在下,因此 V = VEX·RNTC/(R固定+RNTC),反解得到 RNTC = R固定·V/(VEX−V) 。将上下电阻互换,公式也随之改变。NTC 温度升高时阻值下降,所以本图电压随温度升高而降低;这是检查公式方向的简单依据。
在适用温区内,B 参数近似可写成 1/T = 1/T25 + ln(R/R25)/B,T 与 T25 使用 K,最后才减 273.15 转为摄氏度。假设 R25=10 kΩ、B=3950 K,25°C 时节点为 1.65 V;50°C 时阻值约 3.588 kΩ,节点约 0.871 V。这个参数组只是算例,不代表所有 10 kΩ NTC。
若分压激励与 ADC 参考来自同一电源,使用归一化读数 q≈V/VEX,可写 RNTC=R固定·q/(1−q),理想情况下消去激励幅值误差。它不能消除电阻容差、ADC 偏置、参考路径噪声和 NTC 模型误差。ADI:比率式 NTC 接口
电流还会造成自热:25°C 时两个 10 kΩ 电阻串在 3.3 V 下,NTC 功耗约 0.272 mW。温升需结合实际介质中的耗散系数计算,不能从“功耗很小”断言温度误差可忽略。提高电阻或间歇供电可以减小功耗,但也会增加源阻抗或等待稳定的需求。更宽温区可按厂家曲线、查表或 Steinhart–Hart 模型,不能保证单个 B 值覆盖所有温度。ADI:热敏电阻测量设计
节点逼近 0 或电源时,应先判断短路、开路和超量程,再进入反算,避免分母趋零或得到看似有效的极端温度。具体故障响应依断点位置、漏电和保护网络而定。
上下臂换了,温度曲线会反过来
同一温度切换上下臂,q会变为1−q,而正确反算仍回到同一个温度。观察高温和低温端的斜率变化:相同ADC码宽并不对应全温区相同的温度分辨率。比率式消去激励电压,也没有消去元件和模型误差。
正在呈现知识画面 重新加载
上下臂换了,温度曲线会反过来 电阻随温度下降,输出方向却取决于NTC位于上臂还是下臂;反算必须使用对应连接。
{"id":"ntc-ratiometric-inversion","title":"上下臂换了,温度曲线会反过来","summary":"电阻随温度下降,输出方向却取决于NTC位于上臂还是下臂;反算必须使用对应连接。","height":1000,"html":"<h2 data-i18n=\"heading\"></h2><p class=\"intro\" data-i18n=\"intro\"></p><div class=\"presets\" role=\"group\" data-i18n-label=\"position\"><button data-mode=\"lower\" data-i18n=\"lower\"></button><button data-mode=\"upper\" data-i18n=\"upper\"></button></div><div class=\"control\"><label for=\"temp\" data-i18n=\"temp\"></label><output for=\"temp\" id=\"temp-value\"></output><input id=\"temp\" type=\"range\" min=\"0\" max=\"80\" value=\"25\" step=\"0.5\"></div><div class=\"chart-wrap\"><div class=\"chart-label\" data-i18n=\"plot\"></div><svg id=\"plot\" class=\"curve\" viewBox=\"0 0 360 210\" role=\"img\" data-i18n-label=\"plot\"></svg></div><div class=\"metrics\"><div><span data-i18n=\"res\"></span><strong id=\"res\"></strong></div><div><span data-i18n=\"ratio\"></span><strong id=\"ratio\"></strong></div><div><span data-i18n=\"recovered\"></span><strong id=\"recovered\"></strong></div><div><span data-i18n=\"sensitivity\"></span><strong id=\"sensitivity\"></strong></div></div><p id=\"eq\" class=\"formula\"></p><details class=\"scope\"><summary data-i18n=\"scopeLabel\"></summary><p data-i18n=\"scope\"></p></details>","css":".intro{margin:8px 0 18px;color:var(--muted);font-size:14px}.caption,.hint{font-size:12px;color:var(--muted);margin-top:12px}.control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 12px;align-items:center;margin:14px 0;font-size:13px}.control label{font-size:13px}.control output{color:var(--accent);min-width:5em;text-align:right;font-variant-numeric:tabular-nums}.control input{grid-column:1/-1;width:100%;margin:0}.presets{display:flex;gap:4px;align-items:stretch}.presets button{flex:1 1 0;min-width:0;overflow-wrap:anywhere;font-size:13px}.actions{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}.actions button{flex:1;min-width:0;font-size:13px;min-height:42px}.copy{display:grid;font-size:14px;margin:16px 0}.copy>*{grid-area:1/1;margin:0}.reserve{visibility:hidden}.scope{margin-top:14px;color:var(--muted);font-size:12px}.scope summary{padding:8px 0;cursor:pointer}.scope p{margin-top:10px}.two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.card{border:1px solid var(--rule);border-radius:9px;padding:14px;min-width:0}.card header{font-size:14px;font-weight:600;margin-bottom:10px}.card button{font-size:12px;width:100%;min-width:0}.card small{display:block;font-size:12px;color:var(--muted)}.card code{font-size:12px;overflow-wrap:anywhere}.metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.metrics>div{border-left:2px solid var(--accent);padding-left:10px;min-width:0}.metrics span{display:block;min-height:3.2em;color:var(--muted);font-size:12px}.metrics strong{font-size:23px;display:block;font-weight:550;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.formula{border-top:1px solid var(--rule);padding-top:12px;margin-top:14px;font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.value{font:550 20px ui-monospace,monospace}.legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;color:var(--muted);margin:12px 0}.legend span:before{content:'';display:inline-block;width:8px;height:8px;border-radius:2px;background:var(--accent);margin-right:6px}.legend .second:before{background:var(--second)}.check{display:flex;align-items:center;gap:8px;font-size:13px;margin:12px 0}.check input{width:16px;height:16px;flex-shrink:0;accent-color:var(--accent)}select,input[type=text],input[type=number]{background:var(--paper);color:var(--ink);font:inherit;font-size:13px;padding:10px;border:1px solid var(--rule);border-radius:7px;max-width:100%;min-width:0}select{width:100%;min-height:42px}.band{height:20px;display:flex;background:var(--surface);border-radius:4px;overflow:hidden}.band i{height:100%;display:block;background:var(--accent);transition:width .25s}.band i.second{background:var(--second)}button:disabled{cursor:default}.status{font-size:13px;min-height:4.8em}.mono{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums}.muted{color:var(--muted)}\n@media(max-width:480px){.two{gap:8px}.card{padding:12px 9px}.actions button,.presets button{font-size:12px}.metrics strong{font-size:20px}.metrics{gap:8px}}\n@media(prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}\n.track-row{margin:16px 0}.track-row>span{display:block;font-size:12px;color:var(--muted);margin-bottom:7px}.track{display:flex;gap:5px;min-width:0}.cell{flex:1;min-width:0;min-height:48px;border:1px solid var(--rule);border-radius:5px;background:var(--surface);display:flex;align-items:center;justify-content:center;text-align:center;padding:5px 3px;font-size:12px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.cell.on{background:var(--accent-soft);border-color:var(--accent)}.cell.gold{background:var(--second-soft);border-color:var(--second)}.cell.empty{border-style:dashed;color:var(--muted)}.cell.error{border-color:var(--second);text-decoration:line-through}.choices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:14px 0}.choices button{min-width:0;padding:10px 4px;font-size:12px;overflow-wrap:anywhere}.choices button[aria-current=true]{border-color:var(--accent);background:var(--accent-soft)}.relation{display:grid;grid-template-columns:minmax(0,1fr) 28px minmax(0,1fr);align-items:center;gap:6px;margin:12px 0}.relation .cell{min-height:72px}.relation>i{text-align:center;font-style:normal;color:var(--accent)}.readout{font-size:13px;white-space:pre-line;min-height:6.4em;overflow-wrap:anywhere}.plot{position:relative;border-left:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:8px 0;margin:18px 0}.plot-row{height:28px;position:relative;margin:4px 0;background:var(--surface)}.plot-row i{position:absolute;inset-block:5px;background:var(--accent);min-width:2px;transition:width .2s,left .2s}.plot-row b{position:relative;padding:4px 6px;font:11px/28px ui-monospace,monospace;background:var(--paper);border-radius:3px}.axis{display:flex;justify-content:space-between;font-size:11px;color:var(--muted)}\n\n/* Action labels must remain readable across locales and narrow embeds. */\n.actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\n.actions button{overflow-wrap:anywhere;white-space:normal;min-height:58px;padding:8px}\nbutton{overflow-wrap:anywhere}\n@media(min-width:640px){.actions{grid-template-columns:repeat(3,minmax(0,1fr))}}\n\n.metrics span{overflow-wrap:anywhere}\n.panel{border:1px solid var(--rule);border-radius:9px;padding:12px;margin:14px 0;min-width:0}.panel h3{font-size:13px;margin:0 0 10px;color:var(--muted)}.source{font:13px/1.8 ui-monospace,monospace;white-space:pre-wrap;overflow-wrap:anywhere;margin:12px 0}.source mark{background:var(--accent-soft);color:var(--ink);border-bottom:2px solid var(--accent)}.source .fault{background:var(--second-soft);border-color:var(--second)}.diagram{display:block;width:100%;height:auto;max-height:320px;margin:14px 0;overflow:visible}.diagram text{fill:var(--ink);font:12px ui-monospace,monospace}.diagram .edge{stroke:var(--muted);stroke-width:1.5;fill:none}.diagram .edge.on{stroke:var(--accent);stroke-width:3}.diagram .node{fill:var(--surface);stroke:var(--rule);stroke-width:1.5}.diagram .node.on{fill:var(--accent-soft);stroke:var(--accent)}.diagram .node.gold{fill:var(--second-soft);stroke:var(--second)}.log{font:12px/1.8 ui-monospace,monospace;white-space:pre-line;overflow-wrap:anywhere;min-height:7.2em}.table{display:grid;gap:5px;margin:14px 0}.table .tr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.table .tr>*{padding:8px 5px;background:var(--surface);border-radius:4px;min-width:0;overflow-wrap:anywhere;font-size:12px}.table .tr .on{background:var(--accent-soft)}.table .tr .gold{background:var(--second-soft)}.choices button{min-height:44px}.metrics strong{min-height:1.6em}.code-line{display:block}.code-line.on{background:var(--accent-soft);border-left:2px solid var(--accent);padding-left:6px}.status-badge{font-size:12px;color:var(--accent)}.tile-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.tile-grid .cell{min-height:40px}.actions button{min-height:48px}.form-field{display:grid;gap:8px;margin:14px 0;font-size:13px}.form-field input{width:100%;font-family:ui-monospace,monospace}.metrics.three{grid-template-columns:repeat(3,minmax(0,1fr))}.formula{min-height:3.2em}.presets{flex-wrap:wrap}.presets button{flex-basis:25%;min-height:44px}\n\n.budget{display:flex;height:28px;margin:16px 0;background:var(--surface);border-radius:5px;overflow:hidden}.budget i{display:block;background:var(--accent);transition:width .2s}.budget i.gold{background:var(--second)}.intervals{margin:16px 0}.interval{position:relative;height:36px;background:var(--surface);margin:6px 0;border-radius:4px;overflow:hidden}.interval i{position:absolute;height:100%;background:var(--accent-soft);border-left:2px solid var(--accent)}.interval i.gold{background:var(--second-soft);border-color:var(--second)}.interval span{position:relative;z-index:1;font:12px/36px ui-monospace,monospace;padding-left:7px}.table .tr>*{min-height:4.8em}.formula{white-space:pre-line;min-height:7.2em}.actions:has(>button:only-child){grid-template-columns:1fr}.metrics strong{min-height:3.2em}.rangegrid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:3px;margin:14px 0}.rangegrid .cell{min-height:30px;padding:3px 1px;font-size:10px}.message{min-height:7.2em;white-space:pre-line;font:13px/1.8 ui-monospace,monospace;overflow-wrap:anywhere}\n/* Allow CJK hanging punctuation without overflowing a metric's border box. */\n.metrics>div{padding-right:4px}.metrics span{line-break:anywhere}\n\n.chart-wrap{margin:18px 0}.chart-label{font-size:12px;color:var(--muted);min-height:3.2em}.curve{display:block;width:100%;height:auto;max-height:320px;overflow:visible}.curve text{font:11px ui-monospace,monospace;fill:var(--muted)}.gridline{stroke:var(--rule);stroke-width:1}.metrics strong{font-size:20px;min-height:3.2em}.formula{font:12px/1.8 ui-monospace,monospace;min-height:9em}.readout{min-height:8em}.presets button{flex-basis:30%}.scope p{overflow-wrap:anywhere} .unit-note{font-size:12px;color:var(--muted);margin:10px 0}\n\n.metrics span{word-break:break-all;line-break:strict}.metrics>div{padding-right:6px}\n\n","js":"const $=s=>document.querySelector(s);const set=(id,v)=>$('#'+id).textContent=v;const t=k=>viz.t(k);function cells(id,values){$('#'+id).replaceChildren(...values.map(v=>{const e=document.createElement('div');e.className='cell '+(v.cls||'');e.textContent=v.text;e.title=v.title||v.text;return e;}));}function pressed(mode){document.querySelectorAll('[data-mode]').forEach(e=>e.setAttribute('aria-pressed',String(e.dataset.mode===mode)));}const esc=s=>String(s).replace(/[&<>\"']/g,c=>({'&':'&','<':'<','>':'>','\"':'"',\"'\":'''}[c]));const fmt=s=>'{'+[...s].sort().join(', ')+'}';function graph(id,nodes,edges){const el=$('#'+id);el.setAttribute('viewBox','0 0 360 200');el.innerHTML='<defs><marker id=\"arrow-'+id+'\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--muted)\"/></marker></defs>'+edges.map(e=>{const a=nodes[e[0]],b=nodes[e[1]],dx=b.x-a.x,dy=b.y-a.y,d=Math.hypot(dx,dy)||1;if(edges.some(r=>r[0]===e[1]&&r[1]===e[0])){const nx=-dy/d,ny=dx/d;return '<path class=\"edge '+(e[2]?'on':'')+'\" d=\"M '+(a.x+dx/d*22+nx*12)+' '+(a.y+dy/d*22+ny*12)+' Q '+((a.x+b.x)/2+nx*38)+' '+((a.y+b.y)/2+ny*38)+' '+(b.x-dx/d*25+nx*12)+' '+(b.y-dy/d*25+ny*12)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}return '<line class=\"edge '+(e[2]?'on':'')+'\" x1=\"'+(a.x+dx/d*25)+'\" y1=\"'+(a.y+dy/d*25)+'\" x2=\"'+(b.x-dx/d*28)+'\" y2=\"'+(b.y-dy/d*28)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}).join('')+nodes.map(n=>'<g><circle class=\"node '+(n.cls||'')+'\" cx=\"'+n.x+'\" cy=\"'+n.y+'\" r=\"25\"/><text x=\"'+n.x+'\" y=\"'+(n.y+4)+'\" text-anchor=\"middle\">'+esc(n.name)+'</text>'+(n.sub?'<text x=\"'+n.x+'\" y=\"'+(n.y+43)+'\" text-anchor=\"middle\">'+esc(n.sub)+'</text>':'')+'</g>').join('');}function table(id,rows){$('#'+id).classList.add('table');$('#'+id).replaceChildren(...rows.map(r=>{const row=document.createElement('div');row.className='tr';row.style.gridTemplateColumns='repeat('+r.length+',minmax(0,1fr))';r.forEach(x=>{const c=document.createElement('div');if(typeof x==='object'){c.textContent=x.text;c.className=x.cls||'';}else c.textContent=x;row.append(c)});return row;}));}function band(id,parts,total){$('#'+id).replaceChildren(...parts.map((p,i)=>{const e=document.createElement('i');e.style.width=(100*p.value/total)+'%';e.className=i%2?'gold':'on';e.title=p.name+': '+p.value;return e}));}function intervals(id,items,total){$('#'+id).replaceChildren(...items.map(p=>{const row=document.createElement('div');row.className='interval';const bar=document.createElement('i');bar.style.left=(100*p.start/total)+'%';bar.style.width=(100*(p.end-p.start)/total)+'%';bar.className=p.cls||'';const label=document.createElement('span');label.textContent=p.label;row.append(bar,label);return row;}));}function plot(id,series,xr,yr,opts={}){const e=$('#'+id),X=x=>42+(x-xr[0])/(xr[1]-xr[0])*298,Y=y=>175-(y-yr[0])/(yr[1]-yr[0])*148;let out='<defs><clipPath id=\"clip-'+id+'\"><rect x=\"42\" y=\"27\" width=\"298\" height=\"148\"/></clipPath></defs>';for(let i=0;i<3;i++){let x=xr[0]+i*(xr[1]-xr[0])/2,y=yr[0]+i*(yr[1]-yr[0])/2;out+='<path class=\"gridline\" d=\"M '+X(x)+' 27V175M42 '+Y(y)+'H340\"/><text x=\"'+X(x)+'\" y=\"194\" text-anchor=\"middle\">'+esc(opts.xfmt?opts.xfmt(x):Number(x.toFixed(2)))+'</text><text x=\"36\" y=\"'+(Y(y)+4)+'\" text-anchor=\"end\">'+esc(opts.yfmt?opts.yfmt(y):Number(y.toFixed(2)))+'</text>';}out+='<g clip-path=\"url(#clip-'+id+')\">';for(const s of series){out+='<path fill=\"none\" stroke=\"'+(s.color||'var(--accent)')+'\" stroke-width=\"2.5\" '+(s.dash?'stroke-dasharray=\"5 4\"':'')+' d=\"'+s.pts.map((p,i)=>(i?'L':'M')+X(p[0]).toFixed(2)+','+Y(p[1]).toFixed(2)).join(' ')+'\"/>';}for(const p of opts.points||[])out+='<circle cx=\"'+X(p[0])+'\" cy=\"'+Y(p[1])+'\" r=\"4\" fill=\"var(--second)\" stroke=\"var(--paper)\" stroke-width=\"1.5\"/>';if(opts.cursor!==undefined)out+='<path d=\"M'+X(opts.cursor)+' 27V175\" stroke=\"var(--muted)\" stroke-dasharray=\"3 3\"/>';e.innerHTML=out+'</g>';e.dataset.curves=JSON.stringify(series.map(s=>s.pts));}const curve=(fn,lo,hi,n=120)=>Array.from({length:n+1},(_,i)=>{const x=lo+(hi-lo)*i/n;return[x,fn(x)]});function inputs(draw){document.querySelectorAll('input,select').forEach(e=>{e.addEventListener('input',draw);e.addEventListener('change',draw)});draw()}const n=id=>+$('#'+id).value;const show=(id,v,d=3)=>set(id,Number(v.toFixed(d)));let mode='lower';function draw(){let temp=n('temp'),R=t=>10*Math.exp(3950*(1/(t+273.15)-1/298.15)),ratio=t=>mode==='lower'?R(t)/(10+R(t)):10/(10+R(t)),q=ratio(temp),r=mode==='lower'?10*q/(1-q):10*(1-q)/q,recovered=1/(1/298.15+Math.log(r/10)/3950)-273.15;pressed(mode);show('temp-value',temp);plot('plot',[{pts:curve(ratio,0,80)}],[0,80],[0,1],{points:[[temp,q]]});show('res',r,4);show('ratio',q,5);show('recovered',recovered,3);show('sensitivity',(ratio(temp+.001)-ratio(temp-.001))/.002,6);set('eq', (mode==='lower'?'RNTC = Rfixed q/(1−q)':'RNTC = Rfixed (1−q)/q')+'\\nT = 1/[1/298.15 + ln(R/R25)/B] − 273.15');}document.querySelectorAll('[data-mode]').forEach(e=>e.onclick=()=>{mode=e.dataset.mode;draw()});inputs(draw);","audio":false,"strings":{"heading":"上下臂换了,温度曲线会反过来","intro":"切换NTC位置,联动分压比、反算温度和局部灵敏度。","lower":"下臂","plot":"横轴°C,纵轴 q=V/VEX","position":"NTC位置","ratio":"分压比 q","recovered":"反算温度(°C)","res":"NTC(kΩ)","reset":"重置","scope":"R25=10 kΩ、B=3950 K、固定电阻10 kΩ,理想比率式ADC;0–80°C内教学模型,不含自热、容差与量化。","scopeLabel":"模型范围与约定","sensitivity":"dq/dT(1/°C)","temp":"真实温度(°C)","upper":"上臂"}}
温度测量:传感器温度怎样代表被测对象
NTC、RTD 和数字温度计都需要热耦合;响应速度由封装、安装、介质和热容量共同决定。高精度铂电阻还需考虑激励自热、两线引线电阻及三/四线补偿,不能仅凭“PT100”就保证 ±0.1°C。数字器件省去部分模拟设计,并不消除封装和板上热源的影响。
DS18B20 支持可选分辨率与多点 1-Wire,12 bit 转换最长时间可达 750 ms;分辨率设置、供电模式和总线负载会影响系统行为。寄生供电时转换阶段可能需要强上拉,不能只接一根数据线便忽略供电与返回路径。ADI DS18B20 数据表
热电偶产生与两端温度相关的热电势,不是单个焊点输出绝对温度。冷端补偿测量接线端温度,转换成该类型相对于参考温度的等效热电势,与测得电压合成后再反查热端温度;由于关系非线性,不能在所有温区简单把两个温度相加。补偿传感器应代表实际接线端温度,而非附近芯片的温度。ADI:冷端补偿
模拟与数字采样都需要时间模型
SAR ADC 的采样电容需要经信号源充电。简化为单极点模型,全量程阶跃要收敛到半个 N bit LSB,约需 t ≥ (N+1)ln2·R源C采样;12 bit 约为 9 个时间常数。假设 10 kΩ 和 10 pF,仅这一部分便约 0.90 μs,实际还要计开关阻抗和驱动器稳定过程。ADI:源阻抗与采样建立时间
采样率必须与模拟带宽及抗混叠滤波配合。例如 1 ksample/s 采样 900 Hz 正弦,会在离散数据中与某个 100 Hz 正弦无法区分;采样后移动平均无法恢复原本的 900 Hz 身份。数字传感器内部已有采样/滤波,也仍需核对输出数据率、带宽与滤波配置。
平均可以降低满足条件的随机噪声,但会增加延迟。长度 N 的简单移动平均在其线性相位模型下有 (N−1)/2 个采样间隔群延迟,1 ksample/s、N=21 时约 10 ms。它不能消除固定偏置,相关噪声也不一定按 1/√N 下降;控制系统应把延迟纳入闭环预算。
数字接口速度只是传输能力,不是测量更新率。UART 本身不规定长距离物理层,I²C 功耗也不固定低于 SPI。选接口要结合线缆电气、有效数据量、地址或片选、时间戳和 FIFO 深度,具体电平见 接口物理层 。
同一组采样点,可能来自两条不同曲线
默认900 Hz与100 Hz曲线在每一个采样点相交,点之间却完全不同。把输入设成1000 Hz,采样甚至全部变成同一个值。使用余弦是为了在图中保持相位对应;这并不意味着所有混叠都无需处理相位。
cos ( 2 π ( f s − f ) n / f s ) = cos ( 2 π f n / f s )
正在呈现知识画面 重新加载
同一组采样点,可能来自两条不同曲线 离散采样点可以完全相同;采样之后的算法无法仅凭这些点判断原始频率。
{"id":"sampling-alias-identity","title":"同一组采样点,可能来自两条不同曲线","summary":"离散采样点可以完全相同;采样之后的算法无法仅凭这些点判断原始频率。","height":1000,"html":"<h2 data-i18n=\"heading\"></h2><p class=\"intro\" data-i18n=\"intro\"></p><div class=\"control\"><label for=\"f\" data-i18n=\"f\"></label><output for=\"f\" id=\"f-value\"></output><input id=\"f\" type=\"range\" min=\"0\" max=\"2000\" value=\"900\" step=\"10\"></div><div class=\"chart-wrap\"><div class=\"chart-label\" data-i18n=\"plot\"></div><svg id=\"plot\" class=\"curve\" viewBox=\"0 0 360 210\" role=\"img\" data-i18n-label=\"plot\"></svg></div><div class=\"metrics\"><div><span data-i18n=\"alias\"></span><strong id=\"alias\"></strong></div><div><span data-i18n=\"period\"></span><strong id=\"period\"></strong></div></div><p id=\"eq\" class=\"formula\"></p><details class=\"scope\"><summary data-i18n=\"scopeLabel\"></summary><p data-i18n=\"scope\"></p></details>","css":".intro{margin:8px 0 18px;color:var(--muted);font-size:14px}.caption,.hint{font-size:12px;color:var(--muted);margin-top:12px}.control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 12px;align-items:center;margin:14px 0;font-size:13px}.control label{font-size:13px}.control output{color:var(--accent);min-width:5em;text-align:right;font-variant-numeric:tabular-nums}.control input{grid-column:1/-1;width:100%;margin:0}.presets{display:flex;gap:4px;align-items:stretch}.presets button{flex:1 1 0;min-width:0;overflow-wrap:anywhere;font-size:13px}.actions{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}.actions button{flex:1;min-width:0;font-size:13px;min-height:42px}.copy{display:grid;font-size:14px;margin:16px 0}.copy>*{grid-area:1/1;margin:0}.reserve{visibility:hidden}.scope{margin-top:14px;color:var(--muted);font-size:12px}.scope summary{padding:8px 0;cursor:pointer}.scope p{margin-top:10px}.two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.card{border:1px solid var(--rule);border-radius:9px;padding:14px;min-width:0}.card header{font-size:14px;font-weight:600;margin-bottom:10px}.card button{font-size:12px;width:100%;min-width:0}.card small{display:block;font-size:12px;color:var(--muted)}.card code{font-size:12px;overflow-wrap:anywhere}.metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.metrics>div{border-left:2px solid var(--accent);padding-left:10px;min-width:0}.metrics span{display:block;min-height:3.2em;color:var(--muted);font-size:12px}.metrics strong{font-size:23px;display:block;font-weight:550;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.formula{border-top:1px solid var(--rule);padding-top:12px;margin-top:14px;font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.value{font:550 20px ui-monospace,monospace}.legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;color:var(--muted);margin:12px 0}.legend span:before{content:'';display:inline-block;width:8px;height:8px;border-radius:2px;background:var(--accent);margin-right:6px}.legend .second:before{background:var(--second)}.check{display:flex;align-items:center;gap:8px;font-size:13px;margin:12px 0}.check input{width:16px;height:16px;flex-shrink:0;accent-color:var(--accent)}select,input[type=text],input[type=number]{background:var(--paper);color:var(--ink);font:inherit;font-size:13px;padding:10px;border:1px solid var(--rule);border-radius:7px;max-width:100%;min-width:0}select{width:100%;min-height:42px}.band{height:20px;display:flex;background:var(--surface);border-radius:4px;overflow:hidden}.band i{height:100%;display:block;background:var(--accent);transition:width .25s}.band i.second{background:var(--second)}button:disabled{cursor:default}.status{font-size:13px;min-height:4.8em}.mono{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums}.muted{color:var(--muted)}\n@media(max-width:480px){.two{gap:8px}.card{padding:12px 9px}.actions button,.presets button{font-size:12px}.metrics strong{font-size:20px}.metrics{gap:8px}}\n@media(prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}\n.track-row{margin:16px 0}.track-row>span{display:block;font-size:12px;color:var(--muted);margin-bottom:7px}.track{display:flex;gap:5px;min-width:0}.cell{flex:1;min-width:0;min-height:48px;border:1px solid var(--rule);border-radius:5px;background:var(--surface);display:flex;align-items:center;justify-content:center;text-align:center;padding:5px 3px;font-size:12px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.cell.on{background:var(--accent-soft);border-color:var(--accent)}.cell.gold{background:var(--second-soft);border-color:var(--second)}.cell.empty{border-style:dashed;color:var(--muted)}.cell.error{border-color:var(--second);text-decoration:line-through}.choices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:14px 0}.choices button{min-width:0;padding:10px 4px;font-size:12px;overflow-wrap:anywhere}.choices button[aria-current=true]{border-color:var(--accent);background:var(--accent-soft)}.relation{display:grid;grid-template-columns:minmax(0,1fr) 28px minmax(0,1fr);align-items:center;gap:6px;margin:12px 0}.relation .cell{min-height:72px}.relation>i{text-align:center;font-style:normal;color:var(--accent)}.readout{font-size:13px;white-space:pre-line;min-height:6.4em;overflow-wrap:anywhere}.plot{position:relative;border-left:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:8px 0;margin:18px 0}.plot-row{height:28px;position:relative;margin:4px 0;background:var(--surface)}.plot-row i{position:absolute;inset-block:5px;background:var(--accent);min-width:2px;transition:width .2s,left .2s}.plot-row b{position:relative;padding:4px 6px;font:11px/28px ui-monospace,monospace;background:var(--paper);border-radius:3px}.axis{display:flex;justify-content:space-between;font-size:11px;color:var(--muted)}\n\n/* Action labels must remain readable across locales and narrow embeds. */\n.actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\n.actions button{overflow-wrap:anywhere;white-space:normal;min-height:58px;padding:8px}\nbutton{overflow-wrap:anywhere}\n@media(min-width:640px){.actions{grid-template-columns:repeat(3,minmax(0,1fr))}}\n\n.metrics span{overflow-wrap:anywhere}\n.panel{border:1px solid var(--rule);border-radius:9px;padding:12px;margin:14px 0;min-width:0}.panel h3{font-size:13px;margin:0 0 10px;color:var(--muted)}.source{font:13px/1.8 ui-monospace,monospace;white-space:pre-wrap;overflow-wrap:anywhere;margin:12px 0}.source mark{background:var(--accent-soft);color:var(--ink);border-bottom:2px solid var(--accent)}.source .fault{background:var(--second-soft);border-color:var(--second)}.diagram{display:block;width:100%;height:auto;max-height:320px;margin:14px 0;overflow:visible}.diagram text{fill:var(--ink);font:12px ui-monospace,monospace}.diagram .edge{stroke:var(--muted);stroke-width:1.5;fill:none}.diagram .edge.on{stroke:var(--accent);stroke-width:3}.diagram .node{fill:var(--surface);stroke:var(--rule);stroke-width:1.5}.diagram .node.on{fill:var(--accent-soft);stroke:var(--accent)}.diagram .node.gold{fill:var(--second-soft);stroke:var(--second)}.log{font:12px/1.8 ui-monospace,monospace;white-space:pre-line;overflow-wrap:anywhere;min-height:7.2em}.table{display:grid;gap:5px;margin:14px 0}.table .tr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.table .tr>*{padding:8px 5px;background:var(--surface);border-radius:4px;min-width:0;overflow-wrap:anywhere;font-size:12px}.table .tr .on{background:var(--accent-soft)}.table .tr .gold{background:var(--second-soft)}.choices button{min-height:44px}.metrics strong{min-height:1.6em}.code-line{display:block}.code-line.on{background:var(--accent-soft);border-left:2px solid var(--accent);padding-left:6px}.status-badge{font-size:12px;color:var(--accent)}.tile-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.tile-grid .cell{min-height:40px}.actions button{min-height:48px}.form-field{display:grid;gap:8px;margin:14px 0;font-size:13px}.form-field input{width:100%;font-family:ui-monospace,monospace}.metrics.three{grid-template-columns:repeat(3,minmax(0,1fr))}.formula{min-height:3.2em}.presets{flex-wrap:wrap}.presets button{flex-basis:25%;min-height:44px}\n\n.budget{display:flex;height:28px;margin:16px 0;background:var(--surface);border-radius:5px;overflow:hidden}.budget i{display:block;background:var(--accent);transition:width .2s}.budget i.gold{background:var(--second)}.intervals{margin:16px 0}.interval{position:relative;height:36px;background:var(--surface);margin:6px 0;border-radius:4px;overflow:hidden}.interval i{position:absolute;height:100%;background:var(--accent-soft);border-left:2px solid var(--accent)}.interval i.gold{background:var(--second-soft);border-color:var(--second)}.interval span{position:relative;z-index:1;font:12px/36px ui-monospace,monospace;padding-left:7px}.table .tr>*{min-height:4.8em}.formula{white-space:pre-line;min-height:7.2em}.actions:has(>button:only-child){grid-template-columns:1fr}.metrics strong{min-height:3.2em}.rangegrid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:3px;margin:14px 0}.rangegrid .cell{min-height:30px;padding:3px 1px;font-size:10px}.message{min-height:7.2em;white-space:pre-line;font:13px/1.8 ui-monospace,monospace;overflow-wrap:anywhere}\n/* Allow CJK hanging punctuation without overflowing a metric's border box. */\n.metrics>div{padding-right:4px}.metrics span{line-break:anywhere}\n\n.chart-wrap{margin:18px 0}.chart-label{font-size:12px;color:var(--muted);min-height:3.2em}.curve{display:block;width:100%;height:auto;max-height:320px;overflow:visible}.curve text{font:11px ui-monospace,monospace;fill:var(--muted)}.gridline{stroke:var(--rule);stroke-width:1}.metrics strong{font-size:20px;min-height:3.2em}.formula{font:12px/1.8 ui-monospace,monospace;min-height:9em}.readout{min-height:8em}.presets button{flex-basis:30%}.scope p{overflow-wrap:anywhere} .unit-note{font-size:12px;color:var(--muted);margin:10px 0}\n\n.metrics span{word-break:break-all;line-break:strict}.metrics>div{padding-right:6px}\n\n","js":"const $=s=>document.querySelector(s);const set=(id,v)=>$('#'+id).textContent=v;const t=k=>viz.t(k);function cells(id,values){$('#'+id).replaceChildren(...values.map(v=>{const e=document.createElement('div');e.className='cell '+(v.cls||'');e.textContent=v.text;e.title=v.title||v.text;return e;}));}function pressed(mode){document.querySelectorAll('[data-mode]').forEach(e=>e.setAttribute('aria-pressed',String(e.dataset.mode===mode)));}const esc=s=>String(s).replace(/[&<>\"']/g,c=>({'&':'&','<':'<','>':'>','\"':'"',\"'\":'''}[c]));const fmt=s=>'{'+[...s].sort().join(', ')+'}';function graph(id,nodes,edges){const el=$('#'+id);el.setAttribute('viewBox','0 0 360 200');el.innerHTML='<defs><marker id=\"arrow-'+id+'\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--muted)\"/></marker></defs>'+edges.map(e=>{const a=nodes[e[0]],b=nodes[e[1]],dx=b.x-a.x,dy=b.y-a.y,d=Math.hypot(dx,dy)||1;if(edges.some(r=>r[0]===e[1]&&r[1]===e[0])){const nx=-dy/d,ny=dx/d;return '<path class=\"edge '+(e[2]?'on':'')+'\" d=\"M '+(a.x+dx/d*22+nx*12)+' '+(a.y+dy/d*22+ny*12)+' Q '+((a.x+b.x)/2+nx*38)+' '+((a.y+b.y)/2+ny*38)+' '+(b.x-dx/d*25+nx*12)+' '+(b.y-dy/d*25+ny*12)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}return '<line class=\"edge '+(e[2]?'on':'')+'\" x1=\"'+(a.x+dx/d*25)+'\" y1=\"'+(a.y+dy/d*25)+'\" x2=\"'+(b.x-dx/d*28)+'\" y2=\"'+(b.y-dy/d*28)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}).join('')+nodes.map(n=>'<g><circle class=\"node '+(n.cls||'')+'\" cx=\"'+n.x+'\" cy=\"'+n.y+'\" r=\"25\"/><text x=\"'+n.x+'\" y=\"'+(n.y+4)+'\" text-anchor=\"middle\">'+esc(n.name)+'</text>'+(n.sub?'<text x=\"'+n.x+'\" y=\"'+(n.y+43)+'\" text-anchor=\"middle\">'+esc(n.sub)+'</text>':'')+'</g>').join('');}function table(id,rows){$('#'+id).classList.add('table');$('#'+id).replaceChildren(...rows.map(r=>{const row=document.createElement('div');row.className='tr';row.style.gridTemplateColumns='repeat('+r.length+',minmax(0,1fr))';r.forEach(x=>{const c=document.createElement('div');if(typeof x==='object'){c.textContent=x.text;c.className=x.cls||'';}else c.textContent=x;row.append(c)});return row;}));}function band(id,parts,total){$('#'+id).replaceChildren(...parts.map((p,i)=>{const e=document.createElement('i');e.style.width=(100*p.value/total)+'%';e.className=i%2?'gold':'on';e.title=p.name+': '+p.value;return e}));}function intervals(id,items,total){$('#'+id).replaceChildren(...items.map(p=>{const row=document.createElement('div');row.className='interval';const bar=document.createElement('i');bar.style.left=(100*p.start/total)+'%';bar.style.width=(100*(p.end-p.start)/total)+'%';bar.className=p.cls||'';const label=document.createElement('span');label.textContent=p.label;row.append(bar,label);return row;}));}function plot(id,series,xr,yr,opts={}){const e=$('#'+id),X=x=>42+(x-xr[0])/(xr[1]-xr[0])*298,Y=y=>175-(y-yr[0])/(yr[1]-yr[0])*148;let out='<defs><clipPath id=\"clip-'+id+'\"><rect x=\"42\" y=\"27\" width=\"298\" height=\"148\"/></clipPath></defs>';for(let i=0;i<3;i++){let x=xr[0]+i*(xr[1]-xr[0])/2,y=yr[0]+i*(yr[1]-yr[0])/2;out+='<path class=\"gridline\" d=\"M '+X(x)+' 27V175M42 '+Y(y)+'H340\"/><text x=\"'+X(x)+'\" y=\"194\" text-anchor=\"middle\">'+esc(opts.xfmt?opts.xfmt(x):Number(x.toFixed(2)))+'</text><text x=\"36\" y=\"'+(Y(y)+4)+'\" text-anchor=\"end\">'+esc(opts.yfmt?opts.yfmt(y):Number(y.toFixed(2)))+'</text>';}out+='<g clip-path=\"url(#clip-'+id+')\">';for(const s of series){out+='<path fill=\"none\" stroke=\"'+(s.color||'var(--accent)')+'\" stroke-width=\"2.5\" '+(s.dash?'stroke-dasharray=\"5 4\"':'')+' d=\"'+s.pts.map((p,i)=>(i?'L':'M')+X(p[0]).toFixed(2)+','+Y(p[1]).toFixed(2)).join(' ')+'\"/>';}for(const p of opts.points||[])out+='<circle cx=\"'+X(p[0])+'\" cy=\"'+Y(p[1])+'\" r=\"4\" fill=\"var(--second)\" stroke=\"var(--paper)\" stroke-width=\"1.5\"/>';if(opts.cursor!==undefined)out+='<path d=\"M'+X(opts.cursor)+' 27V175\" stroke=\"var(--muted)\" stroke-dasharray=\"3 3\"/>';e.innerHTML=out+'</g>';e.dataset.curves=JSON.stringify(series.map(s=>s.pts));}const curve=(fn,lo,hi,n=120)=>Array.from({length:n+1},(_,i)=>{const x=lo+(hi-lo)*i/n;return[x,fn(x)]});function inputs(draw){document.querySelectorAll('input,select').forEach(e=>{e.addEventListener('input',draw);e.addEventListener('change',draw)});draw()}const n=id=>+$('#'+id).value;const show=(id,v,d=3)=>set(id,Number(v.toFixed(d)));function draw(){let f=n('f'),alias=Math.abs(((f+500)%1000)-500),wave=(freq,t)=>Math.cos(2*Math.PI*freq*t/1000),samples=Array.from({length:11},(_,i)=>[i,wave(f,i)]);show('f-value',f);plot('plot',[{pts:curve(t=>wave(f,t),0,10,800)},{pts:curve(t=>wave(alias,t),0,10,800),color:'var(--second)'}],[0,10],[-1.2,1.2],{points:samples});show('alias',alias);show('period',1);set('eq','x[n] = cos(2π f n/fs)\\nfalias = abs(((f + fs/2) mod fs) − fs/2)\\n= '+alias+' Hz');$('#alias').dataset.samples=JSON.stringify(samples.map(x=>x[1]));}inputs(draw);","audio":false,"strings":{"alias":"基带频率(Hz)","f":"输入频率(Hz)","heading":"同一组采样点,可能来自两条不同曲线","intro":"改变输入频率,比较真实余弦与基带混叠曲线。","period":"采样间隔(ms)","plot":"横轴 ms;蓝:输入,金:混叠;金点:共同采样值","reset":"重置","scope":"fs=1000 Hz,单位幅度、零相位余弦,瞬时理想采样,无抗混叠滤波;金线是一个等价基带解释。","scopeLabel":"模型范围与约定"}}
IMU:各观测量怎样约束姿态
加速度计测得比力,可用 f = Rᵀ(a−g) 表示一类常用坐标约定:R 从机体映射到世界,a 是平动加速度,g 是重力向量。静止支撑时模长约为 1g,哪个轴为正或负取决于安装与坐标定义;自由落体理想输出接近零。利用它估倾角,依赖平动加速度相对重力可忽略等条件。ADI:加速度计倾角测量
陀螺仪提供角速度,积分可短时追踪姿态变化,但零偏会累计。恒定 0.1°/s 未校正偏置在 60 s 后可造成约 6° 角度误差;三维运动还需按旋转关系更新四元数或旋转矩阵,不能把三个欧拉角各自随意相加。
观测 能约束什么 主要限制
陀螺角速度 短时旋转变化 零偏、温漂、噪声积分
加速度比力 准静态时的重力方向 平动、振动,不能独自确定绕重力轴的偏航
磁场向量 合适条件下提供航向参考 硬铁/软铁、附近电流、当地磁场与倾角
融合算法利用互补信息并估计误差,不能承诺“九轴就有无漂移绝对姿态”。磁场受扰时强行信任磁力计,可能把航向拉向错误方向;持续加速也可能被误解释为倾斜。需要时间同步、安装轴变换、有效性判断和合理的噪声/偏置模型,而非只更换算法名称。
静止陀螺均值可估计该条件下的零偏;加速度计却不能把三个静止轴读数全部减成零,否则会把重力观测一起删掉。多姿态标定用于区分偏置、比例及轴间误差,温度变化仍可能需要额外补偿。
环境传感器:输出单位不等于全部解释
湿度与温度关联,壳体通风、热源、污染和凝露都会改变测量。芯片校准过,并不表示装进密闭发热外壳后仍能代表室内空气;环境温湿度安装应围绕热隔离与气体交换设计。Sensirion:温湿度设计指南
气压换算高度需要参考气压与大气模型。近海平面、假设密度 1.225 kg/m³,Δh≈−Δp/(ρg),100 Pa 约对应 8.32 m;这只是局部近似,天气造成的压力变化也会被解释成高度变化。某个气压精度不能在所有海拔下直接换成固定高度精度。类似 BME280 的原始数据还需按出厂补偿参数转换,不能把 ADC 寄存器直接当作 Pa 或 %RH。Bosch BME280 数据表
照度 lux 含有人眼光谱加权含义,外壳透光率、光源光谱和入射角都会影响系统结果;输出 lux 的数字传感器也可能需要整机修正。颗粒物光散射测量则依赖粒径、折射率和湿度等条件,“采用激光”不能直接推出质量浓度无误差。
VOC 器件计算出的 CO₂eq/eCO₂ 与直接针对 CO₂ 吸收等物理特性的测量不同。例如 SGP30 明确输出经算法计算的 TVOC 与 CO₂ 等效信号,不能把它当成真实 CO₂ 浓度的通用替代品,也不应拿单个气体指标概括全部空气质量。Sensirion SGP30 数据表
从通信通到结果可信的读取流程
读 ID 只证明一次通信取得了预期识别值,还需要配置并读回量程、输出率和工作模式,等待转换完成,核对状态/CRC,并按规定的连读或锁存机制取得同一帧多字节数据。全零或 0xFF 可能是总线、电源、未转换、配置或真实数据,不能仅凭一种位型确定故障。
解析时明确有符号格式、字节序、单位比例和时间戳,检查溢出、FIFO 丢样与数据陈旧。滤波前保存原始数据和配置,校准则使用已知条件及合适参考,不能默认普通冰水和当地沸水精确构成所有温度计的 0/100°C 校准点。最后把参考误差、安装和重复性一起纳入结果可信范围。
复算模型
from math import exp , log , isclose , sin , pi
r25 , beta , t25 = 10000 , 3950 , 298. 15
r50 = r25 * exp ( beta * ( 1 / 323. 15 - 1 / t25 ) )
v50 = 3. 3 * r50 / ( 10000 + r50 )
r_back = 10000 * v50 / ( 3. 3 - v50 )
t_back = 1 / ( 1 / t25 + log ( r_back / r25 ) / beta ) - 273. 15
assert isclose ( t_back , 50 )
assert 3588 < r50 < 3589 and 0. 871 < v50 < 0. 872
assert isclose ( ( 3. 3 / 20000 ) * * 2 * 10000 * 1000 , 0. 27225 )
assert 0. 9 < 13 * log ( 2 ) * 10000 * 10e-12 * 1e6 < 0. 91
assert isclose ( ( 21 - 1 ) / 2 / 1000 , 0. 010 )
assert isclose ( 0. 1 * 60 , 6 )
assert 8. 32 < 100 / ( 1. 225 * 9. 80665 ) < 8. 33
for n in range ( 20 ) :
assert isclose ( sin ( 2 * pi * 900 * n / 1000 ) , - sin ( 2 * pi * 100 * n / 1000 ) , abs_tol = 1e-12 )
print ( ' NTC 反算、自热、建立时间、混叠、延迟和局部气压高度模型通过' )
上述模型用于区分传感关系、采样和误差来源;实际精度还需用可追溯的参考量校准。
继续查阅