⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsp28_adc.c

📁 C语言编写的DSP例程,是一个跑马灯程序 希望对初学者有用
💻 C
字号:
//
//      TMDX ALPHA RELEASE
//      Intended for product evaluation purposes
//
//###########################################################################
//
// FILE:	DSP28_Adc.c
//
// TITLE:	DSP28 ADC Initialization & Support Functions.
//
//###########################################################################
//
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  0.55| 06 May 2002 | L.H. | EzDSP Alpha Release
//  0.56| 20 May 2002 | L.H. | No change
//  0.57| 27 May 2002 | L.H. | No change
//###########################################################################

#include "DSP28_Device.h"
#include "math.h"

extern int16  *a1;
extern ADIndex;
void CacluateValue(int AreaNo,int *CaculateMode);
struct ADChannelStruct
{
    float nChannelType;
    float nChannelPara;
    float nChannelValue;
    float nChannelOffSet;
    float nChannelR;
    float nChannelX;
};

struct ADDeviceStruct
{
    int16 nVoltageGroupChannelNo[3];
        
    int16 nCurrentGroupChannelNo[3];
    
    int16 nTanSign[3];
    
    float nTan[3];
};

struct ADChannelStruct* ADChannel=(struct ADChannelStruct*)0x102000;
//struct ADDeviceStruct* ADDevice=(struct ADDeviceStruct*)(0x102000+16*sizeof(struct ADChannelStruct));
struct ADDeviceStruct ADDevice[2];
const float ccos[]={
  0.01000000,  0.00999507,  0.00998027,  0.00995562,  0.00992115,  0.00987688,  0.00982287,  0.00975917,  0.00968583,  0.00960294,
  0.00951057,  0.00940881,  0.00929776,  0.00917755,  0.00904827,  0.00891007,  0.00876307,  0.00860742,  0.00844328,  0.00827081,
  0.00809017,  0.00790155,  0.00770513,  0.00750111,  0.00728969,  0.00707107,  0.00684547,  0.00661312,  0.00637424,  0.00612907,
  0.00587785,  0.00562083,  0.00535827,  0.00509041,  0.00481754,  0.00453991,  0.00425779,  0.00397148,  0.00368125,  0.00338738,
  0.00309017,  0.00278991,  0.00248690,  0.00218143,  0.00187381,  0.00156434,  0.00125333,  0.00094108,  0.00062791,  0.00031411,
  0.00000000, -0.00031411, -0.00062790, -0.00094108, -0.00125333, -0.00156434, -0.00187381, -0.00218143, -0.00248690, -0.00278991,
 -0.00309017, -0.00338738, -0.00368125, -0.00397148, -0.00425779, -0.00453990, -0.00481754, -0.00509041, -0.00535827, -0.00562083,
 -0.00587785, -0.00612907, -0.00637424, -0.00661312, -0.00684547, -0.00707107, -0.00728969, -0.00750111, -0.00770513, -0.00790155,
 -0.00809017, -0.00827081, -0.00844328, -0.00860742, -0.00876307, -0.00891007, -0.00904827, -0.00917755, -0.00929776, -0.00940881,
 -0.00951057, -0.00960294, -0.00968583, -0.00975917, -0.00982287, -0.00987688, -0.00992115, -0.00995562, -0.00998027, -0.00999507,
 -0.01000000, -0.00999507, -0.00998027, -0.00995562, -0.00992115, -0.00987688, -0.00982287, -0.00975917, -0.00968583, -0.00960294,
 -0.00951057, -0.00940881, -0.00929777, -0.00917755, -0.00904827, -0.00891007, -0.00876307, -0.00860742, -0.00844328, -0.00827081,
 -0.00809017, -0.00790155, -0.00770513, -0.00750111, -0.00728969, -0.00707107, -0.00684547, -0.00661312, -0.00637424, -0.00612907,
 -0.00587785, -0.00562083, -0.00535827, -0.00509041, -0.00481754, -0.00453991, -0.00425779, -0.00397148, -0.00368125, -0.00338738,
 -0.00309017, -0.00278991, -0.00248690, -0.00218143, -0.00187381, -0.00156435, -0.00125333, -0.00094108, -0.00062791, -0.00031411,
 -0.00000000,  0.00031411,  0.00062790,  0.00094108,  0.00125333,  0.00156434,  0.00187381,  0.00218143,  0.00248690,  0.00278991,
  0.00309017,  0.00338738,  0.00368124,  0.00397148,  0.00425779,  0.00453990,  0.00481754,  0.00509041,  0.00535827,  0.00562083,
  0.00587785,  0.00612907,  0.00637424,  0.00661312,  0.00684547,  0.00707107,  0.00728969,  0.00750111,  0.00770513,  0.00790155,
  0.00809017,  0.00827081,  0.00844328,  0.00860742,  0.00876307,  0.00891006,  0.00904827,  0.00917755,  0.00929776,  0.00940881,
  0.00951056,  0.00960294,  0.00968583,  0.00975917,  0.00982287,  0.00987688,  0.00992115,  0.00995562,  0.00998027,  0.00999507
 };
const float csin[]={
  0.00000000,  0.00031411,  0.00062791,  0.00094108,  0.00125333,  0.00156434,  0.00187381,  0.00218143,  0.00248690,  0.00278991,
  0.00309017,  0.00338738,  0.00368125,  0.00397148,  0.00425779,  0.00453990,  0.00481754,  0.00509041,  0.00535827,  0.00562083,
  0.00587785,  0.00612907,  0.00637424,  0.00661312,  0.00684547,  0.00707107,  0.00728969,  0.00750111,  0.00770513,  0.00790155,
  0.00809017,  0.00827081,  0.00844328,  0.00860742,  0.00876307,  0.00891007,  0.00904827,  0.00917755,  0.00929776,  0.00940881,
  0.00951057,  0.00960294,  0.00968583,  0.00975917,  0.00982287,  0.00987688,  0.00992115,  0.00995562,  0.00998027,  0.00999507,
  0.01000000,  0.00999507,  0.00998027,  0.00995562,  0.00992115,  0.00987688,  0.00982287,  0.00975917,  0.00968583,  0.00960294,
  0.00951057,  0.00940881,  0.00929776,  0.00917755,  0.00904827,  0.00891007,  0.00876307,  0.00860742,  0.00844328,  0.00827081,
  0.00809017,  0.00790155,  0.00770513,  0.00750111,  0.00728969,  0.00707107,  0.00684547,  0.00661312,  0.00637424,  0.00612907,
  0.00587785,  0.00562083,  0.00535827,  0.00509041,  0.00481754,  0.00453991,  0.00425779,  0.00397148,  0.00368125,  0.00338738,
  0.00309017,  0.00278991,  0.00248690,  0.00218143,  0.00187381,  0.00156435,  0.00125333,  0.00094108,  0.00062791,  0.00031411,
  0.00000000, -0.00031411, -0.00062790, -0.00094108, -0.00125333, -0.00156434, -0.00187381, -0.00218143, -0.00248690, -0.00278991,
 -0.00309017, -0.00338738, -0.00368124, -0.00397148, -0.00425779, -0.00453990, -0.00481754, -0.00509041, -0.00535827, -0.00562083,
 -0.00587785, -0.00612907, -0.00637424, -0.00661312, -0.00684547, -0.00707107, -0.00728969, -0.00750111, -0.00770513, -0.00790155,
 -0.00809017, -0.00827081, -0.00844328, -0.00860742, -0.00876307, -0.00891006, -0.00904827, -0.00917755, -0.00929776, -0.00940881,
 -0.00951056, -0.00960294, -0.00968583, -0.00975917, -0.00982287, -0.00987688, -0.00992115, -0.00995562, -0.00998027, -0.00999507,
 -0.01000000, -0.00999507, -0.00998027, -0.00995562, -0.00992115, -0.00987688, -0.00982287, -0.00975917, -0.00968583, -0.00960294,
 -0.00951057, -0.00940881, -0.00929777, -0.00917755, -0.00904827, -0.00891007, -0.00876307, -0.00860742, -0.00844328, -0.00827081,
 -0.00809017, -0.00790155, -0.00770513, -0.00750111, -0.00728969, -0.00707107, -0.00684547, -0.00661312, -0.00637424, -0.00612907,
 -0.00587785, -0.00562083, -0.00535827, -0.00509042, -0.00481754, -0.00453991, -0.00425779, -0.00397148, -0.00368125, -0.00338738,
 -0.00309017, -0.00278991, -0.00248690, -0.00218143, -0.00187381, -0.00156435, -0.00125333, -0.00094108, -0.00062791, -0.00031411,
};
//---------------------------------------------------------------------------
// InitAdc: 
//---------------------------------------------------------------------------
// This function initializes ADC to a known state.
//
void InitAdc(void)
{
	unsigned long i,j;
	
	
	for(i=0;i<TotalChannelNumber;i++)
    {
       ADChannel[i].nChannelR=0;
       ADChannel[i].nChannelX=0;
       ADChannel[i].nChannelPara=3.0/65520.0;
       ADChannel[i].nChannelType=1.0;
       ADChannel[i].nChannelOffSet=0.0;
    }
	//ADChannel[0].nChannelType=0.0;
	for(i=0;i<TotalDeviceNumber;i++)
    {
        for(j=0;j<3;j++)
        {
            ADDevice[i].nVoltageGroupChannelNo[j]=i*6+j;
            ADDevice[i].nCurrentGroupChannelNo[j]=i*6+j+3;
	    	if(ADChannel[ADDevice[i].nVoltageGroupChannelNo[j]].nChannelType==1.0&&ADChannel[ADDevice[i].nCurrentGroupChannelNo[j]].nChannelType==1)
	    	{
	    	     ADDevice[i].nTanSign[j]=1;
	    	      ADDevice[i].nTan[j]=0.0;
	    	}
	    }
	}
	AdcRegs.ADCTRL1.bit.RESET=1;     //Reset ADC Moudle
	NOP;
	AdcRegs.ADCTRL1.bit.RESET=0;     // Stop Reset ADC moudle
	AdcRegs.ADCTRL1.bit.SUSMOD=1;    //Stop Sequence counter and the other logic control
	AdcRegs.ADCTRL1.bit.ACQ_PS=15;    //sample windows width is 15 ADCLK;sample time=0.6us
	AdcRegs.ADCTRL1.bit.CPS=0;       //adcCLK=25MHz/1=25MHz
	AdcRegs.ADCTRL1.bit.CONT_RUN=0;  //非连续方式,sequence counter stop when EOS is arrived 
	AdcRegs.ADCTRL1.bit.SEQ_CASC=1;  //16 sequence states generator
	
	AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //带隙和参考电路加电
	for(i=0;i<10000;i++)	NOP;
	AdcRegs.ADCTRL3.bit.ADCPWDN=1;   //核中模拟电路加电
	for(i=0;i<50000;i++)	NOP;
	AdcRegs.ADCTRL3.bit.ADCCLKPS=3; //核时钟分频=75MHz/3分频=25MHz;HSPCP=75MHz
	AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //并发采样方式
	
	AdcRegs.MAX_CONV.bit.MAX_CONV=15;//16通道转换
	
	AdcRegs.CHSELSEQ1.bit.CONV00=9;//0
	AdcRegs.CHSELSEQ1.bit.CONV01=11;//1
	AdcRegs.CHSELSEQ1.bit.CONV02=2;
	AdcRegs.CHSELSEQ1.bit.CONV03=3;
	
	AdcRegs.CHSELSEQ2.bit.CONV04=4;
	AdcRegs.CHSELSEQ2.bit.CONV05=5;
	AdcRegs.CHSELSEQ2.bit.CONV06=6;
	AdcRegs.CHSELSEQ2.bit.CONV07=7;
	
	AdcRegs.CHSELSEQ3.bit.CONV08=8;
	AdcRegs.CHSELSEQ3.bit.CONV09=9;//9;//
	AdcRegs.CHSELSEQ3.bit.CONV10=10;
	AdcRegs.CHSELSEQ3.bit.CONV11=11;//11;//
	
	AdcRegs.CHSELSEQ4.bit.CONV12=12;
	AdcRegs.CHSELSEQ4.bit.CONV13=13;
	AdcRegs.CHSELSEQ4.bit.CONV14=14;
	AdcRegs.CHSELSEQ4.bit.CONV15=15;
	
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1;	
	
	AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;
	AdcRegs.ADCTRL2.bit.RST_SEQ1=0;
	AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //INT_FLAG_SEQ1 interrpt enable
	AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;
	AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;  //EVA 定时器触发
	AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;
	AdcRegs.ADCTRL2.bit.RST_SEQ2=0;
	AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;
	AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;
	AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;
	AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;
	
	AdcRegs.ADCTRL2.bit.SOC_SEQ1=0;   //非软件触发
	


}	

// CaculateMode :  0-Caculuate Channel Value
//                   -1-Caculuate Channle offset
void CacluateValue(int AreaNo,int *CaculateMode)
{
    int i,j,k,kStep=10;
    float sum;
    int16 *a2;
    
    if(*CaculateMode==-2)// no cacluate-mode
    {
        return;
    }
    if(AreaNo==0)
    {
    	a2=(int16 *)0x100000;
    }
    else
    {
       a2=(int16 *)0x100c80;
    }
    for(i=0;i<TotalChannelNumber;i++)
    {
        ADChannel[i].nChannelR=0;
        ADChannel[i].nChannelX=0;
        
    	if(ADChannel[i].nChannelType==0||*CaculateMode==-1)//直流或计算通道偏置
   		{
   		    for(j=0;j<NOrder;j+=kStep)
   		 	{
   	    	    //ADChannel[i].nChannelR+=((*(a1+i+TotalChannelNumber*j))-ADChannel[i].nChannelOffSet);
   	    	    ADChannel[i].nChannelR+=((*(a2+i+TotalChannelNumber*j)));
    	    }
    	    ADChannel[i].nChannelValue=ADChannel[i].nChannelR*ADChannel[i].nChannelPara/NOrder*kStep;
//   			ADChannel[i].nChannelAngle=0.0;
   			if(*CaculateMode==-1)
   			{
   			    ADChannel[i].nChannelOffSet+=(ADChannel[i].nChannelR/NOrder*kStep);
   			    
   			}
   		}
   		    
    	else if(ADChannel[i].nChannelType==1)//交流
   		{
   		    for(j=0;j<NOrder;j+=10)
   		 	{
    	    //	ADChannel[i].nChannelR=ADChannel[i].nChannelR+(*(a1+i+TotalChannelNumber*j)-ADChannel[i].nChannelOffSet)*ccos[j];
    	    //	ADChannel[i].nChannelX=ADChannel[i].nChannelX+(*(a1+i+TotalChannelNumber*j)-ADChannel[i].nChannelOffSet)*csin[j];
    	        ADChannel[i].nChannelR=ADChannel[i].nChannelR+(*(a2+i+TotalChannelNumber*j))*ccos[j];
    	    	ADChannel[i].nChannelX=ADChannel[i].nChannelX+(*(a2+i+TotalChannelNumber*j))*csin[j];
    	    
    	    }
    	
    
    //sqrt()
	    	ADChannel[i].nChannelR=ADChannel[i].nChannelR*ADChannel[i].nChannelPara*kStep;
	    	ADChannel[i].nChannelX=ADChannel[i].nChannelX*ADChannel[i].nChannelPara*kStep;
		    sum=(ADChannel[i].nChannelR*ADChannel[i].nChannelR+ADChannel[i].nChannelX*ADChannel[i].nChannelX);
		    //for(k=1;k<11;k++)
		    {
		     //    Vout=(Vout+sum/Vout)/2.0;
		    }
	        //ADChannel[i].nChannelValue= Vout;
	        ADChannel[i].nChannelValue=sqrt(sum);
	       // ADChannel[i].nChannelAngle=atan(ADChannel[i].nChannelX/ADChannel[i].nChannelR);
	       
       }
       
       
    }
    if(*CaculateMode==-1)
   	{
   	    *CaculateMode=0;
   	    ADIndex=0;
   	}
   	
   	ADChannel[0].nChannelR=1;
  	ADChannel[0].nChannelX=0.57735;
  	
  	ADChannel[3].nChannelR=1;
  	ADChannel[3].nChannelX=1.732;
  	

   	for(i=0;i<TotalDeviceNumber;i++)
   	{
   	    for(j=0;j<3;j++)
   	    {
   	        if(ADDevice[i].nTanSign[j]==1)
   	        {
   	          ADDevice[i].nTan[j]=-(ADChannel[ADDevice[i].nVoltageGroupChannelNo[j]].nChannelX*ADChannel[ADDevice[i].nCurrentGroupChannelNo[j]].nChannelR-ADChannel[ADDevice[i].nVoltageGroupChannelNo[j]].nChannelR*ADChannel[ADDevice[i].nCurrentGroupChannelNo[j]].nChannelX)/(ADChannel[ADDevice[i].nVoltageGroupChannelNo[j]].nChannelR*ADChannel[ADDevice[i].nCurrentGroupChannelNo[j]].nChannelR+ADChannel[ADDevice[i].nVoltageGroupChannelNo[j]].nChannelX*ADChannel[ADDevice[i].nCurrentGroupChannelNo[j]].nChannelX);
   	        }
   	    }
   	    
   	}
}
//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -