高级会员
主题
帖子
积分1080
阅读权限30
注册时间2010-11-2
最后登录1970-1-1
在线时间 小时
|
过采样的确好用,分辨率也有一定的提高,我用它做了不少设备了,最常用的就是电压电流表了。0-30V电压小数点后两位精度可以做到0.2%左右,我用的电压基准是MC1403,AVR M48单片机。
顺便附上用ADC中断做的过采样子程序吧(自学单片机,写的不规范请多见谅),我都用了好几年了,现在基本上没什么时间玩单片机了,送给大家吧。
volatile unsigned int cou_adc;//ADC过采样计数器
volatile unsigned long add_adc; //ADC过采样累加寄存器
volatile unsigned int x0; //x0寄存器
volatile unsigned int x1; //x1寄存器
volatile unsigned int x2; //x2寄存器
volatile unsigned int x3; //x3寄存器
volatile unsigned int x4; //x4寄存器
volatile unsigned int x5; //x5寄存器
volatile unsigned int x6; //x6寄存器
volatile unsigned int x7; //x7寄存器
volatile unsigned char bz_adc;//ADC采样标志寄存器
void adc_init();
ISR(ADC_vect)//ADC中断函数(自动进行过采样并分通道保存在xn寄存器中)
{
if(!gbi(bz_adc,0))//不要初次采样
{
add_adc+=ADC;//非初次采样ADC过采样变量累加
cou_adc--;//计数
}
cbi(bz_adc,0);//清初次采样标志
if(!cou_adc)//采样256次
{
add_adc>>=3;//右移3位得出约15位精度的数值
switch (ADMUX)//通道切换并将long数据转换成int数据存入x寄存器
{
case 0:
ADMUX=1;x0=(int)add_adc;break;
case 1:
ADMUX=2;x1=(int)add_adc;break;
case 2:
ADMUX=3;x2=(int)add_adc;break;
case 3:
ADMUX=4;x3=(int)add_adc;break;
case 4:
ADMUX=5;x4=(int)add_adc;break;
case 5:
ADMUX=6;x5=(int)add_adc;break;
case 6:
ADMUX=7;x6=(int)add_adc;break;
case 7:
ADMUX=0;x7=(int)add_adc;break;
}
cou_adc=256;//重置计数器
add_adc=0;//ADC过采样累加寄存器清零
sbi(bz_adc,0);//置初次采样标志
}
sbi(ADCSRA,ADSC);//ADC开始转换
}
void adc_init()//adc初始化
{
ADMUX=0B00000000;//外部基准,结果右对齐,ADC0输入
ADCSRA=0B11001101;//ADC32分频,ADC中断使能
//ADCSRA=0B11001111;//ADC128分频,ADC中断使能
cou_adc=256;//重置计数器
}
|
|