打印
[C语言]

ADC采集不准确问题。

[复制链接]
4194|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qazq123|  楼主 | 2015-10-19 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

temp_sum =(unsigned int)( temp_sum + temp_single*temp_single);
if(flag==64)
{
  adc_rel=(unsigned int)sqrt(temp_sum/64);
   flag = 0;
   temp_sum = 0;
   
}

//ADCSRA|=(1<<ADSC);//启动AD转换
}
#pragma interrupt_handler timer0_ovf:17
void timer0_ovf(void)
{
TCNT0 = 0xB2;  //重装计数初值
ADCSRA|=(1<<ADSC);//启动AD转换
flag++;   //625微妙,标志位加1
}
程序代码如上,主芯片为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还在纠结这个问题。

使用特权

评论回复
5
qazq123|  楼主 | 2015-10-20 09:15 | 只看该作者
gx_huang 发表于 2015-10-20 08:55
可怜的LZ还在纠结这个问题。

哎哎,弄不出来啊- - 坑爹啊。

使用特权

评论回复
6
qazq123|  楼主 | 2015-10-20 09:19 | 只看该作者
gx_huang 发表于 2015-10-20 08:55
可怜的LZ还在纠结这个问题。

害我看到有人回复激动了一下- -

使用特权

评论回复
7
追风筝的人36| | 2015-10-20 10:46 | 只看该作者
遇到过类似问题的飘过,采几次做平均

使用特权

评论回复
来自iPhone 5
8
gx_huang| | 2015-10-20 12:58 | 只看该作者
qazq123 发表于 2015-10-20 09:19
害我看到有人回复激动了一下- -

关键是掌握正确的调试方法。
ADC输入一个直流信号,看看ADC和万用表是否一致。
然后才是检查程序的初始化和算法问题。

使用特权

评论回复
9
qazq123|  楼主 | 2015-10-20 13:37 | 只看该作者
gx_huang 发表于 2015-10-20 12:58
关键是掌握正确的调试方法。
ADC输入一个直流信号,看看ADC和万用表是否一致。
然后才是检查程序的初始化 ...

输入直流信号,ADC和万用表是一致的。  当有交流的时候,我不是用直流偏置拉高零电位了吗?这样整个正弦波形都能被检测到,用均方根。为啥一点反应都没有- - 显示的还是直流信号的数字。。

使用特权

评论回复
10
qazq123|  楼主 | 2015-10-20 13:42 | 只看该作者
追风筝的人36 发表于 2015-10-20 10:46
遇到过类似问题的飘过,采几次做平均

你没看我程序吗- - 采了64个点,做均方根了。这样都没反应的话0 0 再平均也一样啊0 0

使用特权

评论回复
11
qazq123|  楼主 | 2015-10-20 13:43 | 只看该作者
元方义城 发表于 2015-10-19 17:28
我记得AVR手册上好像写了,ADC首次采集不是很准,应该舍掉取第二次采集内容。如果对时间没有要求,来个软件 ...

我试试

使用特权

评论回复
12
mcuzone| | 2015-10-20 14:07 | 只看该作者
直接分压采市电啊,牛的!
仔细检查你的电源设计,包括MEGA88的参考源

使用特权

评论回复
13
qazq123|  楼主 | 2015-10-20 14:16 | 只看该作者
mcuzone 发表于 2015-10-20 14:07
直接分压采市电啊,牛的!
仔细检查你的电源设计,包括MEGA88的参考源

电源没错的,mega88的参考电压也没错

使用特权

评论回复
14
mcuzone| | 2015-10-20 14:23 | 只看该作者
莫非你的采样速度是50Hz?

使用特权

评论回复
15
mcuzone| | 2015-10-20 14:24 | 只看该作者
建议你用示波器看看ADC输入端的波形(加了市电输入后)

使用特权

评论回复
16
qazq123|  楼主 | 2015-10-20 14:35 | 只看该作者
mcuzone 发表于 2015-10-20 14:23
莫非你的采样速度是50Hz?

1600次/秒

使用特权

评论回复
17
qazq123|  楼主 | 2015-10-20 14:36 | 只看该作者
mcuzone 发表于 2015-10-20 14:24
建议你用示波器看看ADC输入端的波形(加了市电输入后)

没有示波器- -

使用特权

评论回复
18
gx_huang| | 2015-10-20 14:40 | 只看该作者
qazq123 发表于 2015-10-20 13:37
输入直流信号,ADC和万用表是一致的。  当有交流的时候,我不是用直流偏置拉高零电位了吗?这样整个正弦 ...

你的信号是交流加直流偏置。
ADC均方根的信号就是直流电平的信号呀,和万用表测量一样,那是正确的,你还怀疑什么?
你想测试复合信号中交流电的幅度,得先减去直流信号,再均方根。
或者采用傅立叶变换,取基波的幅度,那复杂了。

使用特权

评论回复
19
qazq123|  楼主 | 2015-10-20 15:34 | 只看该作者
gx_huang 发表于 2015-10-20 14:40
你的信号是交流加直流偏置。
ADC均方根的信号就是直流电平的信号呀,和万用表测量一样,那是正确的,你还 ...

不对吧,ADC均方根的信号是交流加直流的信号吧?我不减的话也不应该等于直流的信号啊,交流信号出不来。

使用特权

评论回复
20
qazq123|  楼主 | 2015-10-20 15:37 | 只看该作者
gx_huang 发表于 2015-10-20 14:40
你的信号是交流加直流偏置。
ADC均方根的信号就是直流电平的信号呀,和万用表测量一样,那是正确的,你还 ...

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

163

帖子

0

粉丝