为什么我写的ad转换在电压小于2.56v时精确......
为什么我写的ad转换在电压小于2.56v时精确但是大于2.56v时就显示不对了呢,貌似是实际值减去2.56v代码:(cvavr)
#include <mega16.h>
#include <delay.h>
#define uchar unsigned char
#define uint unsigned int
uint adc_data;
void port_init()
{
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
}
void display(uint dat)
{
uchar i=0;
i=dat%10;
PORTB=0x07;
PORTC=i;
delay_ms(1);
i=(dat%100)/10;
PORTB=0x0b;
PORTC=i;
delay_ms(1);
i=(dat%1000)/100;
PORTB=0x1d; //添加一位小数点在第二位
PORTC=i;
delay_ms(1);
i=(dat/1000);
PORTB=0x0e;
PORTC=i;
delay_ms(1);
}
void adc_init()
{
ADCSR=0x00;
ADMUX=0x40;
ACSR=0x80;
ADCSRA=0xEB;
}
interrupt void adc_isr(void)
{
adc_data=ADCL; //先把低八位放入adc_data的低八位
// Read the 8 most significant bits
// of the AD conversion result
adc_data|=(int)ADCH<<8; //再把高两位移入adc_data的9,10位 ,因为ADCH为8位,所以若不强制转换为16位则ADCH<<8的值为0;
// Place your code here
}
void main()
{
uint dat=0;
SREG^=0x80;
port_init();
adc_init();
SREG|=0x80;
while(1)
{
dat=(adc_data*125)>>8;
display(dat);
}
} ADC 你是用了片内的基准,最高是2.56V cshm0101 发表于 2013-6-11 23:13 static/image/common/back.gif
ADC 你是用了片内的基准,最高是2.56V
但是我的ADMUX=0x40,选择的是AREF啊 adc_data*125可能会溢出,建议将adc_data定义成ulong
页:
[1]