打印

PIC18F4520 AD有脉冲信号?

[复制链接]
4453|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dsoyy|  楼主 | 2008-7-22 14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我测量电位器电压,用交流给板子供电,连续采样10次结果如下:
219 221 216 217 216 220 217 249 218 216
波动比较大,几乎每一段时间有一个较大值如249

用直流供电连续采样10次结果如下:
218 218 215 217 218 218 225 216 228 217
几乎每一段时间有2个较大数值。  

用万用表测量信号是恒定的,没有脉冲。
我的晶振为11.0592,其中有2个寄存器设置存在疑惑,不知是否这里的原因:

A/D 采集时间选择位,因为是10位AD,我选择了101 = 12 TAD;
A/D 转换时钟选择位,我选择了001 = FOSC/8

不知道是否这里影响,出现了波动。
清大家帮忙指教。








沙发
dsoyy|  楼主 | 2008-7-22 14:14 | 只看该作者

这是我看到的帖子




影响AD精度的原因:参考电压,采样时间,采样电阻,转换时间 


参考电压对AD结果直接造成影响,一般误差是固定偏高或偏低。
采样时间过短可能导致数据误差紊乱,有时偏高有时偏低,具体看转换通道时前一个通道和后一个通道之间的电压差。
采样电阻就是AD的输入电阻,不要大于10K,大于10K结果就有可能就偏低。
转换时间就是AD时钟,推荐2-4微秒,过快精度不够,过慢结果偏低 
 

使用特权

评论回复
板凳
xhy_axb| | 2008-7-23 07:48 | 只看该作者

回复

和我以前用4520遇到的问题差不多。我怎么调程序都没有解决问题。同样的程序放到其它的单片机上没问题。我最后改型了

使用特权

评论回复
地板
dsoyy|  楼主 | 2008-7-24 09:55 | 只看该作者

不会吧

真如你所说就麻烦了,我再搜集资料想办法解决。

使用特权

评论回复
5
dsoyy|  楼主 | 2008-7-24 10:24 | 只看该作者

我使用PIC18F4520进行AD

,结果偶尔会出现一个较大偏差和几个偏小数值,用直流电源改善很多,但无法彻底清除,干扰大小随采样信号大小而变化,

使用特权

评论回复
6
yewuyi| | 2008-7-24 10:25 | 只看该作者

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

使用特权

评论回复
7
yewuyi| | 2008-7-24 10:52 | 只看该作者

先回答几个问题俺再分析

1、有没有休眠工作?
2、AD使用的电压基准是什么?
3、AD转换的信号源是什么?输入阻抗是多少?
4、AD输入口有没有抗混叠滤波?
5、你对AD转换的速度要求是多少?


18F4520出问题的可能很小,这个芯片也是很多人在用的型号,从你反映的现象看,应该还是你的信号部分的硬件或者代码有问题。

使用特权

评论回复
8
dsoyy|  楼主 | 2008-7-24 11:26 | 只看该作者

也学习你的分析方法。

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

         for (t=0;t<2;++t)
           {}
      }
        result=(result)/N;       //求n次结果的平均值

使用特权

评论回复
9
dsoyy|  楼主 | 2008-7-24 11:28 | 只看该作者

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

难道是采样没有滤波的原因?

使用特权

评论回复
10
yewuyi| | 2008-7-24 11:44 | 只看该作者

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

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

看手册比较匆忙,你先对付着测试一下看看效果。

使用特权

评论回复
11
yewuyi| | 2008-7-24 11:48 | 只看该作者

这是什么?

result=result+(ADRESH<<2)+(ADRESL>>6);  //累计转换结果





我一般是右对齐,大致代码如下:

                              GODONE=ture;
                              while(GODONE==ture){}
                              advalbuf=ADRESH<<8;
                              advalbuf=advalbuf+ADRESL;
                              adval=adval+advalbuf;

使用特权

评论回复
12
yewuyi| | 2008-7-24 11:49 | 只看该作者

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

中断是怎么工作的?

使用特权

评论回复
13
yewuyi| | 2008-7-24 11:52 | 只看该作者

~~

     measureCount++;
     if(measureCount<=512){
                          if(measureCount%8){}
                          else{
                              GODONE=ture;
                              while(GODONE==ture){}
                              advalbuf=ADRESH<<8;
                              advalbuf=advalbuf+ADRESL;
                              adval=adval+advalbuf;
                              }
                         }
     else{
          measureCount=0;
         }
以上代码在定时中断中4MS调用一次

使用特权

评论回复
14
dsoyy|  楼主 | 2008-7-24 12:40 | 只看该作者

非常感谢

我的采集时钟设置在 初始化:
void InitAD(void)
{
    ADCON1 = 0X06;   //AN0~AN8为模拟引脚,并设置数字IO和参考电压。
    ADCON0 = 0x01;   //选择AN0通道,使能A/D 转换器模块
    ADCON2 = 0x29;   //AD结果左对齐,AD采集时间12 TAD,A/D 转换时钟 FOSC/4

         TRISA |= 0X01;      //设置RA0为输入
    ADCON0 = (ADCON0 & ~0X3C ) | 0X00; //选择通道0
}

我0.1s向PC发送一次采样结果,用的是中断。



您的很多代码很值得我借鉴,很感谢你的热心,非常感谢。
刚刚我在AD入口增加一个104,效果得到很大改善。

以后会经常来看帖子,请多指教!

使用特权

评论回复
15
yewuyi| | 2008-7-24 13:17 | 只看该作者

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

使用特权

评论回复
16
dsoyy|  楼主 | 2008-7-24 13:44 | 只看该作者

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

我知其然不知其所以然,下次遇到又晕了

使用特权

评论回复
17
dsoyy|  楼主 | 2008-7-24 15:00 | 只看该作者

没有解决

还是偶尔出现一个偏差比较大的数据

使用特权

评论回复
18
yewuyi| | 2008-7-24 15:12 | 只看该作者

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

尽量取4US左右,建议你不要采用通信上传PC的方式看,建议你采用定时4MS中断采样一次的方法进行转换,先用ICD2看看实际数据是否正确。

使用特权

评论回复
19
dsoyy|  楼主 | 2008-7-24 15:22 | 只看该作者

原因找到

基准用电源,电源出现脉冲干扰信号,在改良硬件。

非常感谢你的热心帮助,以后关于AD的分析我思路清晰了。

使用特权

评论回复
20
dsoyy|  楼主 | 2008-7-24 15:47 | 只看该作者

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

  而不是连续采样8次?

使用特权

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

本版积分规则

144

主题

566

帖子

3

粉丝