5911|4

44

帖子

17

TA的资源

一粒金砂(中级)

楼主
 

关于ADC转换问题,例程感觉很奇怪,没看明白,希望大家点拨下 [复制链接]

以下是厂家提供的例程,注释部分是自己查资料加的
/*********************************************************************
** Module Name:  AD               **
** Author:          CTH              **
** Version:      1.0              **
** CreateDate:      2009-8-10            **
** Description:                         **
** Remark:                     **
** Revision History: 2009-8-10            **
**  Web:    http://www.study-kit.com     **
**********************************************************************/
/*********************************************************************
** 实验目的: 测试与使用DSP内部资源AD两个通道                       **
** 实验说明:nADC0通道0存放数据   nADC1 通道1存放数据               **
**********************************************************************/

/*ADC寄存器*/
ioport unsigned int *ADCCTL1=(unsigned int *)0x6800;  //ADC控制寄存器1
ioport unsigned int *ADCDATA1=(unsigned int *)0x6801; //ADC数据寄存器1
ioport unsigned int *ADCCLKDIV1=(unsigned int *)0x6802; //ADC时钟分频寄存器1
ioport unsigned int *ADCCLKCTL1=(unsigned int *)0x6803; //ADC时钟控制寄存器1
/*寄存器值宏定义*/
#define ADCCTL (*ADCCTL1)
#define ADCDATA (*ADCDATA1)
#define ADCCLKDIV (*ADCCLKDIV1)
#define ADCCLKCTL (*ADCCLKCTL1)
/*配置函数声明*/
void interrupt tint( void );
void CLK_init( void );
void SDRAM_init( void );
void INTR_init( void );
void TIME_init(void);
void TMCR_Reset( void );
void SetDSPPLL(unsigned int uPLL);
void InitADC();
void wait( unsigned int cycles );
void EnableAPLL( );
unsigned int nADC0[256],nADC1[256]; //10位数据位,可能的离散值有1024个,为什么是256?
main()
{
int i;
unsigned int uWork;

    EnableAPLL();   //使能数字锁相环
InitADC();      //ADC初始化
    PLL_Init(132);  //锁相环初始化
while ( 1 )
{
  for ( i=0;i<256;i++ )
  {
   ADCCTL=0x8000; // 启动AD转换,通道0
   do
   {
    uWork=ADCDATA;        //数据寄存器的值赋给uwork 变量
   } while ( uWork&0x8000 ); //模数转换开始,转换结束的标志是ADstart=0
   nADC0=uWork&0x0fff;
  }
  for ( i=0;i<256;i++ )
  {
   ADCCTL=0x9000; // 启动AD转换,通道1
   do
   {
    uWork=ADCDATA;
   } while ( uWork&0x8000 );
   nADC1=uWork&0x0fff; //这里的&表示什么含义?
  }
  asm( " nop");  // break point 在这里设断点
}
}
/**********************************************************************************
**(1) 模数转换器时钟ADCclk=144/(35+1)=4MHz
**(2) 模数转换时钟 ADC conversion clk = ADC clk/(2*(ConvRateDiv+1)=2MHz(最大)
      ADC 转换时间=13*(1/ADC conversion clk)=13*(1/2)=6.5us
**(3)采样保持时间=(1/ADCclk)/(2*(ConvRateDiv+1+SampTimeDiv))
                 =(1/4)/(2*(0+1+79))
     =250ns*(2*(0+1+79))=40us
由此:整个转换时间=采样保持时间+转换时间=40+6.5=46.5us
      采样率=1/46.5=21.5KHz
***********************************************************************************/
void InitADC()
{
ADCCLKCTL=0x23;    // 4MHz ADCLK 系统主时钟分频 cpuCLkDiv=35
ADCCLKDIV=0x4f00; // 采样和保持时间设置 SampTimeDiv=79,ConvRateDiv=0
}
void wait( unsigned int cycles )
{
    int i;
    for ( i = 0 ; i < cycles ; i++ ){ }
}
/* 访问DSP I/O空间,借助关键字ioport来实现
   访问DSP 片上外设方法是借助外设的映射寄存器地址
   定义借助 volatile关键字       */
void EnableAPLL( )
{
    /* Enusre DPLL is running */
    *( ioport volatile unsigned short* )0x1f00 = 4;

    wait( 25 );
    *( ioport volatile unsigned short* )0x1f00 = 0;
    // MULITPLY
    *( ioport volatile unsigned short* )0x1f00 = 0x3000;

    // COUNT
    *( ioport volatile unsigned short* )0x1f00 |= 0x4F8;

    wait( 25 );
    //*( ioport volatile unsigned short* )0x1f00 |= 0x800
    // MODE
    *( ioport volatile unsigned short* )0x1f00 |= 2;

    wait( 30000 );
    // APLL Select
    *( ioport volatile unsigned short* )0x1e80 = 1;

    // DELAY
    wait( 60000 );
}


不明白的是
(1)EnableApLL()函数的作用是什么?里面的代码又该如何解释?
(2)ADC转换后是10位数据位,应该有2的10次方,共1024个离散值,但是nADC0[256],nADC1[256]是256,也就是只采样256次,这样模数转换之后的数据不是丢失了一部分?还是说表示其他含义?

最新回复

程式碼就看你怎麼寫, 你可以寫得很結構化,例如將所有參數寫成PLL_Config 也可以如您貼的文章,一個一個暫存器去初始化 ARRAY= C語言陣列 = 用來存放相同資料型態的資料集合 大大可能要在溫習一下C語言,與8051,DSP書  详情 回复 发表于 2014-3-27 07:59
点赞 关注
 

回复
举报

26

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
(1)EnableApLL()函数的作用是什么?里面的代码又该如何解释?
應該是倍頻除頻成ADC Module可用的CLOCK訊號

(2)ADC转换后是10位数据位,应该有2的10次方,共1024个离散值,但是nADC0[256],nADC1[256]是256,也就是只采样256次,这样模数转换之后的数据不是丢失了一部分?还是说表示其他含义?
10bit ADC 每次轉換後可以得到 0xOOO 資料
nADC0[256],nADC1[256] 是ARRAY吧, 可以放 256筆 0XOOO資料


点评

这个能大概猜到是设置系统时钟的问题,但是代码里面的语句该如何解释?为什么用这个函数来设置系统时钟?用PLL_config结构体不行吗? 还有你说的ready是什么意思?能否说得详细点,谢谢  详情 回复 发表于 2014-3-26 22:20
 
 

回复

44

帖子

17

TA的资源

一粒金砂(中级)

板凳
 
justin0710 发表于 2014-3-26 08:25
(1)EnableApLL()函数的作用是什么?里面的代码又该如何解释?
應該是倍頻除頻成ADC Module可用的CLOCK訊 ...

这个能大概猜到是设置系统时钟的问题,但是代码里面的语句该如何解释?为什么用这个函数来设置系统时钟?用PLL_config结构体不行吗?
还有你说的ready是什么意思?能否说得详细点,谢谢
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

4
 
程式碼就看你怎麼寫,
你可以寫得很結構化,例如將所有參數寫成PLL_Config
也可以如您貼的文章,一個一個暫存器去初始化

ARRAY= C語言陣列 = 用來存放相同資料型態的資料集合
大大可能要在溫習一下C語言,與8051,DSP書

点评

好吧,表示对你写的繁体字看得吃力,所以。。。。。。。。。。  详情 回复 发表于 2014-3-27 14:20
 
 
 

回复

44

帖子

17

TA的资源

一粒金砂(中级)

5
 
justin0710 发表于 2014-3-27 07:59
程式碼就看你怎麼寫,
你可以寫得很結構化,例如將所有參數寫成PLL_Config
也可以如您貼的文章,一個一個暫 ...


好吧,表示对你写的繁体字看得吃力,所以。。。。。。。。。。
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 1

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表