单片机c语言sden,电力系统中多通道同步采样ADC(AD7606)与浮点DSP(ADSP-21479)通信的设计与实现...

4.2 结论

这种连接方式只使用DSP的一个串行SPORT口即可同时读取8路ADC的数据。但由于8路数据都通过一路数据输出给DSP,而AD7606支持的最高串行时钟频率有限,模数转换还要占用一部分采样周期,因此串行输出的连接下,AD7606不能工作在最高200KSPS采样率下。

根据AD7606数据手册,AD7606的SCLK上限为23.5MHz。FLAG信号驱动CONVST A/B信号,单路串行输出八通道数据。不考虑转换时间最高采样率可达23500000/(16×8)=183.5kHz,由于每个周期数据转换将消耗一定时间,所以实际无法达到此速度。假设采样周期用Tconvst表示,根据AD7606数据手册,模数转换时间为3.45us,所以 Tconvst-3.45us代表采样周期中传输数据的时间。八通道总数据量为128个时钟周期,所以(Tconvst-3)/128近似为每bit数据的时钟周期。由于SCLK最大为23.5MHz,据此可以推算出此模式下最高采样频率:

(Tconvst(max)-3.45)/128 = 1/23.5

Tconvst(max)≈8.89us

即最高采样率为1/ Tconvst(max) = 112KSPS

同理可知,若采用两口同时输出转换数据,即启动2个SPORT分别读取8个通道的数据,实际最高采样率能达到161K SPS。

当AD7606采用并行方式输出到DSP时,即可得到最高200KSPS采样率。

5. DSP参考代码

1. 配置SRU

// This function will setup the SRU Registers

void InitSRU(void)

{

//Generating Code for connecting : SPORT0_CLK to DAI_PIN1

SRU (HIGH, PBEN01_I);

SRU (SPORT0_CLK_O, DAI_PB01_I);

//Generating Code for connecting : SPORT0_FS to DAI_PIN4

SRU (HIGH, PBEN04_I);

SRU (SPORT0_FS_O, DAI_PB04_I);

//Generating Code for connecting : DAI_PIN5 to SPORT0_DA

SRU (LOW, PBEN05_I);

SRU (DAI_PB05_O, SPORT0_DA_I);

//Generating Code for connecting : FLAG4 to DPI_PIN1

SRU (HIGH, DPI_PBEN01_I);

SRU (FLAG4_O, DPI_PB01_I);

//Generating Code for connecting : FLAG5 to DPI_PIN2

SRU (HIGH, DPI_PBEN02_I);

SRU (FLAG5_O, DPI_PB02_I);

}

2. IRQ1 BUSY中断服务程序

void AD7606_BUSY_IRQs(int sig_int)

{

busy++;

interrupt(SIG_SP0,Count_SPORT0_RX_IRQs);

#ifdef DMA

* (volatile int *)SPCTL0 =( SPEN_A | SLEN32 | ICLK | IFS | LAFS | SDEN_A | FSR | DITFS| LFS );

#endif

#ifdef CORE

* (volatile int *) SPCTL0 =( SLEN16 | ICLK | IFS | FSR | LAFS | LFS | DITFS);

*(volatile int *) SPCTL0 |=SPEN_A ;

#endif

}

3. SPORT初始化程序

void init_sport(){

* (volatile int *) SPCTL0 = 0;

* (volatile int *) SPCTL1 = 0;

* (volatile int *) SPMCTL0 = 0;

* (volatile int *) SPMCTL1 = 0;

SPORT_DMA_setup:

* (volatile int *) IISP0A =(int)rx_buf0a ;

* (volatile int *) IMSP0A = 1;

* (volatile int *) CSP0A = CHNUM;

//configure the sport

/* */

/* CLKDIV0=[fCCLK(266 MHz)/4xFSCLK(17 MHz)]-1 = 0x0005 */

/* FSDIV0=[FSCLK(10 MHz)/TFS(2 MHz)]-1 = 31 = 0x001F */

//13m hz 1m 0x00080003;

/* Configure SPORT0 as a reciever (Rx) */

* (volatile int *) DIV0 = 0x001F0005;

}

4. SPORT 中断程序

void Count_SPORT0_RX_IRQs(int sig_int)

{

SP0I_counter++;

#ifdef CORE

rx_buf0a[(SP0I_counter-1)*CHNUM]=(short)(*pRXSP0A);

#endif

* (volatile int *) SPCTL0 =0;

finished=1;

#ifdef DMA

if(SP0I_counter==1024){

* (volatile int *) IISP0A =(int)rx_buf0a ;

SP0I_counter=0;

}

else

* (volatile int *) IISP0A =(int)(rx_buf0a+ (SP0I_counter)*CHNUM);

* (volatile int *) IMSP0A = 1;

* (volatile int *) CSP0A = CHNUM;

#endif

interrupt(SIG_SP0,SIG_IGN);

}

699ba7046c51816a17b33a7caa85f179.png

0

你可能感兴趣的:(单片机c语言sden)