不久前,我发表了一个基于自热达林顿晶体管对的热风速传感器的简单设计实例。如图1所示,由此产生的传感器简单、灵敏且为固态,但存在风速响应严重非线性的问题。
图1 热传感器的Vout对风速的响应非常非线性。
资深设计实例贡献者Jordan Dimitrov为该问题提供了一个优雅的计算数值解决方案,使最终结果几乎完美线性。他在《恰当的函数可将热晶体管风速计线性化,让误差小于0.2%》一文中详细介绍了这一方法。
然而,模数转换后在数字域中执行线性化的结果是所需ADC分辨率大幅提高,例如从11位增加到15位,原因如下……
要采集分辨率为1fpm的线性0至2000fpm风速信号,需要ADC分辨率为1 in 2000=11位。但观察图1的曲线可以发现,虽然风速信号的满量程跨度为5V,但从1999fpm增至2000fpm相关的信号增量仅为0.2 mV。因此,为了在解决后者问题的同时保持前者的量程,需要的最小ADC分辨率为:
1 in 5 / 0.0002 = 1 in 25,000 = 14.6位
15位(和更高分辨率)的ADC既不罕见,也不是特别昂贵,但它们通常不是微控制器内的集成外设,正如Dimitrov先生的文章中提到的那样。因此,提供一个分辨率足以满足他的设计要求的ADC可能需要大量成本,这似乎是合理的。所以我想知道可能存在有哪些替代方案。
下面是一个简单而廉价的高分辨率ADC设计,它是围绕一个古老、廉价而又广泛使用的朋友构建的:555模拟定时器芯片。
原理图见图2。
图2 适用于自加热晶体管风速计线性化的高分辨率电压-时间ADC。星号表示精密元件(1%公差)。
信号采集从R2、R3、U1求和网络开始,将0至5V输入信号与U1的2.5V精密基准信号相结合,形成:
V1 = (Vin + 2.5v)/2 = 1.25到3.75v = (0 to 3) * 1.25v
V1在转换周期之间积聚在C1上,时间常数为:
(R2R3/(R2 + R3) + R1)C1 = 1.1M * 0.039 µF = 42.9 ms
因此,要达到16位精度,需要的最小稳定时间为:
42.9 ms LOGe(216) = 480 ms
如图3所示,可以通过向555 Vth(阈值)引脚6输入CONVERT命令脉冲(幅度大于2.5V,持续时间大于1μs)来启动实际转换周期。
图3 ADC周期以CONVERT Vth脉冲开始,该脉冲产生持续时间为Tout = LOGe(V1 / 1.25 V)R1C1的OUT脉冲。
OUT脉冲(低真)从CONVERT的上升沿开始,与555 Dch(放电)引脚7被驱动至零伏相吻合,开始将C1从V1放电至555触发电压(Vtrg=Vc/2=1.25v),在引脚7上。C1放电持续时间和Tout由合适的微控制器以数字方式累加,16位计数器和1μs分辨率就足够了,计算公式如下:
Tout = LOGe(V1 / 1.25 V)R1C1 = LOGe(V1 / 1.25 V) 1M * 0.039 µF
= LOGe((Vin + 2.5 V) / 2.5 V) 39 ms
= LOGe(1) 39 ms = 0 for Vin = 0
= LOGe(3) 39 ms = 42.85 ms for Vin = 5 V
Tout结束时,Dch被释放,C1可以开始充电,转换结果:
(N = 1 MHz * Tout)
可用于线性化计算。解码和恢复Vin的数学公式如下:
Vin = 2.5 V (EXP(N / 39000) – 1)
你们可能会有一些疑问。之前我说过,要量化1999至2000fpm之间的Vin增量需要14.6位的分辨率。那么,42850=15.4位是什么东西呢?
42850的情况是由于C1放电曲线的瞬时斜率(变化率=dV/dT)与R1两端的电压成正比,因此也与通过R1的电流成正比。对于Vin=5V的满量程输入,该参数变化了3倍,从转换周期开始时的V1=3.75V和3.75µA变为转换周期结束时的1.25V和1.25µA。dV/dT的增加会导致分辨率成比例但相反的变化。因此,为了在Vin=5V时实现所需的25000:1分辨率,需要更高的平均分辨率。
必要的分辨率系数是平方根(3)=1.732…其中42850/25000=1.714是一个粗略的近似值,但已经足够。
(原文刊登于EDN美国版,参考链接:15-bit voltage-to-time ADC for “Proper Function” anemometer linearization,由Ricardo Xie编译)