请教一下,AD 转换结果狂跳的问题

2019-03-24 20:35发布

  1. uint mega16_ad()
  2. {
  3.          uint addata;
  4.          DDRA=0X00;
  5.          PORTA=0X00;
  6.          cli();
  7.          ADMUX        = 0x00;
  8.          ADCSRA=0x87;
  9.          ADCSRA|=BIT(ADSC);
  10.          ACSR= 0x80;
  11.          SFIOR |= 0x00;
  12.          while(!(ADCSRA&(BIT(ADIF))));
  13.          addata=ADCL;
  14.          addata=addata+ADCH*256;
  15.          ADCSRA|=BIT(ADIF);
  16.          ADCSRA=0X00;
  17.      sei();
  18.          return addata;
  19. }

  20. void port_init(void)
  21. {
  22.          PORTA = 0x00;
  23.          DDRA  = 0x00;        
  24. }
  25. void init_devices(void)
  26. {
  27.          port_init();
  28.          MCUCR  = 0x00;
  29.          MCUCSR = 0x80;//禁止JTAG
  30.          sei();//开全局中断
  31. }



  32. int main(void)
  33. {
  34.          uint i;
  35.          uchar ad0[4]={0,0,0,86,86};//初始值
  36.         init_devices();
  37.          LCD_init(); //LCD初始化
  38.         LCD_clear();//清屏
  39.         DDRD  =0xff;               
  40.          while(1)
  41.          {  
  42.          int xx=mega16_ad();
  43.          itoa(xx,ad0,10);// int to uchar
  44.          for(i=0;i<=4;i++)                                        //显示转换的数值
  45.                 {                                                                                                                                                                                                                                                                                                                                                                                 
  46.                          LCD_write_char(i,0,ad0[i]);  
  47.                          _delay_ms(10);
  48.                  };        
  49.                  _delay_ms(10);
  50.                  LCD_write_str(0,1,"yes?+2");//第二行显示
  51.                 PORTD =0xcd;//点亮LED
  52.          }
复制代码初学单片机,看着手册设定的各个寄存器,现在AD转换的结果在400~500之间狂调,用的外部参考电压5V也不至于这样吧,
还有一点不理解的,ADCH+ADCL,应该显示在0-255之间,怎么会一直显示400~500呢?
硬件环境是在X宝买的M16最小系统,看原理图AVCC aref连在一起的。
求大神指点一下,上述不妥之处无喷,毕竟谁都有第一次吧。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
youluo
1楼-- · 2019-03-25 04:16
一般用参加都不直接接电源而是另外的基准源会更好一点。另外你采集的电压是不是也变化呢。还有跳很正常。但你的这个值跳得幅度很大。你采集个几十次然后取均值。再显示。试试看。看均值是不是也变化还是那么大。
exiao
2楼-- · 2019-03-25 07:09
 精彩回答 2  元偷偷看……
白丁
3楼-- · 2019-03-25 10:32
你采的电压可能就不稳,最好把电路贴出来看看
zqdl8
4楼-- · 2019-03-25 12:14
额,现在我对数据不处理,直接显示ADCH+ADCL。数据居然可以从100-1023,神啊,求帮助
zqdl8
5楼-- · 2019-03-25 13:09
原帖由 白丁 于 2013-11-14 23:28 发表
你采的电压可能就不稳,最好把电路贴出来看看

我把原理图贴上来了,帮我看看,谢谢指点。
zqdl8
6楼-- · 2019-03-25 17:42
输入端我没做滤波,直接拉的5V,现在情况是,adc0如果接5V的话显示1023,数字也稳定。没有输入的话,居然可以0-1023的调,呃呃呃,无语了,感觉应该是滤波的问题,要是滤波的话,该怎么选择电容呢?

一周热门 更多>