智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4345|回复: 8
打印 上一主题 下一主题

[单片机] 对同一模拟量进行4次采样,而采样结果却有很大的不同。

[复制链接]

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
威望
177
贡献
22
兑换币
0
注册时间
2009-4-11
在线时间
17 小时
跳转到指定楼层
1#
发表于 2009-6-7 08:53:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
龙丘有个ADC的初始化程序是这样的:
void AD_Init(void)
{
ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch
ATD0CTL2=0x40; //禁止外部触发, 中断禁止
ATD0CTL3=0xa0; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转
ATD0CTL4=0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]
ATD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样
ATD0DIEN=0x00; //禁止数字输入
}
我理解是:对通道0连续进行4次采样,不断循环。每一轮采样的结果存放在ATDDR0,ATDDR1,ATDDR2和ATDDR3中。
我用开发板进行了调试。通过改变AN0的模拟输入进行测试。测试结果如下:
模拟输入1: ADDR0 1.68 ; ADDR1 2.21 ; ADDR2 2.25; ADDR3 2.78
模拟输入2: ADDR0 1.45 ; ADDR1 2.03 ; ADDR2 2.50; ADDR3 2.31
模拟输入3: ADDR0 1.09 ; ADDR1 1.86 ; ADDR2 2.31; ADDR3 2.58
我的问题是:为什么对同一输入进行4次采样,而采样结果却有很大的差别呢?

难道这就是要加入滤波算法的原因吗?还是我对程序理解有错误?
请大家给些提示。谢谢!

0

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
威望
707
贡献
355
兑换币
326
注册时间
2009-5-6
在线时间
76 小时
2#
发表于 2009-6-7 10:43:29 | 只看该作者
采样序列的个数貌似指的是每次采样的通道个数,而不是说连续转换的次数。
回复

使用道具 举报

22

主题

518

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
6442
QQ
威望
943
贡献
5041
兑换币
99
注册时间
2008-2-26
在线时间
229 小时
3#
发表于 2009-6-7 11:09:35 | 只看该作者
采样序列是指每次转化的通道个数,比如说选择了4代表四个通道为一个序列,对这四个通道采样转化,况且对一路通道进行转换时,转化后的值应该在ADDR0中存放
回复

使用道具 举报

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
威望
177
贡献
22
兑换币
0
注册时间
2009-4-11
在线时间
17 小时
4#
 楼主| 发表于 2009-6-7 15:54:19 | 只看该作者
采样序列是指每次转化的通道个数,比如说选择了4代表四个通道为一个序列,对这四个通道采样转化,况且对一路通道进行转换时,转化后的值应该在ADDR0中存放
zdhly0401 发表于 2009-6-7 11:09


谢谢你的提醒。我又看了看应该是对4个通道采样转换。但新的问题是,我在开发板上只连接了通道0,也就是说只有通道0有模拟输入量。其余3路并没有模拟输入,怎么就有了采样结果呢?
回复

使用道具 举报

22

主题

518

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
6442
QQ
威望
943
贡献
5041
兑换币
99
注册时间
2008-2-26
在线时间
229 小时
5#
发表于 2009-6-7 16:23:47 | 只看该作者
4# 艳阳

没有连接就是随机值,因为悬空的状态不确定呀
回复

使用道具 举报

22

主题

518

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
6442
QQ
威望
943
贡献
5041
兑换币
99
注册时间
2008-2-26
在线时间
229 小时
6#
发表于 2009-6-7 17:20:01 | 只看该作者
我帮你写了个小程序,对通道0连续四次转换,转换后放入:ATD0DR0L;ATD0DR1L;ATD0DR2L;ATD0DR3L;之后取平均的,仔细看了下你的初始化程序有问题,这个希望对你有用。




#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/*-----------AD转换初始化--------------------------*/
void ADCInit(void)
{                   //0通道四次转换
  ATD0CTL2=0xC0;  //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断关
  ATD0CTL3=0x22;  //4次转换, No FIFO, Freeze模式下继续转换
  ATD0CTL4=0x85;  // 8位精度,12分频
  ATD0CTL5=0xA0;  //右对齐无符号,单通道采样,通道0
  ATD0DIEN=0x00;  // 禁止数字输入
}

void main(void) {
  word sum=0;
   ADCInit() ;
   DDRB=0XFF;
   PORTB=0X00;
   
  /* put your own code here */
  EnableInterrupts;

  for(;;) {
  ATD0CTL5=0XA0;
  sum=0;
  while(!ATD0STAT0_SCF);
  sum+=ATD0DR0L;
   sum+=ATD0DR1L;
    sum+=ATD0DR2L;
     sum+=ATD0DR3L;
      PORTB=(byte) (sum>>2);
  
  } /* wait forever */
  /* please make sure that you never leave this function */
}
回复

使用道具 举报

29

主题

260

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6709

论坛元老奖章

威望
505
贡献
5874
兑换币
2
注册时间
2009-3-2
在线时间
165 小时
7#
发表于 2009-6-11 11:19:52 | 只看该作者
如果有液晶显示的话会发现悬空的引脚AD值是一个变化非常快的随机值
回复

使用道具 举报

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
8#
发表于 2009-6-11 12:52:01 | 只看该作者
ATD模块有8个结果寄存器,所以它的AD转换有这样的功能,就是对一个或多个通道连续进行转换,将结果顺序放入这8个结果寄存器中。这样用户如果要取一个通道的平均值,或取多个通道的值,都很方便了,就不用软件一次一次地去转换了

理解这个的话对明白为什么要多通道了。
回复

使用道具 举报

9

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
威望
328
贡献
43
兑换币
0
注册时间
2009-11-25
在线时间
43 小时
9#
发表于 2010-3-16 17:13:10 | 只看该作者
回复 6# zdhly0401


    照你的程序改编下进去后怎么PORTB口总是00000000不变啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 08:31 , Processed in 0.562802 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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