本帖最后由 qazq123 于 2015-10-16 17:03 编辑
<blockquote><blockquote>//ADC初始化
//ADC完成中断
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
ADMUX =0x46;//选择内部AVCC为基准
temp_single=ADC&0x3ff;
temp_single=temp_single*Vref/1024;
temp_sum += temp_single*temp_single;
if(flag==64)
{
adc_rel=(unsigned int)sqrt((temp_sum)/64);
flag = 0;
temp_sum = 0;
}
}
#pragma interrupt_handler timer0_ovf:17
void timer0_ovf(void)
{
TCNT0 = 0xB2; //重装计数初值
ADCSRA|=(1<<ADSC);//启动AD转换
flag++; //625微妙,标志位加1
}
//主函数里的循环
while(1)
{
//采集1600个点,进行数据平均数的计算
if(adc_old!=adc_rel)
{
adc_old=adc_rel;
send(adc_old);
for(j=0;j<50;j++)
{
display();
}
}
电路图如左侧,芯片是mega48的。开启了两个中断,ADC和定时器,功能:测量220V交流电。
实际测试中发现:
1.不接交流电,数码屏的显示数据为中点电位 REF提供的直流电(参考电压的一半),如果接入市电,也只是显示REF直流电的电压,电压不曾改变。
2。如果把LM358芯片去掉,相当于不提供REF电压,数码屏显示的是ADC采集口的电压跟用万用表测试的电压是一样的。
为什么REF电流接入,交流电和直流电一叠加就出错。这问题出在哪里呢?求指导~~
|