搜索
bottom↓
回复: 15

uc3b0256的adc遇到莫名其妙的问题

[复制链接]

出0入0汤圆

发表于 2010-3-29 11:17:25 | 显示全部楼层 |阅读模式
我最近在一个项目中用UC3B0256,我用到了六路ADC,我初始化好,每次调用 adc_start,之后,adc_get_value去读取每个回路的数据,但是我这些天一直遇到一个无法解释的问题,我用示波器测量我的模拟输入为0v,但是是读取出来的数据却是31,而不是0,我的参考电压是3.3v,这样反算回去相当于90mv的输入电压,输入的电压高一点,读取的数据也会有变化,但我不明白,为什么我输入为0,但能读到一个31的数据,几乎所有的通道都是一样的情况,还请指教,谢谢。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2010-3-29 14:30:05 | 显示全部楼层
今天详细测试发现有一个规律,所有的通道都比真实值高了150mV.例如我输入的电压为0,读取的数据为49.用示波器从外部测量输入脚和电源都很干净,真的搞不懂了.

出0入0汤圆

发表于 2010-3-31 09:02:19 | 显示全部楼层
是不是空着脚测的啊? 你把脚直接接地或接个电阻到地看值是不是零.

出0入0汤圆

发表于 2010-4-3 18:07:57 | 显示全部楼层
可能是打开了上拉。

出0入0汤圆

 楼主| 发表于 2010-4-6 18:02:36 | 显示全部楼层
void ini_dac_proc( void )
{
          gpio_enable_module(ADC_GPIO_MAP, sizeof(ADC_GPIO_MAP) / sizeof(ADC_GPIO_MAP[0])); // Assign and enable GPIO pins to the ADC function.
          AVR32_ADC.mr |= 0x09 << AVR32_ADC_MR_PRESCAL_OFFSET;
          adc_configure(adc);// configure ADC

          adc_enable(adc,tmp_ch1);
          adc_enable(adc,vin_ch1);
          adc_enable(adc,vout_ch1);
          adc_enable(adc,ain_ch1);
          adc_enable(adc,aout_ch1);
          adc_enable(adc,aleak_ch1);

          gpio_disable_pin_pull_up(AVR32_ADC_AD_0_PIN);
          gpio_disable_pin_pull_up(AVR32_ADC_AD_1_PIN);
          gpio_disable_pin_pull_up(AVR32_ADC_AD_4_PIN);
          gpio_disable_pin_pull_up(AVR32_ADC_AD_5_PIN);
          gpio_disable_pin_pull_up(AVR32_ADC_AD_6_PIN);
          gpio_disable_pin_pull_up(AVR32_ADC_AD_7_PIN);
}

出0入0汤圆

 楼主| 发表于 2010-4-6 18:09:08 | 显示全部楼层
这是我的初始化程序,我使用的管脚都没有悬空,我用示波器测过,不会超过10mv,纹波很小,电源也很干净,我做了两个板子都有同样的问题,感觉这些脚都有一个不低于150Mv的电压在上面。

出0入0汤圆

 楼主| 发表于 2010-4-6 18:16:48 | 显示全部楼层
adc_step++;
              switch (adc_step)
               {   case 1:
                         adc_start(adc);
                         break;
                  case 2:
                         //gpio_clr_gpio_pin(ten_2);
                         vout =adc_get_value(adc, vout_ch1);
                        

                         ain =adc_get_value(adc,ain_ch1);
                         break;
                   case 3:
                         vin =adc_get_value(adc,vin_ch1);
                        
                         aout=adc_get_value(adc,aout_ch1);
                        
                         break;
                   default: break;   
               }

出0入0汤圆

 楼主| 发表于 2010-4-7 16:47:49 | 显示全部楼层
我这样读取有没有问题?这个问题困扰我好久了.

出0入0汤圆

发表于 2010-4-7 22:14:49 | 显示全部楼层
【7楼】 zerglok
你把去上拉的语句全部去掉估计就好了……

另外我没看明白你后面贴的代码的意义,状态机一波流?????

出0入0汤圆

 楼主| 发表于 2010-4-8 09:37:27 | 显示全部楼层
谢谢火腿兄,我后面的代码是在主程序中执行的,每20ms读取一次,一次启动start,接下来每循环一次读取一个channel的adc.
另外我去掉去上拉的语句也是一样。我用示波器测量各个输入脚都很干净,大约有5毫伏的电压,参考电源也是很干净的,但是读取的数据就是会在原来的基础上多了49。两个礼拜都没有找到问题。好困惑,atmel的回复也很官话。

出0入0汤圆

 楼主| 发表于 2010-4-12 15:48:51 | 显示全部楼层
今天找到问题的原因了:我的外部中断(0,1)脚接的是5v的讯号,发现这样会使adc出现上述问题。我测试发现adc0-adc7中的任何脚只要接到5v就会出现这个问题,即使是那些没有被使能为adc的脚也是如此,但是接3.3v就没有任何问题。难道这个ic不能承受5v的输入吗?

出0入0汤圆

 楼主| 发表于 2010-7-13 12:59:50 | 显示全部楼层
收到atmel的回复,可以作为adc的引脚,不能接5v信号,其他脚都可以,这应该是他们设计上的bug.

出0入0汤圆

发表于 2010-7-18 21:35:11 | 显示全部楼层
“&#8226; 5V Input Tolerant I/Os, including 4 high-drive pins.”
我觉得应该理解成能承受5V信号输入不至于损坏芯片。

出0入0汤圆

 楼主| 发表于 2010-7-20 11:32:33 | 显示全部楼层
回楼上,接5v完全不会破坏芯片,目前只是发现会影响adc的功能。atmel已经给我确认这个问题的存在,所以大家在设计时注意一下,避免我遇到的这个问题。

出0入0汤圆

发表于 2012-4-1 09:26:55 | 显示全部楼层
学习了!这久刚好再弄AD

出0入0汤圆

发表于 2014-11-8 22:36:02 | 显示全部楼层
谢谢分享!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 20:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表