AVR ADC错误求解
//*******************************************************************///*
//* 电池电压检测
//*
//*******************************************************************/
void Vcheck()
{
if(ADCSRA&BIT4)
{
Vbat=ADCH*256+ADCL;
while(!( UCSR0A & (1<<UDRE)) );
UDR0=ADCH;
while(!( UCSR0A & (1<<UDRE)) );
UDR0=ADCL;
while(!( UCSR0A & (1<<UDRE)) );
UDR0=0XAA;
Vbat=Vbat*33/1024;
ADCSRA|=BIT4;
ADCSRA|=BIT6;
}
}
//*************************************************************************
// AD初始化函数
//*************************************************************************
void AD_init()
{
ADMUX =0x00; //选择通道0,数据右对齐,AREF为电压基准
ADCSRA=0x92; //adc使能,连续转换
ADCSRB=0xF0;
SFIOR =0x00; //控制和状态寄存器初始化
EIFR =0xC0; //清中断标志位
ADCSRA|=BIT6;
}
AD只是在上电的时候读一次
不知道什么原因 1.ad的频率比串口发送要快得多吧。函数vcheck()是ad中断程序吗?
2.读ad的H和L有顺序要求的,先低后高。可能这个是主要问题。
zhanan 发表于 2012-11-10 20:27 static/image/common/back.gif
1.ad的频率比串口发送要快得多吧。函数vcheck()是ad中断程序吗?
2.读ad的H和L有顺序要求的,先低后高。 ...
没用中断,你说的先后顺序可能是这个问题
看我那个程序,Vbat=ADCH*256+ADCL。编译后,可能是先读 的高啊。明天我试试,今天拿不到板子, 读了ADCL后,就停止更新了。你那个程序下面有一个 UDR0=ADCL;
zhanan 发表于 2012-11-11 10:29 static/image/common/back.gif
读了ADCL后,就停止更新了。你那个程序下面有一个 UDR0=ADCL;
可是,每次之后我都再次启动adc
就不能换种写法方式 转换完了 再通过串口发送
现在问题不是发上来,就是不发,也转换一遍
zhanan 发表于 2012-11-10 20:27 static/image/common/back.gif
1.ad的频率比串口发送要快得多吧。函数vcheck()是ad中断程序吗?
2.读ad的H和L有顺序要求的,先低后高。 ...
是你说的那个问题,另外一个资料也说明了
必须先读取低位的,
页:
[1]