PIC18F4520 AD有脉冲信号?

[复制链接]
6008|21
 楼主| dsoyy 发表于 2008-7-22 14:08 | 显示全部楼层 |阅读模式
<br />我测量电位器电压,用交流给板子供电,连续采样10次结果如下:<br />219&nbsp;221&nbsp;216&nbsp;217&nbsp;216&nbsp;220&nbsp;217&nbsp;249&nbsp;218&nbsp;216<br />波动比较大,几乎每一段时间有一个较大值如249<br /><br />用直流供电连续采样10次结果如下:<br />218&nbsp;218&nbsp;215&nbsp;217&nbsp;218&nbsp;218&nbsp;225&nbsp;216&nbsp;228&nbsp;217<br />几乎每一段时间有2个较大数值。&nbsp;&nbsp;<br /><br />用万用表测量信号是恒定的,没有脉冲。<br />我的晶振为11.0592,其中有2个寄存器设置存在疑惑,不知是否这里的原因:<br /><br />A/D&nbsp;采集时间选择位,因为是10位AD,我选择了101&nbsp;=&nbsp;12&nbsp;TAD;<br />A/D&nbsp;转换时钟选择位,我选择了001&nbsp;=&nbsp;FOSC/8<br /><br />不知道是否这里影响,出现了波动。<br />清大家帮忙指教。<br /><br /><br /><br /><br /><br /><br /><br /><br />
 楼主| dsoyy 发表于 2008-7-22 14:14 | 显示全部楼层

这是我看到的帖子

<br /><br /><br />影响AD精度的原因:参考电压,采样时间,采样电阻,转换时间&nbsp;<br /><br /><br />参考电压对AD结果直接造成影响,一般误差是固定偏高或偏低。<br />采样时间过短可能导致数据误差紊乱,有时偏高有时偏低,具体看转换通道时前一个通道和后一个通道之间的电压差。<br />采样电阻就是AD的输入电阻,不要大于10K,大于10K结果就有可能就偏低。<br />转换时间就是AD时钟,推荐2-4微秒,过快精度不够,过慢结果偏低&nbsp;<br />&nbsp;<br />
xhy_axb 发表于 2008-7-23 07:48 | 显示全部楼层

回复

和我以前用4520遇到的问题差不多。我怎么调程序都没有解决问题。同样的程序放到其它的单片机上没问题。我最后改型了
 楼主| dsoyy 发表于 2008-7-24 09:55 | 显示全部楼层

不会吧

真如你所说就麻烦了,我再搜集资料想办法解决。
 楼主| dsoyy 发表于 2008-7-24 10:24 | 显示全部楼层

我使用PIC18F4520进行AD

,结果偶尔会出现一个较大偏差和几个偏小数值,用直流电源改善很多,但无法彻底清除,干扰大小随采样信号大小而变化,
yewuyi 发表于 2008-7-24 10:25 | 显示全部楼层

待我看一下18F4520的手册再回复,不要老是短消息。。。

  
yewuyi 发表于 2008-7-24 10:52 | 显示全部楼层

先回答几个问题俺再分析

1、有没有休眠工作?<br />2、AD使用的电压基准是什么?<br />3、AD转换的信号源是什么?输入阻抗是多少?<br />4、AD输入口有没有抗混叠滤波?<br />5、你对AD转换的速度要求是多少?<br /><br /><br />18F4520出问题的可能很小,这个芯片也是很多人在用的型号,从你反映的现象看,应该还是你的信号部分的硬件或者代码有问题。
 楼主| dsoyy 发表于 2008-7-24 11:26 | 显示全部楼层

也学习你的分析方法。

回答:<br />1、没有休眠工作;<br />2、AD使用的电压基准是电源;<br />3、AD转换的信号源是电位器(测试用),输入阻抗静态是0~1.7k小于2.5K;<br />4、AD时将电位器一端连接AN0,一端连接地,没有滤波措施;<br />5、AD转换速度要求不高,这个芯片可以满足,<br />&nbsp;&nbsp;&nbsp;下面是我一次AD的代码:<br />#define&nbsp;N&nbsp;&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=N;i&gt0;i--)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//求n次转换结果的平均值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADCON0&nbsp;|=&nbsp;0X02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开启转换过程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(ADCON0&nbsp;&&nbsp;0X02);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待转换完成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result=result+(ADRESH&lt&lt2)+(ADRESL&gt&gt6);&nbsp;&nbsp;//累计转换结果<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(t=0;t&lt2;++t)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result=(result)/N;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//求n次结果的平均值
 楼主| dsoyy 发表于 2008-7-24 11:28 | 显示全部楼层

N=1 是 为了分析单次AD结果

难道是采样没有滤波的原因?
yewuyi 发表于 2008-7-24 11:44 | 显示全部楼层

18F4520的AD操作一般需要的几个要求:

1、先读ADRESH,再读ADRESL<br />2、输入的最大等效阻抗不超过2.5K(在上面所说的10K在此是错误的)<br />3、一旦确定好AD通道和控制寄存器,尽量避免切换AD通道和控制寄存器等,每次切换通道或者改变控制寄存器后,应该放弃第一次转换值,从第二次转换开始取数(例如AVR就对此提出了明确要求,MCP一般不太强调这,但建议养成良好习惯)<br />4、AD输入口做抗混叠滤波的小瓷片电容是必须的<br />5、基准电压的选取也很关键,如果你的信号很稳定,但基准电压不稳定,那么转换值不稳定就很正常<br />6、如果有休眠唤醒操作,建议在唤醒后放弃第一次转换数据<br />7、AD转换期间,尽量不要操作大功率负载动作<br />8、AD转换时钟选择也很关键,如果你的OSC=11.0592M的话,建议的ADCS2~ADCS0=16Tosc,如果对功耗不太关心的话,建议使用内部的RC做你的AD转换时钟,你所说的采集时钟设置位12&nbsp;TAD我没找到,不知道你在那设置的?<br /><br />看手册比较匆忙,你先对付着测试一下看看效果。<br />
yewuyi 发表于 2008-7-24 11:48 | 显示全部楼层

这是什么?

result=result+(ADRESH&lt&lt2)+(ADRESL&gt&gt6);&nbsp;&nbsp;//累计转换结果<br /><br /><br /><br /><br /><br />我一般是右对齐,大致代码如下:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GODONE=ture;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(GODONE==ture){}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;advalbuf=ADRESH&lt&lt8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;advalbuf=advalbuf+ADRESL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adval=adval+advalbuf;<br />
yewuyi 发表于 2008-7-24 11:49 | 显示全部楼层

另外,你的程序有没有开中断?

中断是怎么工作的?
yewuyi 发表于 2008-7-24 11:52 | 显示全部楼层

~~

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;measureCount++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(measureCount&lt=512){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(measureCount%8){}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GODONE=ture;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(GODONE==ture){}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;advalbuf=ADRESH&lt&lt8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;advalbuf=advalbuf+ADRESL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adval=adval+advalbuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;measureCount=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />以上代码在定时中断中4MS调用一次<br />
 楼主| dsoyy 发表于 2008-7-24 12:40 | 显示全部楼层

非常感谢

我的采集时钟设置在&nbsp;初始化:<br />void&nbsp;InitAD(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ADCON1&nbsp;=&nbsp;0X06;&nbsp;&nbsp;&nbsp;//AN0~AN8为模拟引脚,并设置数字IO和参考电压。<br />&nbsp;&nbsp;&nbsp;&nbsp;ADCON0&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;//选择AN0通道,使能A/D&nbsp;转换器模块<br />&nbsp;&nbsp;&nbsp;&nbsp;ADCON2&nbsp;=&nbsp;0x29;&nbsp;&nbsp;&nbsp;//AD结果左对齐,AD采集时间12&nbsp;TAD,A/D&nbsp;转换时钟&nbsp;FOSC/4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRISA&nbsp;|=&nbsp;0X01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置RA0为输入<br />&nbsp;&nbsp;&nbsp;&nbsp;ADCON0&nbsp;=&nbsp;(ADCON0&nbsp;&&nbsp;~0X3C&nbsp;)&nbsp;|&nbsp;0X00;&nbsp;//选择通道0<br />}<br /><br />我0.1s向PC发送一次采样结果,用的是中断。<br /><br /><br /><br />您的很多代码很值得我借鉴,很感谢你的热心,非常感谢。<br />刚刚我在AD入口增加一个104,效果得到很大改善。<br /><br />以后会经常来看帖子,请多指教!
yewuyi 发表于 2008-7-24 13:17 | 显示全部楼层

A/D 转换时钟 FOSC/4建议改成FOSC/16

  
 楼主| dsoyy 发表于 2008-7-24 13:44 | 显示全部楼层

请问这个的原则或依据是什么

我知其然不知其所以然,下次遇到又晕了
 楼主| dsoyy 发表于 2008-7-24 15:00 | 显示全部楼层

没有解决

还是偶尔出现一个偏差比较大的数据
yewuyi 发表于 2008-7-24 15:12 | 显示全部楼层

一般要求Tad在1.6US~9US之间

尽量取4US左右,建议你不要采用通信上传PC的方式看,建议你采用定时4MS中断采样一次的方法进行转换,先用ICD2看看实际数据是否正确。
 楼主| dsoyy 发表于 2008-7-24 15:22 | 显示全部楼层

原因找到

基准用电源,电源出现脉冲干扰信号,在改良硬件。<br /><br />非常感谢你的热心帮助,以后关于AD的分析我思路清晰了。
 楼主| dsoyy 发表于 2008-7-24 15:47 | 显示全部楼层

为什么你的程序8次AD取一次结果

&nbsp;&nbsp;而不是连续采样8次?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

566

帖子

3

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