打印

AD通道转换求助 劳烦前辈进来指点一二了,谢谢

[复制链接]
4069|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fangfei036|  楼主 | 2012-7-18 16:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fangfei036 于 2012-7-18 16:34 编辑

各位前輩們好,關於PIC 16f877 的AD转换通道的疑惑,小弟不解,请多指教:void get_ad()
{

uchar t=1;

uint adval;

float advalf;

switch (t) //switch case 自己感覺也多餘,但是沒有這個結果也不正確啊

{

   case 1:

{

//ADCON0=0x41;

CHS0=0;

CHS1=0;

CHS2=0; //能否這樣直接改變转换通道 RA0/AN0

for(i=0;i<8;i++)

         {

                ADGO=1;

while(ADGO);



                adval=ADRESH;

adval=adval<<8|ADRESL;

                ad_result+=adval;

         }

ad_result= ad_result>>3;

adnum=ad_result;

t++;

break;

}

case 2:

{

CHS0=1;

CHS1=0;

CHS2=0;//能否這樣直接改變转换通道RA1/AN1???

//ADCON0=0x49;

//for(i=0;i<8;i++)

   // {

        ADGO=1;

        adval=ADRESH;

adval=adval<<8|ADRESL;

        ad_result+=adval;

   // }

//ad_result= ad_result>>3;

vccnum=ad_result;

t=1;

break;

}


}
}


設置目的是需要連續获取两个接口的AD值,但是用硬件试了下,只能返回第一个ad的值,第二返回的不正确,请教前辈们指教,或者共享些切换AD通道的思路,或者是代码,谢谢了 修修改改都一天过去了,还没有整出来呢 谢谢了,在修改采样通道寄存器之后,进行了5ms的延时还是不行呢,要晕了
沙发
figo20042005| | 2012-7-18 17:01 | 只看该作者
第二个少了               ADGO=1;

while(ADGO);

查询转化完成步骤

使用特权

评论回复
板凳
figo20042005| | 2012-7-18 17:02 | 只看该作者
可以不用switch CASE,那就用IF吧,一步完成后切换通道,反正就是状态机切换原理

使用特权

评论回复
地板
fangfei036|  楼主 | 2012-7-18 17:17 | 只看该作者
您真仔细,我给忘记了,谢谢,刚加上去试了下,结果还是不正确的,跟计算值查太远了,为啥呢?是不是我不能这样表达我的程序呢?

使用特权

评论回复
5
yimankehao| | 2012-7-18 23:53 | 只看该作者
你的采样子程序永远进不了AD通道2,因为程序是顺序执行的,SWITCH不可能执行两次,每次进入子程序t就被赋值为1了。建议你的AD程序写成子函数。
INT16 Collect_Data(UC8 chn)
{

ADCON0|=(chn<<2);
return ....
}
通过赋值给chn来选择AD通道,最后在返回AD值。

使用特权

评论回复
6
figo20042005| | 2012-7-19 00:11 | 只看该作者
LS说的对

使用特权

评论回复
7
fangfei036|  楼主 | 2012-7-19 08:18 | 只看该作者
謝謝樓上兩位仁兄,可是我是想在一個函數裏面连续获取两个ad值,不需要返回值的函数。怎么表达才好呢?

使用特权

评论回复
8
yewuyi| | 2012-7-19 08:50 | 只看该作者
1、切换AD通道后,必须有一个一定时间的延迟,否则采保电容无法充满电,AD转换当然不可能正确。
2、ADGO的操作要保证正确,请按照DATASHEET进行操作
3、AD的时钟频率设置要正确,具体根据DATASHEET中相关章节进行AD的初始化设置
4、AD的输入阻抗尽量不要超过AD容许的最大阻抗,如果有小幅超出,可以增大AD采保充电时间和AD转换时间对应。
5、其它C语言语法性错误不在此讨论,请自行对应查找。

使用特权

评论回复
9
fangfei036|  楼主 | 2012-7-19 09:37 | 只看该作者
8# yewuyi
叶工的回答总是这么有条理,我好好看看datasheet ,thanks...

使用特权

评论回复
10
fangfei036|  楼主 | 2012-7-19 15:53 | 只看该作者
5# yimankehao
謝謝,按您提供的思路,以及搞定了,謝謝你,謝謝你們 :handshake

使用特权

评论回复
11
fangfei036|  楼主 | 2012-7-19 16:08 | 只看该作者
uint get_ad(uchar ch)
{
         uint adval;
         float advalf;
         ADCON0=ch; //0100 1001 / 0100 0001
         //delay2(2);
         for(i=0;i<8;i++)
          {
              ADGO=1;
                  while(ADGO);
                  adval=ADRESH;
                   adval=adval<<8|ADRESL;
                  ad_result+=adval;
      }
              ad_result= ad_result>>3;
                  adnum=ad_result;
                   return (ad_result);       
}

共享下這段程序,希望同樣是初學者的我們可以相互學習,感謝小弟的師傅跟樓上的前輩們,我剛創建個扣扣群,有希望能跟大家多多學習,多多交流,群號  72691479

使用特权

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

本版积分规则

个人签名:技术力量,决定上层建筑

2

主题

345

帖子

3

粉丝