📄 dsp28_adc.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 + -