登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

初学AVR,大家帮我看看ADC的问题

作者:sunhorse 栏目:单片机
初学AVR,大家帮我看看ADC的问题
第一次接触AVR,做一个AD采样的小程序。程序如下。

程序是在双龙程序的基础上写的,采样采用查询方式。

我看了几遍程序,感觉应该没有问题。

问题

有一次运行程序,采了几次电压,发现ADC的转换结果随着电压的变化而成比例的变化。

但是过了一会,采样结果就不变了,不管外部电压怎么变化,采样的结果都不变化。

另外,我选择内部振荡器,8M.




// 在此处包含所有通用头文件                                          
#include "iom8v.h"

#define uCHAR         unsigned CHAR  
#define uint          unsigned int   
#define uLONG         unsigned LONG


#define ADC_ChANEL        5
uint adc_rel;

//ADC初始化
void adc_init(void)
{
      //PortC 配成 输入/上拉无效===========三态(高阻)
     //PORTC 用做ADC的输入口
      DDRC=0x00;
      PORTC=0x00;
     
     //初始化ADC控制和状态寄存器
     //ADEN=0,ADC is disable
     //ADSC=0,ADC start is disable
     //ADFR=0 ADC Free Running is disable
     //ADIF=0 ADC Interrupt flag is clear
     //ADIE=0 ADC interrupt enable is disable
     //APS2 APS1 APS0 are clear,and SELECT OSC/2
     ADCSR = 0x00;
     
     
     //初始化ADC多路复用器选择寄存器
     //REFS1 REFS0 =01  Slect AVCC as reference voltage
     //ADC_CHANEL       the channel is SELECT
     //ADLAR=1          Left adjust
      ADMUX =(1<<REFS0)|(ADC_ChANEL&0x0f)|(1<<ADLAR);
     
     //关闭模拟比较器
      ACSR  =(1<<ACD);
     
     //配置ADC控制和状态寄存器
     //ADEN=1  ADC is enable
     //ADPS2 ADPS1 ADPS0 is 110  OSC/64
      ADCSR=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1) ;
}



//设置延时时间
void Delay()
{
     uLONG TEMP;
    
    TEMP=10000;
    
    while(TEMP--)
    {
       ;
    }
}

/*
**********************************************
void AD_Read()  读取模拟数字转换器
**********************************************
*/
void AD_Read()
{
      //启动ADC
     ADCSR|=(1<<ADSC);
     
     //等待转换结束
     //when ADC is busy ADSC is 1,When finish,ADSC is 0
     
     while( (ADCSR&0x40)==0x40  )
     {
              ;
     }
     
     //读取转换结果
      adc_rel=ADC&0x3ff;
     
     //初始化ADC多路复用器选择寄存器
     //REFS1 REFS0 =01  Slect AVCC as reference voltage
     //ADLAR=1          Left adjust
     //ADC_CHANEL       the channel is SELECT
      ADMUX=(1<<REFS0)|( ADC_ChANEL &0x0f)|(1<<ADLAR);//选择内部AVCC为基准
      
}


/*
**********************************************
void Disp_Out()  显示数据到数码管
**********************************************
*/

main()
{
       SP=0x45f;
      OSCCAL=0x7d;
      
      adc_init();
      
      while(1)
      {
                 Delay();
              AD_Read();
      }
}




2楼: >>参与讨论
kkyou
我也遇到过这个问题,加了看门狗就好了!
  我也遇到过这个问题,加了看门狗就好了!
我想可能是那个程序本身有问题,老是死掉

3楼: >>参与讨论
tangqin
有道理
你应该不断刷新显示,看看是不是死在哪 里了

4楼: >>参与讨论
kkyou
看看这个也许有帮助
看看这个也许有帮助
http://61.144.28.248/ouravr/bbs/bbs_content.jsp?
bbs_sn=87842&bbs_page_no=1&bbs_id=1000

参与讨论
昵称:
讨论内容:
 
 
相关帖子
请问ftp://file.21ic.com.cn
问个AVR软件安装的问题。
DIY 微型JTAG  ICE 仿真器
自制AVR-JTAG仿真器的程序经常丢失
双龙的论坛关了么?好久上不去了。
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号