• TMS320C5509A自带ADC配置参数计算


    TMS320C5509A自带ADC使用起来比较方便,但是确定参数比较麻烦。作者尝试使用程序计算出来,方便DSP自带ADC的使用。设计的程序可 直接计算出TMS320C5509A自带ADC配置参数,以十六进制形式输出结果,方便可用。本文转载、引用请注明出处(http://blog.csdn.net/xikedxk/article/details/51068181,或http://www.cnblogs.com/xikeguanyu/articles/5516645.html)。

    [另外作者发现,TI的TMS320VC5509 DSP Analog-to-Digital Converter (ADC)Reference Guide(2003年10月版,spru586a)中11页关于ADC Sample and Hold Period值的公式有错误之处。]

    开发平台:VC++6.0、Visual Studio2010(均亲测可用)。

     1 void calcu_ADCConfig(double fcpu,double fs)
     2 {
     3     /*
     4 参数说明:
     5 fcpu,CPU时钟频率(MHz);fs,要求的采样速率(Hz)。
     6 
     7 */
     8     double Ts=0,fadc=0,fconv=0,Tconv=0,Th=0;
     9     double samptimediv=0.0;
    10     int cpuclkdiv,convratediv;
    11     int i,count=0;
    12     
    13     fcpu=fcpu*1000000;   // Hz
    14     Ts=1/fs;          // 采样周期
    15     
    16     for(cpuclkdiv=0;cpuclkdiv<256;cpuclkdiv++)
    17     {
    18         fadc=fcpu/(cpuclkdiv+1);         //计算ADC时钟频率
    19         for(convratediv = 0; convratediv<16; convratediv++)
    20         {
    21             fconv=fadc/(2*(convratediv+1));   // ADC转换时钟频率
    22             Tconv=1/fconv;                // ADC转换时钟周期
    23             if(fconv<=2000000)            //ADC转换时钟频率不大于 2 MHz
    24             {
    25                 Th=Ts-13*Tconv;   // 由采样速率计算采样保持时间
    26                 if(Th>=0.00004 && Th<=0.0004)    // 不得小于40us   && Th<=0.0004   不大于400us
    27                 {
    28                     samptimediv=fadc*Th/2-(convratediv+1);  //计算samptimediv
    29                     if(samptimediv>=0 && samptimediv <=255)              
    30                         for (i=0;i<256;i++)
    31                         {
    32                             //if (fabs(i-samptimediv)<0.00000000002)  //0.0000000000001
    33                             //float 类型的samptimediv 不能直接和 int 型的i 比较
    34                             if (i==(int)samptimediv)                      //0.00000000000002
    35                             {
    36                                 //printf("cpuclkdiv=%d ; convratediv=%d ; samptimediv=%.8f
    ",cpuclkdiv,convratediv,samptimediv);   
    37                                 /*
    38                                 cout<<"cpuclkdiv= "<<cpuclkdiv<<";  ";
    39                                 cout<<"convratediv= "<<convratediv<<";  ";
    40                                 cout<<"samptimediv= "<<samptimediv<<"
    ";  
    41                                 */
    42                                 if( ((int)(samptimediv*1000000)) % (1000000*(int)samptimediv) ==0)   //比较大小,samptimediv=0~255
    43                                 {
    44                                     count=count+1;
    45                                     printf("cpuclkdiv= %d ; convratediv= %d ; samptimediv= %.6f
    ",cpuclkdiv,convratediv,samptimediv); 
    46                                     printf("cpuclkdiv=0x%X ; convratediv=0x%X ; samptimediv=0x%X
    ",cpuclkdiv,convratediv,(int)samptimediv); 
    47                                     printf("ADCCLKCTL=0x00%X ; ADCCLKDIV=0x%X0%X
    
    ",cpuclkdiv,(int)samptimediv,convratediv); 
    48                                 }
    49                             }
    50                         }
    51                 }
    52             }
    53         }
    54     }
    55     cout<<endl;
    56     printf("总个数--------Count = %d 
    
    ",count);
    57 }

    TMS320C5509A ADC参数计算。
    功能:直接在运行输出窗口以十六进制形式输出ADC配置参数(cpuclkdiv,convratediv,samptimediv,详见参考手册);也可以输出寄存器形式(ADCCLKCTL、ADCCLKDIV)。

    以下为测试程序。
    ------------------------------------------------------------------------------------------------
    #include <iostream>
    #include <math.h>
    using namespace std;

    void calcu_ADCConfig(double fcpu,double fs);


    int main()
    {
    double fcpu=144;    //CPU时钟频率(MHz)
    double fs=2000;     //要求的采样速率(Hz)

    double fadc,fadc_conv,x;   // fadc:ADC时钟;  fadc_conv:ADC转换时钟  
    double cpuclkdiv,convratediv,samptimediv;    


    calcu_ADCConfig(fcpu,fs);


    //--------------------------------------------------------------
    //---------------结果验证---------------------------------------
    cpuclkdiv= 143 ; convratediv= 8 ; samptimediv= 124.000000;
    fcpu = fcpu*1000000;   //CPU时钟 144MHz
    fadc=fcpu/(cpuclkdiv+1);    //ADC时钟
    fadc_conv = fadc/(2*(convratediv + 1));     //ADC转换时钟  
    x= 13/fadc_conv + 2*(convratediv+samptimediv+1)/fadc;   // 采样周期
    //  ADC采样保持时间     +    采样保持时间
    printf("采样周期: Ts=%.8f ",x);
    printf("采样速率: fs=%.4f ",1/x);
    //--------------------------------------------------------------

    return 0;
    }

    运行结果截图:

  • 相关阅读:
    BorderContainer 背景透明一不小心就解决了!
    C#编程应用线程与委托
    第二次SQL RAP要点
    最近的学习
    BW中传输的问题
    7月总结Dotnetnuke的研究总结
    EP学习要点记忆
    盲人摸象SAP PS模块的介绍与讨论
    如何跨Client删除数据
    如何修改Portal与BW系统的链接域名
  • 原文地址:https://www.cnblogs.com/xikeguanyu/p/5516645.html
Copyright © 2020-2023  润新知