⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 自己以前编的avr_gcc的ad程序
💻 C
字号:
/*
	AD转换:

1、做AD转换时外部的抗干扰电路非常重要。

2、如果要做比较精确的AD,不要使用内部参考电压,因为内部2.56的参考电压的漂移比较明显。

3、AD转换第一次的结果应舍弃
*/

   #include <avr/io.h>
	 #include <avr/interrupt.h>
	 #include <avr/signal.h>
	 #include <util/delay.h>
	 
	 #define uint unsigned int
	 #define uchar unsigned char
	  
	uint RESULT_BUFF[8];
  void delayMS(uint t)
    {
		uint m=0;  
		for(;m<t;t++)
		  _delay_loop_2(250*4);
		}	 
  unsigned int AdcConvert(void)

    {
	   unsigned int i;
	   unsigned int  ret;
	   /// ADMUX=0xc0;        ///内部2.56v参考电压,通道0
	   ADCSRA|=_BV(ADEN);    //使能ADC,单次转换模式 
	   ///连续转换8次
	   for(i=0;i<8;i++)
	     {
	        ADCSRA|=_BV(ADSC);
	        _delay_loop_1(60);
	        ret=(uint)ADCL;
	        ret|=(uint)(ADCH<<8);
	        RESULT_BUFF[i]=ret;
	     }
	    ret=0;
		for(i=1;i<8;i++)
		    {
 
			ret+=RESULT_BUFF[i];

			}
			ret=ret/8;
			return(ret);
	}	
  
  int main(void)
    
	{
	    DDRB=0xff;

		
ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0)/*|(1<<ADLAR)*/;   
                                      ///基准电压为内部基准电压    选通ADC0
			                                ///置位ADLAR, 转换结果为左对齐

ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(0<<ADIF)|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);  

     ADCSRA|=_BV(ADEN);
		_delay_loop_2(20);
		_delay_loop_2(10);
		
	
	  while(1)
	     {
		    uint temp;
			  temp=AdcConvert();
		    PORTB=(temp*2.56)/1024;
		 
		 }

}




	
	
/*10 位 精度
 0.5 LSB 的非线性度
 ± 2 LSB 的绝对精度
 13 - 260 μs 的转换时间
 最高分辨率时采样率高达15 kSPS
 6 路复用的单端输入通道
 2 路附加复用的单端输入通道 (TQFP 与MLF 封装)
 可选的左对齐ADC 读数
 0 - VCC 的 ADC 输入电压范围
 可选的2.56V ADC 参考电压
 连续转换或单次转换模式
 ADC 转换结束中断
 基于睡眠模式的噪声抑制器
*/

/*	 
	向 ADC 启动转换位ADSC 位写"1” 可以启动单次转换。在转换过程中此位保持为高,直
到转换结束,然后被硬件清零。如果在转换过程中选择了另一个通道,那么ADC 会在改
变通道前完成这一次转换。 

	Table 73. ADC 转换时间
条件
采样&        保持( 启动转换后的时钟周期数)           转换时间( 周期)
第一次转换             13.5                               25

正常转换,单端         1.5                                13 

ADC 转换结果转换结束后(ADIF 为高),转换结果被存入ADC 结果寄存器(ADCL, ADCH)。
单次转换的结果如下:
         ADC=V(in)*1024/V(REF)
		 
		 
*/	 
 

/* 
    ADC 多工选择寄存器- ADMUX
     
    Bit       7     6     5     4     3     2     1     0
            REFS1 REFS0 ADLAR   –   MUX3  MUX2  MUX1  MUX0 
  读/ 写     R/W   R/W   R/W    R   R/W    R/W   R/W   R/W
  初始值      0     0     0     0    0      0     0     0    

  Bit 7:6 – REFS1:0: 参考电压选择
  Table 74. ADC 参考电压选择
                  REFS1            REFS0               参考电压选择
                    0                0               AREF, 内部Vref 关闭
                    0                1               AVCC, AREF 引脚外加滤波电容
                    1                0               保留
                    1                1               2.56V 的片内基准电压源, AREF 引脚外加滤波电容
  
  Bit 5 – ADLAR: ADC 转换结果左对齐
  Bits 3:0 – MUX3:0: 模拟通道选择位
  
  
    ADC 控制和状态寄存器A -ADCSRA
	
    Bit      7      6     5     4     3     2     1     0
            ADEN   ADSC  ADFR  ADIF  ADIE ADPS2 ADPS1 ADPS0 
    读/ 写  R/W    R/W   R/W   R/W   R/W   R/W   R/W   R/W
    初始值   0      0     0     0     0     0     0     0
	
	Bit 7 – ADEN: ADC 使能
	ADEN置位即启动ADC,否则ADC功能关闭。在转换过程中关闭ADC将立即终止正在进行的转换。 
	Bit 6 – ADSC: ADC 开始转换
	在单次转换模式下,ADSC 置位将启动一次ADC 转换。在连续转换模式下,ADSC 置位将启动首次
	转换。第一次转换( 在ADC 启动之后置位ADSC,或者在使能ADC 的同时置位ADSC) 需要25 个ADC 
	时钟周期,而不是正常情况下的13 个。第一次转换执行ADC初始化的工作。
	在转换进行过程中读取ADSC 的返回值为"1”,直到转换结束。ADSC 清零不产生任何动作。
	Bit 5 – ADFR: ADC 连续转换选择
	该位置位时,运行在连续转换模式。该模式下,ADC 不断对数据寄存器进行采样与更新。该位清零,
    终止连续转换模式。
	Bit 4 – ADIF: ADC 中断标志
	在ADC 转换结束,且数据寄存器被更新后, ADIF 置位。如果ADIE 及SREG 中的全局中断使能位I 
	也置位,ADC 转换结束中断服务程序即得以执行,同时ADIF 硬件清零。此外,还可以通过向此标
	志写1 来清ADIF。要注意的是,如果对ADCSRA 进行读-修改-写操作,那么待处理的中断会被禁
	止。这也适用于SBI 及CBI 指令。
	Bit 3 – ADIE: ADC 中断使能
	若ADIE 及SREG 的位I 置位, ADC 转换结束中断即被使能。
	Bits 2:0 – ADPS2:0: ADC 预分频器选择位
	Table 76. ADC 预分频选择
	               ADPS2         ADPS1         ADPS0           分频因子
                     0             0             0                 2
                     0             0             1                 2
                     0             1             0                 4
                     0             1             1                 8
                     1             0             0                16
                     1             0             1                32
                     1             1             0                64
                     1             1             1                128
	
	ADC 数据寄存器- ADCL 及ADCH
    读取ADCL 之后,ADC 数据寄存器一直要等到ADCH 也被读出才可以进行数据更新。因此,如果转换
	结果为左对齐,且要求的精度不高于8 比特,那么仅需读取ADCH 就足够了。否则必须先读出ADCL 
	再读ADCH。
	
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -