完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在编写AD采样程序,根据样例程序编写了一个小程序、,结果貌似能够采样。但是不准确,而且好像连最基本的原理都不太明白。下面是我编写的一段采样程序:用的是单端输入,ADC0,连续采样模式
while(1) { //取ADC_0 ADCSRA=0x00; ADMUX=0x40;//选择AVCC作为ADC参考电压,ADLAR=0右对齐,选择ADC0作为输入通道,单端输入 ADCSRA=(1< adc_l0=ADCL;//先读取低八位 adc_h0=ADCH;//再读取高两位 temp0=adc_h0<<8|adc_l0; temp0=temp0>>1; //放弃一位的精度 temp0-=20; //修正 //adc_data0[0]=(uchar)(temp0); //f=(float)(temp0); // f=f*5/1024; // temp0=(uint)(f); //显示ADC0 ten_3=(temp0)/100; ten_2=(temp0-(ten_3*100))/10; ten_1=temp0-(ten_3*100)-ten_2*10; ten_1+=0x30;//转换成ASCII码。 ten_2+=0x30; ten_3+=0x30; adc_data0[0]=ten_3; adc_data0[1]='.'; adc_data0[2]=ten_2; adc_data0[3]=ten_1; adc_data0[4]='V'; Lcd_linedisp(adc_data0,2);//显示采样结果 for(i=0;i<18;i++) { s_ms(15000); } } } 红色那两句最为不理解了,不知道为啥要右移一位,那岂不是除了一个2吗!那精度降低了很多呢,如果输入为接近AVCC,那输出岂不是减半了吗!还有为什么要减去35,修正?奇怪的是,这样处理的显示结果竟然和实际的输入差不多,只是误差有点大,输入模拟电压越高则误差越小,一般为0.4~0.2V。真的是不明白》。。。 紫色的那四句是我编的,我觉得这才是真正的采样转化结果,temp0储存的只不过是采样的二进制值而已,根本不是转化值。 各位帮帮吗忙呀,先谢谢了!!! |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5130 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7772 浏览 0 评论
3033 浏览 2 评论
3107 浏览 1 评论
10061 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 21:24 , Processed in 0.634939 second(s), Total 46, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号