以下是厂家提供的例程,注释部分是自己查资料加的
/*********************************************************************
** 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次,这样模数转换之后的数据不是丢失了一部分?还是说表示其他含义? |