|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-6-6 08:55:58
|
显示全部楼层
58楼有如下说明:
我的ADC模数转换模块是这样工作的:
ADC中断读取数据,切换通道,但不启动转换
1ms定时中断里启动ADC转换,判断中断次数是否等于16*通道数,等于的话则更新测量值
每通道每次测量值读取后累加到该通道的累加和保存单元,累加16次的结果为测量结果
另外存放到测量结果单元,这样一来,工作程序不要考虑和干涉ADC,可从测量结果单元
随时调用任一通道测量值
(以上摘录中数字16在58楼中为32)
相关程序段摘录如下
初始化
ADCSRA=(1<<ADEN|1<<ADIE|1<<ADPS2|1<<ADPS1|1<<ADPS0);//
使能ADC,使能ADC中断,设置ADC工作频率 但还未启动ADC转换
ADCSRA|=1<<ADSC;// 启动一次ADC转换(不是必须的)
这样就会发生ADC中断,在中断程序里读取数据,切换通道,读取的数据累加到adc_0 or adc_1
ISR(ADC_vect)
{
uint adcval;
adcval=ADCW;
if (channel==0)
{
adc_0=adc_0+adcval;
channel=1;
ADMUX|=1;
}
else
{
adc_1=adc_1+adcval;
channel=0;
ADMUX&=~(1);
};
}
如果要继续做ADC转换,则必须重新启动,用ADCSRA|=1<<ADSC;
该语句在T2中断程序中:
ISR(TIMER2_OVF_vect)
{
sei();
TCNT2=0x06;
ADCSRA|=(1<<ADSC);********
clock2+=1;
if(clock2==32) 两通道交替检测,每通道16次,共32次完成后将累加结果作为测量结果然后清零累加器
{
clock2=0;
adc_00=adc_0;adc_11=adc_1;
adc_0=0;adc_1=0;
};
。。。。。
只要以上两个中断未被关闭,ADC转换一直在进行,在adc_00,adc_11中始终是经过滤波处理的最新的ADC转换结果
应用程序可随时调用而不必过问和操作ADC |
|