智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 6906|回复: 19
打印 上一主题 下一主题

[编程类] MC9S12单片机ATD模块

  [复制链接]

2

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
QQ
威望
265
贡献
20
兑换币
0
注册时间
2010-3-7
在线时间
9 小时
跳转到指定楼层
1#
发表于 2010-3-7 19:01:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
问题:在调试单片机ATD模块时,输入模拟电压为2V,单片机测出的数据为192,或者是0,或者是64,总是得不到正确的结果,参考电压VRH,VRL用万用表测试分别是4.096V,0V,每个通道测试出的结果基本上都是一样的。源程序如下,大家看看有什么问题没?

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
volatile unsigned char ad_word=0;
void main()
  {
      unsigned int i = 0;
      EnableInterrupts;
      ATD0CTL2  = 0xc2;             //使能A/D,快速清除标志,在队列转换完成后产生中断
      ATD0CTL3  = 0x08;         //转换队列长度为1,转换完成后暂停
      ATD0CTL4  = 0x80;         //8位精度, 2个时钟, ATDClock=[BusClock*0.5]/[PRS+1]
      ATD0CTL5  = 0xa6;           //结果右对齐,单通道采样,通道选择为通道4
      ATD0DIEN  = 0x00;            // 禁止数字输入
      DDRB      = 0xff;
      PORTB     = 0x00;
      for(;;)
        {
            
        }
  }
  
#pragma CODE_SEG NON_BANKED
void  interrupt 22 AD_Comper(void)
  {
        ad_word =  ATD0DR0L;
         PORTB     =   ad_word;   
  }

2

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
QQ
威望
265
贡献
20
兑换币
0
注册时间
2010-3-7
在线时间
9 小时
2#
 楼主| 发表于 2010-3-7 20:16:39 | 只看该作者
已解决!
原因是这样的,原来我所参考的书籍中的有关寄存器的定义和数据手册上的定义不一样,向数据手册中有ATD0CTL0,ATD0CTL1的定义,并且控制着ADT,所以上面的程序实际上是错误的初始化,所以一直得不到正确的结果,在这里列出来希望能对遇到同样问题的人一个帮助作用吧!
改过的程序如下:
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

unsigned int AD_wData=0;
void main()
  {
      EnableInterrupts;
      ATD0CTL1   = 0x00;        //8位分辨率,不放电
      ATD0CTL2   = 0x62;        //快速清除标志位,中断开启
      ATD0CTL3   = 0xa0;        //队列长度为4,右对齐方式
      ATD0CTL4   = 0x00;        //转换时钟为4个时钟,时钟频率为Fbus/2
      ATD0CTL5   = 0x20;        //单通道连续转换,通道序号为0
      DDRB       = 0xff;
      PORTB      = 0x00;
      for(;;)
        {
        
        }
  }

#pragma CODE_SEG NON_BANKED
void interrupt 22 Int_AD0(void)
{
   DisableInterrupts;
   AD_wData  =  0;
   AD_wData += ATD0DR0L;  //Read out the Result Register
   AD_wData += ATD0DR1L;
   AD_wData += ATD0DR2L;
   AD_wData += ATD0DR3L;
   PORTB = (byte) (AD_wData >> 2);
   EnableInterrupts;
}
回复

使用道具 举报

13

主题

55

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1881
威望
282
贡献
1583
兑换币
24
注册时间
2009-5-14
在线时间
8 小时
3#
发表于 2010-3-13 10:28:52 | 只看该作者
呵呵  谢了   我也遇到了这样的问题
回复

使用道具 举报

15

主题

203

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4489

论坛元老奖章

QQ
威望
484
贡献
3979
兑换币
0
注册时间
2010-2-25
在线时间
13 小时
4#
发表于 2010-3-13 15:59:45 | 只看该作者
回复

使用道具 举报

15

主题

90

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1792
QQ
威望
542
贡献
1094
兑换币
0
注册时间
2010-1-11
在线时间
78 小时
5#
发表于 2010-3-15 10:43:29 | 只看该作者
学习了
回复

使用道具 举报

11

主题

212

帖子

0

精华

常驻嘉宾

侠客

Rank: 8Rank: 8

积分
5969

论坛元老奖章

威望
2649
贡献
3234
兑换币
0
注册时间
2010-1-13
在线时间
43 小时
6#
发表于 2010-3-23 11:38:25 | 只看该作者
请问,你用的是mc9s12xs128么?还是其他的?若是前者的MCU,ATD0CTL0,ATD0CTL1就不用定义管他么?谢谢!
回复

使用道具 举报

627

主题

904

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4955
QQ
威望
2250
贡献
1269
兑换币
898
注册时间
2009-11-21
在线时间
718 小时
7#
发表于 2010-3-23 14:16:04 | 只看该作者
hao
回复

使用道具 举报

6

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
威望
289
贡献
33
兑换币
0
注册时间
2009-6-15
在线时间
28 小时
8#
发表于 2010-3-24 17:55:57 | 只看该作者
本人是新手,想请问下如果程序正确你说的模拟输入电压是2V,那么单片机测出数据是多少才是正确结果呢?为什么?期待解答。
回复

使用道具 举报

4

主题

207

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
QQ
威望
1255
贡献
688
兑换币
0
注册时间
2009-11-12
在线时间
25 小时
9#
发表于 2010-3-24 19:15:35 | 只看该作者
新手谢过
回复

使用道具 举报

6

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
威望
289
贡献
33
兑换币
0
注册时间
2009-6-15
在线时间
28 小时
10#
发表于 2010-3-25 16:47:45 | 只看该作者
楼主给解答一下呗。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-6 16:51 , Processed in 0.146030 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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