EDN首页   博客首页

日志档案

发表于 2007-10-6 14:30:44

0

标签: 无标签

AVR中AD转换程序(转贴别人的算一个记号)

嘿嘿,这两天在看别人写的AVR中AD转换程序,自已拼凑起一个能用的,觉得蛮好玩。贴出来共享
下面这个程序在ATMEGA16L上通过,直接在LCM上显示PA0口的电压。单位是0.1mV
本程序只是偶试验AVR的AD转换功能而写,也并非我原创,只是消化了别人的程序凑起来的。但绝对能用。
同时也望大虾们指点一二。
//单端通道,不放大 
#define AD_SE_ADC0 0x00 //ADC0 
#define AD_SE_ADC1 0x01 //ADC1 
#define AD_SE_ADC2 0x02 //ADC2 
#define AD_SE_ADC3 0x03 //ADC3 
#define AD_SE_ADC4 0x04 //ADC4 
#define AD_SE_ADC5 0x05 //ADC5 
#define AD_SE_ADC6 0x06 //ADC6 

//常量定义 
#define Vref 2650 //mV
/*********AD转换函数******************/
//AD转换函数
//ADC_PORT为输入的端口
/**************************************/
uint16_t Measured_Vol_INT(unsigned char ADC_PORT) 
{ 
  uint16_t M_Volt=0;         //变换后的电压mV 
  uint32_t temp32; 
  uint8_t i; 
     ADMUX=0xC0|ADC_PORT;                        //片内基准电压,单端输入.
/* 
  ADMUX (ADC Multiplexer Select Register) 
             bit7  bit6  
             REFS1 REFS0  参考电压选择  
              0     0     AREF,内部Vref关闭  
              0     1     AVCC,AREF引脚外加滤波电容  
              1     0     保留  
              1     1     2.56V的片内基准电压源,AREF引脚外加滤波电容  
             bit5         ADC结果左对齐选择 1=左对齐  0=右对齐 
             bit4~0       选择32通道   
*/ 
  ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
/*   
               ADCSRA (ADC Control and Status Register A) 
                bit7   ADEN ADC使能=1 
                bit6   ADSC 启动ADC开始转换=1 
                bit5   ADATE 自己触发使能 
                bit4   ADIF ADC中断标志 
                bit3   ADIE ADC中断使能 
                bit2:0 ADC 预分频选择位 111=128时钟分频 
*/  
  asm ("sleep");   
  for(i=0;i<24;i++) 
    { 
  ADCSRA|=(1<<ADSC);            //启动ADC开始转换 
  while ((ADCSRA&0x10)!=0x10);  //等待ADC转换结束  
  ADCSRA|=(1<<ADIF);                        //写1清除标志位 
  ADCSRA|=~(1<<ADSC);            //启动ADC开始转换 
     temp32=(uint32_t)ADC*Vref; 
     M_Volt+=(uint16_t)(temp32/1023); 
    }   
  ADCSRA&=~(1<<ADIE);                         //禁止ADC中断   
  return(M_Volt/24);    
}
/****************************************/
/*主函数*/
/****************************************/
int main(void)
{
   DelayMs(100);  /*延时100ms*/
   Lcminit(); /*液晶模块初始化 */
   myprintf("mV%");
   while(1)
    {
     DelayMs(500);  /*延时500ms*/
     col=0;row=2;
     myprintf("          %");
     col=60;row=2;
     show_long((unsigned long)Measured_Vol_INT(AD_SE_ADC0));//获取端口PA0的转换数据
    }
}

系统分类: 单片机   |   用户分类: 单片机开发   |   来源: 转贴   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(748)    回复(1)  

投一票您将和博主都有获奖机会!

最新评论

  • WW

    2008-8-1 16:01:27

    WW