智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4675|回复: 6
打印 上一主题 下一主题

关于AD转换的代码问题!

[复制链接]

8

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
QQ
威望
361
贡献
32
兑换币
0
注册时间
2010-3-22
在线时间
48 小时
跳转到指定楼层
1#
发表于 2010-4-8 21:28:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了一个电位器输出0V~4.2V,用来做外部触发源,代码写成这样子:
void AD_init(void)     
{
  ATD0CTL2=0xC0;  // 启动A/D, 快速清零, 无等待模式, 禁止外部触发, 中断禁止      1100 0000
  ATD0CTL3=0x08;  // 转换序列长度为1, No FIFO, Freeze模式下继续转换
  ATD0CTL4=0x85;  // 8位精度, 2个AD时钟, ATDClock=[BusClock*0.5]/[PRS+1]=2MHz
  ATD0CTL5=0xA0;  // 右对齐无符号,单通道采样,通道0
  ATD0DIEN=0x00;  // 禁止数字输入
}
void main(void)
{
unsigned char ch;
AD_init();
DDRB=0XFF;
PORTB=0XFF;
for(;;)
{
  while(!ATD0STAT1_CCF0);    // 等待转换结束while(ATDOSTAT1_CCF0==1)
  while(ATD0STAT1_CCF0==1);
  ch=ATD0DR0L;
  PORTB=~ch;
}
}
有如下几个问题:
1、把电位器的输出端接在片子上的AN00口,是不是运行之后我调节电位器比如4.2V的时候为11111110 (254),
     然后我调节到2.1V,B口显示的是不是1111111 (127)?
2、转换结果储存器的选择是用哪个寄存器选择的?能选还是固定的?我这边资料没写。
3、ATD0CTL2禁止外部触发,是不是如果外部触发使能,只有在AN7受到信号之后,ATD0CTL5所决定的输入通道才能开始转换这个意思?

1

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
威望
206
贡献
22
兑换币
0
注册时间
2010-4-8
在线时间
7 小时
2#
发表于 2010-4-9 22:24:41 | 只看该作者
在学习
回复 支持 反对

使用道具 举报

8

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
QQ
威望
361
贡献
32
兑换币
0
注册时间
2010-3-22
在线时间
48 小时
3#
 楼主| 发表于 2010-4-10 21:37:22 | 只看该作者
自己回答吧。
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

word AD_wValue;//AD转换结果




//----------------------------初始化函数-------------------------------//

//-----时钟初始化程序--------//
void PLL_Init(void)      
{                    
  REFDV=1;           
  SYNR=2;
  while(!(CRGFLG&0x08));
  CLKSEL=0x80;
}
//--------------总线时钟=48/2=24MHz------------//

//-----ATD初始化程序--------//
void AD_Init(void)     
{
  ATD0CTL1=0x00; //00000000  选择AD 通道为外部触发,8 位精度,采样前不放电
  ATD0CTL2=0x40; //01000000  标志位自动清零,禁止外部触发, 禁止中断
  ATD0CTL3=0x88; //10001000  右对齐无符号,每次转换1 个序列, No FIFO, Freeze 模式下继续转
  ATD0CTL4=0x01; //00000001  采样时间为4 个AD 时钟周期,PRS=1,ATDClock=24/(2*(1+1))=6MHz
  ATD0CTL5=0x20; //00100000  特殊通道禁止,连续转换,单通道转换,输入通道为0
  ATD0DIEN=0x00; //00000000  禁止数字输入
}
//-----读取AD转换结果--------//
void AD_GetValue(word *AD_wValue)
{
  *AD_wValue=ATD0DR0;  //读取结果寄存器的值
}




//-----主函数--------//
void main(void)
{
  PLL_Init();
  AD_Init();         
  DDRB=0xFF;  
  PORTB=0xFF;
  EnableInterrupts;  
  for(;;)
  {
    while(!ATD0STAT2_CCF0);    // 等待转换结束while(ATDOSTAT2_CCF0==1)
          AD_GetValue(&AD_wValue);   // 读取转换结果
    PORTB = (byte)AD_wValue;   // 在B口显示转换值
  }
}
原来我看的书、网上down的资料写的寄存器都是错的,不知道是不是我这块集成的XS128还是codewarr的问题
回复 支持 反对

使用道具 举报

2

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
QQ
威望
274
贡献
28
兑换币
0
注册时间
2010-3-7
在线时间
7 小时
4#
发表于 2010-4-13 12:42:26 | 只看该作者
额,对了,很多现在“号称”的xs128资料都是dg的。。。
共勉。。。
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
威望
261
贡献
25
兑换币
2
注册时间
2010-1-5
在线时间
3 小时
5#
发表于 2010-4-13 19:43:08 | 只看该作者
以前的车是用dg的!
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
818
QQ
威望
297
贡献
505
兑换币
6
注册时间
2009-12-4
在线时间
8 小时
6#
发表于 2010-4-24 22:37:19 | 只看该作者
怎么是DG的?dg的和xs的在AD上有点去区别。。
回复 支持 反对

使用道具 举报

2

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
威望
263
贡献
21
兑换币
0
注册时间
2010-3-10
在线时间
4 小时
7#
发表于 2010-5-6 16:52:39 | 只看该作者
恩,XS的资料很少,且DG和XS的很多寄存器都不一样了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-6 13:58 , Processed in 0.050732 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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