智能车制作

标题: AD单通道连续采样问题 [打印本页]

作者: 穆旦阿斗    时间: 2012-12-4 22:45
标题: AD单通道连续采样问题
我想问一下我看往届的报告,采用AD单通道实现对8个传感器的采样。下面是AD部分的程序,他是用dara[0~7]来存储8个传感器的采样值,但是在AD采集时都是用  “while(!ATD0STAT0_SCF); ad_result=ATD0DR0;”这句话来判断转换是否结束,以及保存结果。我不明白一直读ATD0DR0中的值不只是0通道转换的值么??1~7通道的值能从ATD0DR0读出??   难道在单通道下任意读一个结果寄存器???  求高手啊!!!
/********************** AD初始化**********************************/
void ad_init (void)
      {
         ATD0CTL1 = 0x00;              //00为转换精度  无外部触发  40=12位  20=10位 00=8位
         ATD0CTL2 = 0x40;              //禁止外部触发, 中断禁止
         ATD0CTL3 = 0x88;              //右对齐无符号,每序列转换1次(6543-8421), No FIFO, Freeze模式下继续转
         ATD0CTL4 = 0x63;              //765:采样时间为10个AD时钟周期(000=4 001=6 010=8 100=12 101=16 110=20)
                                       //(moren 011=10)prs(5:0)ATDClock=[BusClock*0.5]/[PRS+1]
         ATD0CTL5 = 0x20|i;            //设置采样通道  i通道导通
         ATD0DIEN = 0x00;              //禁止数字信号输入
      }
/********************** AD collect ***************************/
int ad_convent(void)                        //return v-pp of sensor[i];
    {
       int ad_result,max=0,min=256;// give your owm times ;
       char n=0;
       for(n=0;n<16;n++)                    //the times of the convent, the more you give the ans  is more corrct;
         {
           ad_init();
           while(!ATD0STAT0_SCF);           //waiting changed;
           ad_result=ATD0DR0;
           if(ad_result>max) max=ad_result;
           if(ad_result<min) min=ad_result;
         }
       return (max-min);  
    }
/***********************Digital filter*************************/
void ad_answer(void)
    {
       for(i=0;i<8;i++)              //give the solutions to the data[i]
         {
           data[i]=ad_convent();
         }
    }

作者: turf456    时间: 2012-12-4 23:25
你前面说单通道,后面又说1~7通道,到底几个啊。
作者: ludlee    时间: 2012-12-5 08:40
表示看不懂
作者: 穆旦阿斗    时间: 2012-12-5 10:34
turf456 发表于 2012-12-4 23:25
你前面说单通道,后面又说1~7通道,到底几个啊。

说错了,不是有八个传感器(编号0~7)么??data[0~7]存储其值。 用这句话“ATD0CTL5 = 0x20|i”实现选中i通道(i从0~7变化)但是他每次都是读的“ad_result=ATD0DR0”,也就是他虽然根据i的不同采样不同的通道,但是每次读取数据结果寄存器0的值,这不是只能读取0通道转换的值么??
作者: 穆旦阿斗    时间: 2012-12-5 10:37
ludlee 发表于 2012-12-5 08:40
表示看不懂

每次采样一个通道(通道i,i从0到7),从0通道依次采集到7通道,但是每次都是读取结果寄存器0的值,那岂不是只能得到与0通道相连的那个传感器的值?
作者: turf456    时间: 2012-12-5 11:16
具体什么样也不清楚,自己试试吧。
作者: 陌熙    时间: 2012-12-5 11:36
  是电磁  你这是放大多少倍  一块交流一下 我现在这块也纠结
作者: 穆旦阿斗    时间: 2012-12-5 15:57
陌熙 发表于 2012-12-5 11:36
是电磁  你这是放大多少倍  一块交流一下 我现在这块也纠结

放大还没搞呢 ,我先把程序的主体先写出来,还没开始做噢   应该要通过计算感应产生的电流,电流通过电压形成电压,可能电阻不同的话 放大倍数应该不同的噢,亲!(个人看法)
作者: 穆旦阿斗    时间: 2012-12-5 17:32
turf456 发表于 2012-12-4 23:25
你前面说单通道,后面又说1~7通道,到底几个啊。

麻烦看下这个AD采集程序 初始化时7通道采样,我是想每个传感器采样11次,用一个二维数组存储采样值,但是我不小心写了个data[m][7],照理说最大列编号只能到6啊。怎么编译没错? 然后我又改成一维数组试了一下就会出错的
void AD_centre()
{
    #define N 11
    uint data[N][7]={0}; //N行7列
    uint data_max=0;
    uint m,n;
    for(m=0;m<N;m++)
    {   
        AD_init( );               //重新调用ADC初始化程序,防止干扰
        while( !ATD0STAT0_SCF );  //等待转换结束
        data[m][0] = ATD0DR0;           
        data[m][1] = ATD0DR1;
        data[m][2] = ATD0DR2;
        data[m][3] = ATD0DR3;
        data[m][4] = ATD0DR4;
        data[m][5] = ATD0DR5;
        data[m][6] = ATD0DR6;
    }
}

作者: fmadot    时间: 2012-12-5 17:48
穆旦阿斗 发表于 2012-12-5 17:32
麻烦看下这个AD采集程序 初始化时7通道采样,我是想每个传感器采样11次,用一个二维数组存储采样值,但是 ...

C语言编译时不检查数组越界 有时候还需要利用整个小技巧 不过这个对你来说没多大用

作者: fmadot    时间: 2012-12-5 17:51
穆旦阿斗 发表于 2012-12-5 10:37
每次采样一个通道(通道i,i从0到7),从0通道依次采集到7通道,但是每次都是读取结果寄存器0的值,那岂不 ...

这个说起来比较复杂 每次新的转换序列开始后 结果都是从第0个寄存器开始放的 不是一一对应的 不一定7通道就在7号寄存器里 所以读0号寄存器,不过这个方法很不好 效率低,你可以写成一个转换序列连续转换多个通道的 那样速度快效率高

作者: fmadot    时间: 2012-12-5 17:53
另外这个程序局部变量全局变量想到什么用什么 最好别学他 是典型的反面教材  代码效率也很差
作者: turf456    时间: 2012-12-5 18:09
穆旦阿斗 发表于 2012-12-5 17:32
麻烦看下这个AD采集程序 初始化时7通道采样,我是想每个传感器采样11次,用一个二维数组存储采样值,但是 ...

楼上说的对。如果数组越界覆盖到重要数据程序会跑乱的。

作者: 穆旦阿斗    时间: 2012-12-5 22:00
fmadot 发表于 2012-12-5 17:53
另外这个程序局部变量全局变量想到什么用什么 最好别学他 是典型的反面教材  代码效率也很差

有收获!!还请麻烦看下这个AD采集程序 初始化时7通道采样,我是想每个传感器采样11次,用一个二维数组存储采样值,但是我不小心写了个data[m][7],照理说最大列编号只能到6啊。怎么编译没错? 然后我又改成一维数组试了一下就会出错的
void AD_centre()
{
     #define N 11    //采集11次
     uint data[N][7]={0}; //N行7列  //7个传感器
     uint data_max=0;
     uint m,n;
     for(m=0;m<N;m++)
     {   
           AD_init( );               //重新调用ADC初始化程序,防止干扰
           while( !ATD0STAT0_SCF );  //等待转换结束
           data[m][0] = ATD0DR0;           
           data[m][1] = ATD0DR1;
           data[m][2] = ATD0DR2;
           data[m][3] = ATD0DR3;
           data[m][4] = ATD0DR4;
           data[m][5] = ATD0DR5;
           data[m][6] = ATD0DR6;
     }
.....
}
     另外,省略号部分我是先每列冒泡排序,也就是每个传感器的采样值排序。不是采样了11次嘛,然后选第6行(中值)作为每个传感器的采样值,哪个传感器的采样值最大就说明那个传感器离中心最近。
麻烦看看这个方法可以不???  新手啊,车还没开始做,先写程序,望指点!!!  小弟先行谢过

作者: 5768340    时间: 2012-12-5 22:01
拿分了
作者: fmadot    时间: 2012-12-5 23:25
干嘛冒泡排序。。。直接找个最大的就好了啊。。。不放心你平均一下 也比冒泡快。。。这里觉得没必要冒泡  另外二位数组能不能以一维方式取我忘记了。。。应该是可以的
作者: 穆旦阿斗    时间: 2012-12-6 15:15
fmadot 发表于 2012-12-5 23:25
干嘛冒泡排序。。。直接找个最大的就好了啊。。。不放心你平均一下 也比冒泡快。。。这里觉得没必要冒泡  另 ...

谢谢
作者: 风中柳    时间: 2013-2-23 14:47
穆旦阿斗 发表于 2012-12-5 17:32
麻烦看下这个AD采集程序 初始化时7通道采样,我是想每个传感器采样11次,用一个二维数组存储采样值,但是 ...

不知你这个问题解决了么?我现在也遇到这样的问题,如果解决了,麻烦说一下。。。是不是AD模块哪个通道先采集完数据就先放在寄存器0,往后哪个采集后就放到寄存器1,依此类推的呢?????
作者: 石悦    时间: 2013-3-18 22:42
AD转换的结果寄存器有两个,分别是,ATD0STAT0和ATD0STAT2.如果要1-7通道分别判断的话可以用ATD0STAT2中的CCF(n),n就是1-7,也可以干脆就笼统的用ATD0STAT0中的CCF来判断。
作者: DZH    时间: 2013-8-22 10:25
因为每次的转换结果都存储在AD0这个结果寄存器中了。。。

作者: 穆旦阿斗    时间: 2013-8-22 16:46
风中柳 发表于 2013-2-23 14:47
不知你这个问题解决了么?我现在也遇到这样的问题,如果解决了,麻烦说一下。。。是不是AD模块哪个通道先 ...

这个要看你的设置了,fifo位置0是这样的
作者: 穆旦阿斗    时间: 2013-8-22 16:48
DZH 发表于 2013-8-22 10:25
因为每次的转换结果都存储在AD0这个结果寄存器中了。。。

嗯 嗯 现在懂了的,以前是刚从51过度,有点困难
作者: DZH    时间: 2013-8-22 18:14
穆旦阿斗 发表于 2013-8-22 16:48
嗯 嗯 现在懂了的,以前是刚从51过度,有点困难

嗯,相互学习

作者: ℡单身旅行    时间: 2013-8-25 18:24





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2