由于DAC的输出可能会经过电阻分压、经过加减法器运算之类的,所以很多时候在它的后级会加上电压跟随器,以增加输入阻抗、减小输出阻抗;使用ADC时,也同样经常会使用它来处理信号。
在使用LM358搭建电压跟随器时,我遇到过输入电压接近零点而输出电压保持在0.6V以上的情况,从网上了解到这并不是个别现象,而是经常出现,有人给出的解决方法是使用正负电源供电,或者加下拉电阻。但是LM358的技术手册描述,它的输出电压摆幅在0V附近时并没有问题(技术手册上提供的最低输出电压典型值为5mV),同样有人做过实验,确实表现非常好。那这个0.6V到底从哪里来呢?难道买到的LM358是假货吗?
为了找出问题所在,首先根据下面的原理图,使用实验板搭建出电路:
第一步:电位器的输出从0V~+5V,无论抽头是悬空还是接到5pin,IC5A的1pin输出电压摆幅为0V~+3.8V,这说明第一个电压跟随器工作正常;
第二步:1pin的输出为0V~+3.8V时,无论它是悬空还是接到ADC引脚,IC5B的7pin输出电压摆幅为0V~+3.8V,这说明第二个跟随器也工作正常,前一个电压跟随器接到后一个电压跟随器是没有问题的。
第三步:此时把一个10K的电阻接入ADC引脚做上拉,IC5B的7pin输出电压摆幅为0.7V~+3.8V;当更换这个上拉电阻为1K时,IC5B的7pin输出电压摆幅为+1V~+3.8V;当更换这个上拉电阻为50K时,IC5B的7pin输出电压摆幅为+0.6V~+3.8V;当更换这个电阻慢慢接近于0欧姆时,IC5B的7pin输出电压慢慢接近VCC。
为了进一步验证上拉电阻的影响,将这个运放的输出接到STM32F103RBT6的ADC引脚上,此时发现,当ADC的引脚设置为GPIO_Mode_AIN时,运放的输出摆幅正常;而当ADC的引脚设置为GPIO_Mode_IPU时,出现了上面的输出摆幅+0.6V~+3.8V的情况。通过查询STM32F103RBT6的技术手册知道,当IO口设置为上拉时,会使能内部的弱上拉电阻,大约40K欧姆。这一现象刚好符合上面的分析。
再进一步验证,将运放的输出从ADC断开,直接加上50K的上拉电阻,会发现它的输出摆幅有同样的变化。
由此可见,LM358运放的输出对上拉电阻敏感,但这是为什么呢?难道运放输出不应该是不受负载电阻影响吗?为什么加上拉电阻之后输出会出现错误,而加上下拉电阻又完全没有问题呢?为了搞清楚这个,有必要把俺这本尘封已久的《模拟电子技术基础》拿出来了!
这是LM358的芯片内部原理图,来自ON Semiconductor公司的LM358技术手册,它和《模拟电子技术基础》书中F324的原理图非常类似:
首先,最右侧的灰色部分是一个恒流源,用于给整个电路提供恒流偏置,Q19、Q16、Q15因为集电区面积的不同而构成了不同比例的电流源,Q8和Q10构成了镜像电流源,给末级提供静态电流;
其次,最左侧是一个双端输入单端输出的共集共射差分放大电路,Q3和Q4是有源负载,将Q18的集电极电流变化转换成输出电流,接到Q5;
然后,中间是一个共集共射放大电路,具备很强的放大能力;
最后,靠右部分是射极输出电路,25欧姆的电阻和Q12一起构成了正向电流保护,正常工作时Q12截止,Q10上有50uA的偏置电流,而Q11处于截止状态,Uo=U9c-U14be-U13be-Ur;正常情况下,Q11应该处于截止状态,因为Q9的集电极电位比Q11的发射极电位要高;当上拉电阻接入时,(由于Q9集电极电位接近零点,Q11发射极被拉高,所以Q11被打开,Uo为Q11的EB电压,约为0.7V左右,而0.7V反馈接入正向输入引脚,又使得Q9的集电极电平保持零点,当输入电压大于0.7V时,Q9的集电极电平会接近VCC,并且在负反馈的作用下重新达到平衡,???)破坏了射极输出电路的负反馈,因此零点附近的信号被钳位到0.7V左右。
要验证这一点,将LM358的深度负反馈去掉,而直接使用开环放大。发现当没有上拉电阻时,U+=VCC,U-=1.5V,则Uo=+3.8V;而U+=0V,U-=1.5V,则Uo=0V;当使用了上拉电阻,U+=VCC,U-=1.5V,则Uo=+3.8V;而U+=0V,U-=1.5V,则Uo=0.7V。更换不同阻值的上拉电阻,现象几乎一样。
so,结论:LM358的输出摆幅符合技术手册的描述,在接近零点的范围内依然表现良好;而在它的输出端使用上拉电阻会影响它的工作。