M8的ADC转换后的结果为什么是除1024,而不是1023
手册中计算实际电压的公式为:ADC = Vin*1024 / VREF,则实际电压Vin = ADC*VREF / 1024
为什么不是1023呢?
10位对应最大值为0x3ff=1023,该值对应的即是VREF的值
最小值时为0,该值对应的是0V的值
按此看的话,Vin=0+(Vmax-0)(Dx-0)/(1023-0)=VREF*Dx/ 1023
其中Vmax=VrefDx=ADC,采集到的数字量 16 进制应该除以15 吗? 一共1024份嘛。。。 当然是 1024 当然是1023不要想当然。 呵呵,你当0不是数啊? 0~1023,共1024个值,楼主你想想C语言里数组的定义方法也是这样的:
unsigned char A;
A=0x11; --正确
A=0x22; --正确
A=0x12; --正确
A=0x23; --错误 假设VREF=2.56V,如果是除以1024,那么当输入电压此时为2.56V时
计算得到的电压应该是Vin=1023*2.56/1024=2.5575V 与2.56V相比就会产生误差
如果是除以1023,则Vin刚好是2.56V ,因此,我认为还是1023
另外,附一般的AD转换器的标度变换公式,来自ADC0809 手册:
Vin/(Vfs-Vz)=Dx/(Dmax-Dmin)
Vin为输入电压,Vfs为满量程电压,Vz为零电压 ,Dx为所测得的数字量,Dmax为最大数字量,Dmin为最小数字量
在测控原理中看到的标度变换公式也和上面相同 假设VREF=2.56V,如果是除以1024,那么当输入电压此时为2.56V时
---------------------------------------------------------------
ADC转换值最高是1023,换句话说,可准确测量最高输入电压是2.5575V,
2.56输入超标了,计算有误差是应该的。 学习了。觉得lz说的有道理!
特意查了ds:http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_513829.JPG
(原文件名:1.JPG)
上面写的Vin量程是0- Vref的 ,感觉ls说的不太对哦。这个问题,我同意lz的说法,应该是除以1023. Vin = ADC*VREF / 1024 是去掉了小数部分,感觉可以用四舍五入,更精准一点。即 Vin = (ADC+0.5)*VREF / 1024 或 Vin = ADC*VREF / 1024 + Vref/2048。有些ADC在硬件上叠加了1/2LSB,不应AVR的有没有? 手册的公式大概这么理解吧:
为了好说明,先做个假设,假设参考电压不是2.56V,而是1.024V,输入电压为Vin,转换后的数字为ADC
那么按手册的说法,就是:
Vin < 0.0010V时,ADC=0
0.0010 <= Vin < 0.0020V时,ADC=1
...
1.0220 <= Vin < 1.0230V时,ADC=1022
1.0230 <= Vin 时,ADC=1023
所以你可以认为1.024V为1024,但转换器不能表示,只能表示为1023,
就算是1.240V也是表示为1023. 顶 你要把量化值0当成一个区间来看,同理1,2,.... 1023 ,一共有1024个区间,所以要除以1024 . 量化有两种方式,参见下图:
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_513865.jpg
(原文件名:量化.jpg) 手册的公式大概这么理解吧:
为了好说明,先做个假设,假设参考电压不是2.56V,而是1.024V,输入电压为Vin,转换后的数字为ADC
那么按手册的说法,就是:
Vin < 0.0010V时,ADC=0
0.0010 <= Vin < 0.0020V时,ADC=1
...
1.0220 <= Vin < 1.0230V时,ADC=1022
1.0230 <= Vin 时,ADC=1023
所以你可以认为1.024V为1024,但转换器不能表示,只能表示为1023,
就算是1.240V也是表示为1023.
-----
明白了,谢谢 谢谢各位,看来这是由量化误差引起的 留个 爪子 爪子 make一下 终于弄明白了,这个简单却不简约~
页:
[1]