- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8.3用过采样和求均值提高ADC分辨率 模数转换的分辨率与ADC器件的数字位数有关,位数越多分辨率越高,但分辨率越高器件的成本也越高。 C8051F020的片内ADC是12位的,要提高分辨率,只能使用较高分辨率的片外ADC。 本例子介绍用过采样和求均值的方法来提高模数转换的分辨率和信噪比SNR,而不使用昂贵的片外ADC。 但过采样和求均值对SNR和测量分辨率的改善是以增加CPU时间和降低数据吞吐率为代价的。 工作原理 根据奈奎斯特定理所要求的采样频率为奈奎斯特频率: 其中:fm是输入信号的最高频率 过采样能提高测量分辨率。每增加一位分辨率,信号必须被以4倍的速率过采样。 过采样频率与分辨率及采样频率之间的关系如下: 其中:w 是所希望增加的分辨率位数 fs 是初始采样频率要求 fos 是过采样频率 例如一个系统使用12位的ADC,每秒输出一个温度值(1Hz),为了将测量分辨率增加到16位,按上式计算过采样频率 (Hz),即以fos =256Hz的采样频率对温度传感器进行过采样,在所要求的采样周期内收集到足够的样本,对这些样本求均值便可得到16位的输出数据。 将256个连续样本加在一起然后将总和除以16或将总和右移4位,这样得到的结果是16位的有用数据。 本例子还是用C8051F020片内100ksps12位ADC对片内温度传感器进行16位过采样和求均值,并将16位精度的测量值从硬件UART输出。 过采样率为256,将256个连续的ADC样本累加到变量accumulator中,在完成累加后再将accumulator右移4位并将结果存入变量result中,在得到计算结果后accumulator被清0,准备进行下一次计算。 程序中对ADC样本的累加是在完成ADC转换的中断服务程序ADC_isr中进行的。 使用过采样和求均值技术将对温度传感器的测量精度从12位提高到16位,对温度测量中的分辨率提高进行一下比较,片内温度传感器的满度输出略小于1伏,假设使用2.43V的参考电压Vref,可以计算对于12位和16位测量的代码宽度和温度分辨率(可测量的最小温度变化)。 温度每变化一个摄氏度片内温度传感器的电压将变化2.86mV,在使用2.43V的Vref、且PGA增益为2时12位测量的电压分辨率是: 12位测量的温度分辨率(每个ADC码所代表的摄氏度数 )是: 用过采样和求均值技术使有效位数增加到16位时,新的分辨率计算如下 : 16位测量的温度分辨率(每个ADC码所代表的摄氏度数 )是: 在采用过采样和求均值技术的情况下用同一个片内12位ADC可以测量的最小温度变化是0.007摄氏度 如果一个ADC的最大采样速率是100ksps,在不采用过采样和求均值技术的情况下,可以得到100ksps的输出字速率。 如果采用过采样和求均值技术数据吞吐率将降低到初始值除以4w(w为增加的分辨位数)。 在上面所提供的例子中4w为256,输出字速率将是100ksps/256=390个样本/秒(390Hz)。 增加分辨率需要增加采样速率和计算时间,在每个采样周期(1/fs)内CPU的带宽将降低。是以牺牲吞吐率和降低CPU带宽为代价的。 程序代码 void main (void) { long temp_copy; int temp_int; // 温度的整数部分 int temp_frac; // 温度的小数部分(以百分之一度为单位) WDTCN = 0xde; // 禁止看门狗定时器 WDTCN = 0xad; SYSCLK_Init (); // 初始化振荡器 PORT_Init (); // 初始化交叉开关和GPIO UART_Init (); // 初始化UART TIMER3_Init (SYSCLK/SAMPLE_RATE); // 初始化定时器3以采样速率溢出 ADC_Init (); // 初始化ADC ADCEN = 1; // 允许ADC result = 0L; // 初始化温度变量 EA = 1; // 允许全局中断 while (1) { temp_copy = result; // 取最新的ADC结果,将ADC代码转换为温度 temp_copy -= 0xa381; // 将偏移量校正为0度对应0V temp_copy *= 0x01a9; // 2.86mV/摄氏度(0.0065℃/code,还没除216 ) temp_copy *= 100; // 将结果转换成百分之一摄氏度 temp_copy =
文档评论(0)