[C语言] ADC采集不准确问题。

[复制链接]
 楼主| qazq123 发表于 2015-10-19 15:41 | 显示全部楼层 |阅读模式

  1. //ADC完成中断
  2. #pragma interrupt_handler adc_isr:iv_ADC     
  3. void adc_isr(void)
  4. {
  5. ADMUX =0x46;//选择内部AVCC为基准
  6. temp_single=ADC&0x3ff;
  7. temp_single=temp_single*Vref/0x3ff;

  8. temp_sum =(unsigned int)( temp_sum + temp_single*temp_single);
  9. if(flag==64)
  10. {
  11.   adc_rel=(unsigned int)sqrt(temp_sum/64);
  12.    flag = 0;
  13.    temp_sum = 0;
  14.    
  15. }

  16. //ADCSRA|=(1<<ADSC);//启动AD转换
  17. }
  18. #pragma interrupt_handler timer0_ovf:17
  19. void timer0_ovf(void)
  20. {
  21. TCNT0 = 0xB2;  //重装计数初值
  22. ADCSRA|=(1<<ADSC);//启动AD转换
  23. flag++;   //625微妙,标志位加1
  24. }
程序代码如上,主芯片为mega88。 当我不接V1(220V交流电)时,电源由下载器提供时,数码管显示2.4V, 万用表测得的IO口(Vin)电压为2.109V。

当我接入V1为市电时,数码管还是显示2.4V,我用万用表测Vin的直流电压为2.4V,交流电为0.3V。  实在是搞不懂出错在哪里了,求各位大神指导下可以吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
元方义城 发表于 2015-10-19 17:28 | 显示全部楼层
我记得AVR手册上好像写了,ADC首次采集不是很准,应该舍掉取第二次采集内容。如果对时间没有要求,来个软件滤波求平均吧。
貌似稿手 发表于 2015-10-19 17:59 | 显示全部楼层
应该多次采样(10次) 去掉 最大值与最小值  取平均值 就行了  我这边就是这样做的很准呢
gx_huang 发表于 2015-10-20 08:55 | 显示全部楼层
可怜的LZ还在纠结这个问题。
 楼主| qazq123 发表于 2015-10-20 09:15 | 显示全部楼层
gx_huang 发表于 2015-10-20 08:55
可怜的LZ还在纠结这个问题。

哎哎,弄不出来啊- - 坑爹啊。
 楼主| qazq123 发表于 2015-10-20 09:19 | 显示全部楼层
gx_huang 发表于 2015-10-20 08:55
可怜的LZ还在纠结这个问题。

害我看到有人回复激动了一下- -
追风筝的人36 发表于 2015-10-20 10:46 来自手机 | 显示全部楼层
遇到过类似问题的飘过,采几次做平均
gx_huang 发表于 2015-10-20 12:58 | 显示全部楼层
qazq123 发表于 2015-10-20 09:19
害我看到有人回复激动了一下- -

关键是掌握正确的调试方法。
ADC输入一个直流信号,看看ADC和万用表是否一致。
然后才是检查程序的初始化和算法问题。
 楼主| qazq123 发表于 2015-10-20 13:37 | 显示全部楼层
gx_huang 发表于 2015-10-20 12:58
关键是掌握正确的调试方法。
ADC输入一个直流信号,看看ADC和万用表是否一致。
然后才是检查程序的初始化 ...

输入直流信号,ADC和万用表是一致的。  当有交流的时候,我不是用直流偏置拉高零电位了吗?这样整个正弦波形都能被检测到,用均方根。为啥一点反应都没有- - 显示的还是直流信号的数字。。
 楼主| qazq123 发表于 2015-10-20 13:42 | 显示全部楼层
追风筝的人36 发表于 2015-10-20 10:46
遇到过类似问题的飘过,采几次做平均

你没看我程序吗- - 采了64个点,做均方根了。这样都没反应的话0 0 再平均也一样啊0 0
 楼主| qazq123 发表于 2015-10-20 13:43 | 显示全部楼层
元方义城 发表于 2015-10-19 17:28
我记得AVR手册上好像写了,ADC首次采集不是很准,应该舍掉取第二次采集内容。如果对时间没有要求,来个软件 ...

我试试
mcuzone 发表于 2015-10-20 14:07 | 显示全部楼层
直接分压采市电啊,牛的!
仔细检查你的电源设计,包括MEGA88的参考源
 楼主| qazq123 发表于 2015-10-20 14:16 | 显示全部楼层
mcuzone 发表于 2015-10-20 14:07
直接分压采市电啊,牛的!
仔细检查你的电源设计,包括MEGA88的参考源

电源没错的,mega88的参考电压也没错
mcuzone 发表于 2015-10-20 14:23 | 显示全部楼层
莫非你的采样速度是50Hz?
mcuzone 发表于 2015-10-20 14:24 | 显示全部楼层
建议你用示波器看看ADC输入端的波形(加了市电输入后)
 楼主| qazq123 发表于 2015-10-20 14:35 | 显示全部楼层
mcuzone 发表于 2015-10-20 14:23
莫非你的采样速度是50Hz?

1600次/秒
 楼主| qazq123 发表于 2015-10-20 14:36 | 显示全部楼层
mcuzone 发表于 2015-10-20 14:24
建议你用示波器看看ADC输入端的波形(加了市电输入后)

没有示波器- -
gx_huang 发表于 2015-10-20 14:40 | 显示全部楼层
qazq123 发表于 2015-10-20 13:37
输入直流信号,ADC和万用表是一致的。  当有交流的时候,我不是用直流偏置拉高零电位了吗?这样整个正弦 ...

你的信号是交流加直流偏置。
ADC均方根的信号就是直流电平的信号呀,和万用表测量一样,那是正确的,你还怀疑什么?
你想测试复合信号中交流电的幅度,得先减去直流信号,再均方根。
或者采用傅立叶变换,取基波的幅度,那复杂了。
 楼主| qazq123 发表于 2015-10-20 15:34 | 显示全部楼层
gx_huang 发表于 2015-10-20 14:40
你的信号是交流加直流偏置。
ADC均方根的信号就是直流电平的信号呀,和万用表测量一样,那是正确的,你还 ...

不对吧,ADC均方根的信号是交流加直流的信号吧?我不减的话也不应该等于直流的信号啊,交流信号出不来。
 楼主| qazq123 发表于 2015-10-20 15:37 | 显示全部楼层
gx_huang 发表于 2015-10-20 14:40
你的信号是交流加直流偏置。
ADC均方根的信号就是直流电平的信号呀,和万用表测量一样,那是正确的,你还 ...

因为精度要求不会太高。所以用均方根的算法基本就可以了。就算我减去直流电压,数码管显示000.0 = = 有时候还会跳6000+的数据。不知道错误在哪额
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

163

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部