智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 6728|回复: 23
打印 上一主题 下一主题

[咨询] AD单通道连续采样问题

  [复制链接]

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
跳转到指定楼层
1#
发表于 2012-12-4 22:45:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想问一下我看往届的报告,采用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();
         }
    }

49

主题

3751

帖子

1

精华

顶级版主

Rank: 11Rank: 11Rank: 11Rank: 11

积分
27948

资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章技术大牛奖章

威望
10632
贡献
10964
兑换币
4564
注册时间
2010-11-23
在线时间
3176 小时
2#
发表于 2012-12-4 23:25:01 | 只看该作者
你前面说单通道,后面又说1~7通道,到底几个啊。
回复 支持 反对

使用道具 举报

16

主题

1510

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5586

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
2953
贡献
1231
兑换币
29
注册时间
2012-6-2
在线时间
702 小时
3#
发表于 2012-12-5 08:40:43 | 只看该作者
表示看不懂
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
4#
 楼主| 发表于 2012-12-5 10:34:46 | 只看该作者
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通道转换的值么??
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
5#
 楼主| 发表于 2012-12-5 10:37:28 | 只看该作者
ludlee 发表于 2012-12-5 08:40
表示看不懂

每次采样一个通道(通道i,i从0到7),从0通道依次采集到7通道,但是每次都是读取结果寄存器0的值,那岂不是只能得到与0通道相连的那个传感器的值?
回复 支持 反对

使用道具 举报

49

主题

3751

帖子

1

精华

顶级版主

Rank: 11Rank: 11Rank: 11Rank: 11

积分
27948

资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章技术大牛奖章

威望
10632
贡献
10964
兑换币
4564
注册时间
2010-11-23
在线时间
3176 小时
6#
发表于 2012-12-5 11:16:52 | 只看该作者
具体什么样也不清楚,自己试试吧。
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

高级会员

Rank: 4

积分
673
威望
333
贡献
210
兑换币
172
注册时间
2012-11-5
在线时间
65 小时
7#
发表于 2012-12-5 11:36:46 | 只看该作者
  是电磁  你这是放大多少倍  一块交流一下 我现在这块也纠结
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
8#
 楼主| 发表于 2012-12-5 15:57:05 | 只看该作者
陌熙 发表于 2012-12-5 11:36
是电磁  你这是放大多少倍  一块交流一下 我现在这块也纠结

放大还没搞呢 ,我先把程序的主体先写出来,还没开始做噢   应该要通过计算感应产生的电流,电流通过电压形成电压,可能电阻不同的话 放大倍数应该不同的噢,亲!(个人看法)
回复 支持 反对

使用道具 举报

42

主题

1054

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3034

优秀会员奖章活跃会员奖章

QQ
威望
1650
贡献
780
兑换币
625
注册时间
2012-7-6
在线时间
302 小时
9#
 楼主| 发表于 2012-12-5 17:32:51 | 只看该作者
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;
    }
}
回复 支持 反对

使用道具 举报

29

主题

637

帖子

0

精华

常驻嘉宾

我是孤独的赛车手 车手是不需要女人的

Rank: 8Rank: 8

积分
3136
威望
1664
贡献
630
兑换币
621
注册时间
2011-4-16
在线时间
421 小时
10#
发表于 2012-12-5 17:48:32 | 只看该作者
穆旦阿斗 发表于 2012-12-5 17:32
麻烦看下这个AD采集程序 初始化时7通道采样,我是想每个传感器采样11次,用一个二维数组存储采样值,但是 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 18:28 , Processed in 0.245598 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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