本帖最后由 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电流接入,交流电和直流电一叠加就出错。这问题出在哪里呢?求指导~~
|