打印
[DSP编程]

关于AD转换问题,对转换后的结果不太理解

[复制链接]
3411|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ttxs_2013|  楼主 | 2014-3-27 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一下是AD转换的例程,注释是自己加的
/*********************************************************************
**        Module Name:                AD                                                                              **
**        Author:                        CTH                                                                                    **
**        Version:                           1.0                                                                                    **
**        CreateDate:                    2009-8-10                                                                    **
**        Description:                                                                                        **
**        Remark:                                                                                                                **
**        Revision History:        2009-8-10                                                                    **
**********************************************************************/

/*********************************************************************
**        实验目的: 测试与使用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[1024]; //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[i]=uWork&0x0fff;
                }
                for ( i=0;i<256;i++ )
                {
                        ADCCTL=0x9000;        // 启动AD转换,选择通道1
                        do
                        {
                                uWork=ADCDATA;
                        } while ( uWork&0x8000 );
                        nADC1[i]=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)unsigned int nADC0[256],nADC1[1024] 分别定义两个无符号的整型数据,用来保存通道0 和通道1转换后的数据,转换的精度是10位,所以转化后的离散值有1024个,最大为1024,但是这里为什么定义数组的大小为256?下面的采样次数也是256次,有什么道理吗?
(2) 转换后的数值可以通过watch window 观察,但是观察到的值似乎不能知道第几个元素对应什么数值,要观察到全部的数值该怎么看?
还有一个问题是,5509A是内置一个双通道的AD转换器,那么采样值是从哪里得到的?
另外,通过测试发现例程中的函数  EnableAPLL( )的作用就是设置系统时钟,等同PLL_config ()PLL配置函数,这里直接用代码进行初始化、设置系统运行速度,有没有必要掌握?

相关帖子

沙发
zhangmangui| | 2014-3-27 23:02 | 只看该作者
定义的数组是要存放的AD采集的个数  你说的1024是10位AD的最大值   
查看 的时候也就是查看装存入AD采集值得这两个数组

使用特权

评论回复
板凳
ttxs_2013|  楼主 | 2014-3-28 14:05 | 只看该作者
zhangmangui 发表于 2014-3-27 23:02
定义的数组是要存放的AD采集的个数  你说的1024是10位AD的最大值   
查看 的时候也就是查看装存入AD采集值 ...

那数组中的转换值是按照顺序编码的还是说随意的?256个采样值,会不会太少而影响转换的准确性?

使用特权

评论回复
地板
zhangmangui| | 2014-3-28 22:03 | 只看该作者
ttxs_2013 发表于 2014-3-28 14:05
那数组中的转换值是按照顺序编码的还是说随意的?256个采样值,会不会太少而影响转换的准确性? ...

转换精度与存储多少没关系 的   旧的转换值可以溢出   
新的一直送入

使用特权

评论回复
5
yangmm11| | 2014-10-10 16:11 | 只看该作者
你这个AD转换之后的缓存结果,怎样设置可以发送到PC机上?还有就是转换之后的数据和输入的数据,二者之间的幅值如何对应?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

125

帖子

4

粉丝