当我设置为单通道顺序采样时,采样结果是对的,但当我想要多通道采样时,结果就不对了?想请教各位大神帮忙看一下,问题出在哪里?程序代码如下:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include <stdio.h>
#include <string.h>
#include <math.h>
#define PI 3.1415926
#define COEFFNUMBER 16
#define INPUTNUMBER 2048
/*这里使用了宏定义来控制更新锁存信号的功能,重点就是在时序上*/
#define SetLOAD GpioDataRegs.GPADAT.bit.GPIO17=1; //将LOAD置高
#define ClrLOAD GpioDataRegs.GPADAT.bit.GPIO17=0; //将LOAD置低
void WriteDAC(unsigned char add,unsigned char rng,unsigned char vol);
void delay(unsigned int t);
void spi_init(void);
int FIRLMS(int *nx,float *nh,int nError,int nCoeffNumber);
// ADC start parameters
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK = 150/(2*3) = 25MHz
// for 60 MHz devices: HSPCLK = 60/(2*3) = 10 MHz
#define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25MHz/(1*2) = 12.5MHz
#define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clock
// Global variable for this example
float fU = -0.0000001;
int xx[INPUTNUMBER],wc[INPUTNUMBER],Error[INPUTNUMBER];
float h[COEFFNUMBER];
void main(void)
{
int i,nLastOutput;
/*初始化系统*/
InitSysCtrl();
// Specific clock setting for this example:
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/(2*ADC_MODCLK)=25MHZ
EDIS;
/*初始化GPIO;*/
// InitSpiaGpio();
///初始化IO口
// EALLOW;
// GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; // 配置GPIO17为GPIO口
// GpioCtrlRegs.GPADIR.bit.GPIO17 = 1; // 定义GPIO17输出引脚
// GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // 禁止上啦 GPIO17引脚
// EDIS;
/* 关中断 */
DINT;
IER = 0x0000;
IFR = 0x0000;
/* 初始化PIE控制寄存器 */
InitPieCtrl();
/* 初始化PIE参数表 */
InitPieVectTable();
// 步骤 4.初始化片内外设:
InitAdc(); // For this example, init the ADC
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;//设置采样窗口时间:(15+1)*ADCCLK,,6.25/16=0.39MHz
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;//ADC内核时钟分频:HSPCLK/2=12.5MHZ
AdcRegs.ADCTRL1.bit.CPS=0x1; // 12.5/2=6.25
AdcRegs.ADCTRL1.bit.SEQ_OVRD=0x0; // 转换完最大通道数指针复位
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0x0; //=0顺序采样,=1同步采样
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0x1; // =0双序列发生器,=1级联模
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x1; // 最大转换通道数量2
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //通道选择ADCAIN0&ADCINB0
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x8; //
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 设置为连续运行
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; // 使能中断
///初始化SPI
spi_init(); // 初始化SPI
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
// 采样表清0
for (i=0; i<INPUTNUMBER; i++)
{
xx[i] = 0;
Error[i]=0;
}
// 软件启动SEQ1
AdcRegs.ADCTRL2.all = 0x2000;
for ( i=0;i<COEFFNUMBER;i++ ) h[i]=0;
while(1)
{
for (i=0; i<INPUTNUMBER; i++)
{
while (AdcRegs.ADCST.bit.INT_SEQ1 == 0) {} // 等待中断
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
xx[i] = ((AdcRegs.ADCRESULT0>>4));//-2320;
wc[i] = xx[i]/100;
Error[i] = ((AdcRegs.ADCRESULT1>>4));//ADCINb0反馈
nLastOutput=FIRLMS(wc+i-COEFFNUMBER,h,Error[i],COEFFNUMBER);
// Error[i] = xx[i] + nLastOutput;
// rr[i]=nLastOutput;
WriteDAC(0,0,nLastOutput);
}