TI中文支持网
TI专业的中文技术问题搜集分享网站

关于ADC第11通道电压测量的误差问题

首先误差存在么?哪些因素影响?

我那个EZ430-Chronos手表,发现电池电压显示不准,用 eZ430-RF Debug Interface供电,用万用表测量电压和手表显示电压相差还是比较大的(考虑到了手表内部软件的平滑延时,例如10分钟以后的稳定显示电压,我怀疑生产校准的时候说不定很有可能没考虑到这个因素呢,就会导致出不正确的校准数据写入了InfoD,导致以后的显示稳定值偏大),查CC430F6137的数据手册,AVCC divider at channel 11,分压比是有误差范围的。这个分压比不可能是准确的2:1,那么怎么校准?手表软件的校准只是在计算得到的显示结果直接加一个常亮数值,这样的校准方式行么?应该是校准斜率吧?好像没看到芯片中有用于校准11通道的校准数据,有么?

有没有处理这种误差的例子?特别是能够优化计算开销的例子。这个对于电池直接供电的时候还是有点重要性的吧?

 

Triton Zhang:

画个图给你看下就明白了:

 

图中绿色部分是理想状态的1/2的分压得到的电压曲线,红色部分是实际分压得到的曲线。

纵轴是电压值,横轴是采样值.

从图中可以看出,红色和绿色的斜率是一样的。

所以校准的时候没必要较准斜率,斜率的实际意义是 1V电压/采样最小单元.

实际校准时只需要校准到1/2的分压误差就行了,也就是校准OFFSET就可以了。

Fuchong Wang:

回复 Triton Zhang:

这个…

随手发出去后,我也冒出过是否闹了笑话的担心。说实在的,我感觉我在类似于这类转弯的问题上脑筋不是很灵光和快速。(当然,不一定就是承认我整体的脑袋就是笨,一般闹着玩的智商测试游戏记得好像有120还可能超过的吧,应该不能算笨了,即使整体笨,也不一定就要公开,能不丢面子就不丢面子嘛)

举特例,夸张的

以为是2:1的分压,设ADC转换出的电压为Vadc,设显示电压为Vdisp,第一步,假设ADC是理想的或者碰巧正好是线性理想无误差的。

那么应该:

Vdisp=2*Vadc ,软件中应该是这样计算的

但是夸张的假设,分压比不是2::1,而是4:3,现在假设实际电压就是4V,那么Vadc实际应该是3V,这时如果按照Vdisp=2*Vadc计算,则Vdisp为6V,这时,加入了校正offset=-2,即计算公式变成了

Vdisp=2*Vadc-2

这时,如果实际电压是4V,那么Vdisp=2*Vadc-2=2*3-2=4,显示电压经过校正和实际电压无误差了

现在假设,实际电压夸张点说,变成了2V,那么实际Vadc应该为2*3/4=1.5,代入公式Vdisp=2*Vadc-2,则Vdisp=2*1.5-2=1,实际电压为2V,显示电压却为1V了。

如果ADC为非理想的,情况就复杂一点,不过通过以上,这个特例不能排除,所以继续证明就没有必要了。

上面以具体数值证明的 ,归纳一下;

第一步:假设adc理想,分压比有误差,假设实际分压比为a

初始软件计算公式:

Vdisp=2*Vadc

设实际电压为Vtrue

则:

Vdisp=2*Vtrue/a

这时要使Vdisp=Vtrue,引入校正offset

Vtrue=2*Vtrue/a+offset

在电压Vcal时校准,则:

offset=(1-2/a)*Vcal

最后:

Vdisp=2*Vtrue/a + (1-2/a)*Vcal

这时只有实际电压Vtrue等于Vcal时 ,Vdisp才等于Vtrue

曲线我就不画了。

第二步,假设ADC非理想

第一步通不过,第二步太费 我脑细胞了,就不弄了。

 

不知道对不对,别钻进牛角尖闹了更大的笑话

Triton Zhang 也许可能没多想没知道手表软件的具体处理方法?

Triton Zhang:

回复 Fuchong Wang:

你的专研精神很值得肯定,当还欠缺一些经验。从你的第一个问题我也没多想就回了,犯了经验主义错误。这里我就详细讲下我的理解。<纠正一下楼主,我对手表的软件处理方法很清楚,而且我认为没有问题>

1. 我们平时讲的ADC误差其实有两类,一类是偏移误差,一类是斜率误差。简单来讲偏移误差就是当实际电压为零时,ADC采集到的数并不是零,这样的误差是不会累计的。第二类的误差就是我们实际电路的分压电路种各种器件精度造成和理论值的误差,这类误差就是你说说的斜率误差。

2. 针对这两类误差我们一般的做法是抓大放小,所谓大就是往往偏移误差带来的影响要大于斜率带来的影响,而斜率造成的误差,我们一般是通过增加分压电路器件的精度来解决的,例如采用1%精度的电阻作为分压电阻,这样采样的结果就是1%的误差,正对电池电压来讲,不到0.04V。你之所以陷入了上面的困惑,就是只关注了斜率带来的影响,并把他扩大化了。

3. 针对偏移误差,我们通常的做法是做校准,最简单的办法就是测试零点的值,更科学和可靠的做法是选取N个不同的点来测试,取平均值。注意:在校准的时候,不考虑斜率带来的误差。

4. 手表的电压测试采用的芯片内部11通道ADC,这个通道的电压是AVCC-AVSS/2。经过计算之后,在计算值上增加了一个sBatt.offset的值,这个值就是我讲的便宜误差的校准值。这个值在上电的时候从INFO的FLASH区域读出来的,所以如果你的实际测试值和ADC的采样值相差较大的话,我估计是你INFO内部的数据被擦写了。如果不出意外,这才是真正影响你监控电池电压误差较大的原因。

 

 

Fuchong Wang:

回复 Triton Zhang:

 

1,首先,我确实缺乏经验,而且还只能算是一个入门阶段的。这也是我看EZ430-Chronos源码的原因之一,软件结构不算太小了,学习呀。不过您说我“当还欠缺一些经验”一般认为其中的“当”就是“但”字的误写吧,能不能这句话可以有别的说话语句方式说既说明了对我的看法又不刺激别人的自尊心呢?虽然我自认为是一个务实的人,我一般对别人说我的不好不会对别人有一点意见的,平时都是很无所谓,除非别人是恶意的这样说(尽管是事实)。不过您在这里可能不像我仅仅作为一个个人,您代表的是一个团体吧。当然,我还是认为,对技术人员(管理技术人员的也可以作为技术人员的范畴吧)是在这方面不必介意和较真的,相反,我还是喜欢技术人员的说话直率,人哪有那么全面的呢?真正专业技术特牛的很可能就会说话不那么圆滑,我有点相信人的大脑是平衡的,当然这只是概论。这里只是想到了提一下,我这个人就是喜欢议论,但无恶意。

2.确实,我好像是有点经常抓小放大的毛病。不过

这次我是回答您的第一个回复的,说实在的,您的第一个回复我当时没看懂。

对于影响程度,我还是想到的,不过确实我没有具体带入数值计算,我这个人有时候确实懒,那是能做到的但是有点烦罢了,发帖的原因,就是想快速知道答案。我往往同时在做不同的事情,当然这段时间花在手表软件的时间相对多。

手表的显示分辨率是多少?那么,按照经验值,误差应该允许多少?

3.我收到的手表,第一次开机,我没有改动任何软件,温度显示比实际温度低5度左右,时间准确性低于我的预期,使用一段时间以后怎么发现到现在电池电压还有3.14V(我多次使用过无线功能,并且经过多次无线更新软件),经过比对,比实际电压大近0.2V,当然我的万用表可能是有误差的,但是我的表以前经过测量普通集成电路的电压基准,误差还是不大的。当然,也许是我这个手表的个别现象,我没有发帖问别人的手表情况,虽然国内好像不多,但还是看到帖子有人有的。

4.我第一次读一遍您的第二个回帖的时候,竟然把您说“我估计是你INFO内部的数据被擦写了”不知道怎么看成了“大概info数据当初写错了”的意思,后来发现不是这个意思,我还想我在哪里看到当初写错了的感觉呢?有稍微仔细在您的回帖中查找了一下。我很早就养成了创建或者打开一个新工程就检查设定擦除方式,一般只擦除主FLASH,即使真的要擦除info(这种情况好像很少,通过cpu软件内部擦写),也是操作完了就改回。手表里的infoD我一次没有擦除或者改写过,再说,手表里的infoD的数据我是查看过的,并且备份有图片的。附上图片。

 

 

可以看到电压的offset值为7,即使被擦除了,那么软件中默认初始值是多少?是-10,而我的手表显示是偏高的。即使把offset=7这个因素扣除掉,我的电压显示还是误差较大的,这是为什么呢?对于12位的ADC,本身转换真的可以抓大放小了,那是什么引起的?是参考电压和分压比的误差?是偏移误差么?

5.我很长一段时间了避免直接提及质疑,我没有发帖问别人的手表情况,我发帖问过CR2032的正常使用电压没有提及为什么要问。当然由于率直的本性,有时候还是忍不住说出点什么来。

 

6.手表软件就一定是完美的么?如果我有能够精确测量低功耗的设备,我还真想试试这个软件在兼顾低功耗的同时就是完美的了。我实话,我的脑筋和现在知识和经验,不敢乱说,但是毕竟是个开发工具不同于非常正式的产品,我怀疑就是那么完美。

 

由于图片不能在一个帖子中上传多幅,下帖继续

 

Fuchong Wang:

回复 Fuchong Wang:

 

现在来具体看一下:

首先看看datasheet的分压比误差,如图:

 

 

我们取最大0.52,这个不好说什么为什么要取最大吧

代入我之前的公式得到:

Vdisp=2*0.52Vtrue+(1-2*0.52)*Vcal

假设在3V校准,Vtrue=3,Vcal=3,则显示电压Vdisp=3无误差

那么在手表低压报警阈值2.4V显示电压多少呢?

Vdisp=2*0.52*2.4+(1-2*0.52)*3=2.376

不知道能不能四舍五入,相差显示分辨率两个单位,0.02,是很小,那么考虑到电压基准的误差,如图:

取最大值1.5%,再加这个误差不是在2.0V基础上的,是在1.93V基础上的,又是百分之多少呢?我不想算了,能直接告诉我答案么?

这个误差能和分压比误差直接相加么?那么总计又是百分之多少呢?能直接代入上面的公式计算么?

我不知道显示误差允许多少,就算是要说这也是允许的,那么这些误差是偏移误差么?偏移误差到底是什么引起的?多大?12位ADC的误差手表软件中要offset,那么分压比要不要考虑?怎样考虑,按照偏移考虑还是斜率考虑?

 

Fuchong Wang:

回复 Fuchong Wang:

补充图

 

 

Triton Zhang:

回复 Fuchong Wang:

楼主能从一个问题上思考这么多很值得肯定。我说你欠缺经验并没有其他意思,在理论研究和实际应用中都会去找平衡点,请你不要误解。另外我所说的抓大放小是指我们平常设计过程中对ADC误差的处理,并不是针对你。

在一般的应用中,电池电压检测和我们平时做的ADC采集有一定差别,电池电压检测并不需要太精确,这是为什么手表的软件只做了偏移出差校准的原因。如果楼主处于学习的目的,想要精益求精,保持上面的探索精神是有必要的。

回到开始那个问题,为什么在对电池检测时可以对精度放松呢? 理论上的电池放电曲线是缓慢平滑的,但实际上在低功耗的情况下电池的放电曲线并不是单调的,特别是在电池快放电结束时会有较大的反弹。所以,我们对电池的监控往往只是看其趋势。具体在什么点报警,什么点关闭其他功能都不是一个需要特别确定的。而且不同的电池和同个产品的的不同批次都会有较大的误差,所以,电池电压监控是不需要太高精度。这也是为什么在手表的例程中,并未去处理分压比带来的误差。因为去校准那个误差会计较麻烦,对批量生产的产品来讲,省去一些工作量来获得一个相对可接受的结果这是合理的,这也是为什么我认为代码没问题的原因。其实,如果楼主有心的话,可以看到在对电池电压监控时,代码并未对ADC的值去除4096.而是直接除了一个41(单位原因),而在对温度取样时,ADC的值是直接去除4096的。这也是因为代码的开发者在处理不同应用时会去考虑代码的复杂和结果的一种取舍。

Fuchong Wang:

回复 Fuchong Wang:

实际上,估计您的意思就是用offset进行一定程度的补偿并且这个结果还是可以接受的,在一定的区间之内,例如2.4~3.3V,校准电压取中间值或者保险取2.4。那么您应该说一下大致原理和大致的误差范围到底是多少呀,说明白了不就结了么?

另外,顺便想到问个问题,像手表这种软件是哪里的人员编写的?我一直以为是老外。不会现在都是中国人了吧?其实即使有点小问题,也没什么了不起的,特别是像一个人编写的,更没什么了,哪有一点错不出的,这也不是严格的手表,像这里讨论的问题,也不一定就是有问题,就是有问题也不一定就是严重的问题,没回答清楚而已。像前两天我看到好像英文手册中还有比较严重误导人的错误,除非是别人在帖子中故意误导我或者故意顺着我说话(如果不顾事实那也是误导我呀)

Fuchong Wang:

回复 Fuchong Wang:

我在发上一个回帖的时候Triton Zhang 还没有之前的回复,发出了上一个回帖浏览器自动刷新显示页面的时候恰巧看到了Triton Zhang 的新回复,呵呵,和我的帖子意思差不多呀,我回上一个帖子的时候还没看到Triton Zhang 您的新回贴。

还是要谢谢Triton Zhang ,尽管没有那么节省我的时间而得到答案

Triton Zhang:

回复 Fuchong Wang:

继续上面的回答,我之所以开始怀疑你的校准区出错了,是因为你在第一个帖子里讲到误差比较大。按照我的理解,如果要发生很大的误差,很可能就是校准去被擦除了。

我们来看一个图,这个图也许你在课本上是看不到的,但在实际应用中经常采用。

其中红色的是理论的值,绿色是实际的值,蓝色是校准后的值。

可以看出,在对精度要求不高的应用场合,我们很少去对斜率校准,取代的是通过偏移量的测量,来获得一个相对合理的偏移误差。最后蓝色的值较为接近红色即可。

这是因为误差校准中,校准斜率会相对困难,而且各个器件都要校准,每个器件的误差都不一样。另外,斜率在变化较小时,会引入浮点运算,这样的操作很多时候都是得不偿失的。

 

赞(0)
未经允许不得转载:TI中文支持网 » 关于ADC第11通道电压测量的误差问题
分享到: 更多 (0)