ADC实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A/D转换实例
一、单次触发---查询
如图,V REF=5V(A VCC),0~5V的模拟电压从PA0输入,A/D转换后的10位结果从高到低由PD1,PD0,PC7~PC0输出。系统时钟采用片内的4MHZ时钟。
注:1、采用32分频,则A/D采样时钟=4M/32=125KHZ。AD转换的时钟一般要在50KHZ~200KHZ之间。
2、A VCC必须接VCC。采用内部的A VCC时,AREF要外接0.1UF的电容,增强抗干扰能力。
3、观察LED灯时,应从下往上看,高位在下,低位在上。
4、采用内部RC振荡源时,熔丝位SUT:11为保留选项,不可用。
//4MHZ系统时钟
#include
void main(void)
{
DDRC=0XFF;
PORTC=0X00;
DDRD.0=1;
DDRD.1=1;
PORTD.0=0;
PORTD.1=0;
ADMUX=0B01000000; //基准电压选A VCC,结果右对齐,ADC0单端输入
ADCSRA=0B11000101; //使能ADC,开始转换,32分频,ADC时钟=4M/32=125KHZ
while(1)
{
while(ADCSRA.4==0); //查询转换完成标志位ADIF(中断标志位),=0等待,=1读结果
ADCSRA.4=1; //中断标志ADIF位清0(注:通过写1来清0)
ADCSRA.6=1; //ASSC置1,重新开始转换
PORTC=ADCL; //必须先读低位字节,再读高位字节
PORTD=ADCH;
}
二、单次触发---中断
如图,V REF=5V(A VCC),0~5V的模拟电压从PA7输入,A/D转换后的10位结果从高到低由PD1,PD0,PC7~PC0输出。系统时钟采用片外的16MHZ晶体。
注:1、采用片外时钟时相关的设置要更改:
2、采用128分频,则A/D采样时钟=16M/128=125KHZ。
//16MHZ外部时钟
#include
interrupt [15] void aaa(void)
{
ADCSRA.6=1; //ADSC置1,重新开始转换
PORTC=ADCL;
PORTD=ADCH;
}
void main(void)
{
DDRC=0XFF;
PORTC=0X00;
DDRD.0=1;
DDRD.1=1;
PORTD.0=0;
PORTD.1=0;
ADCSRA=0B11001111; //使能ADC,开始转换,128分频,ADC时钟=16M/128=125KHZ,开中断
SREG.7=1;
while(1);
}
三、自动触发---连续转换模式---中断
如图,V REF=5V(A VCC),0~5V的模拟电压从PA0输入,A/D转换后的10位结果从高到低由PD1,PD0,PC7~PC0输出。系统时钟采用片外的16MHZ晶体。
注:自动触发的连续转换模式(ADSC=1,ADATE=1,ADTS2=ADTS1=ADTS0=0),是以中断标志ADIF作为触发源的,只要转换一结束,下一次转换马上开始,即一次接着一次一直转换下去,注意初始化时(第一次)必须要让ADSC=1。
//16MHZ外部时钟
#include
interrupt [15] void aaa(void)
{
//ADCSRA.6=1; //ADSC置1,重新开始转换
PORTC=ADCL;
PORTD=ADCH;
}
void main(void)
{
DDRC=0XFF;
PORTC=0X00;
DDRD.0=1;
DDRD.1=1;
PORTD.0=0;
PORTD.1=0;
ADCSRA=0B11101111; //使能ADC,开始转换,自动触发中断,128分频,ADC时钟=16M/128=125KHZ,开中断
SFIOR=0X00; //连续自由转换
SREG.7=1;
while(1);
}
四、自动触发---外部中断0触发
如图,V REF=5V(A VCC),0~5V的模拟电压从PA0输入,A/D转换后的10位结果从高到低由PD1,PD0,PC7~PC0输出。系统时钟采用片外的16MHZ晶体。要求按一次按钮,PB7上的LED灯取反,且A/D转换一次。
注:1、初始化时(第一次)置ADSC=1也行,ADSC=0也行。
2、该题中是以外部中断0的标志位INTF0作为触发源的,只要INTF0=1则不仅进入外部中断,且进行一次AD转换。
//16MHZ外部时钟
#include
interrupt [15] void aaa(void)
{
//ADCSRA.6=1; //ADSC置1,重新开始转换
PORTC=ADCL;
PORTD=ADCH;
}
interrupt [2] void ccc(void)
{
PORTB.7=~PORTB.7;
}