This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AD9852没有输出



dsp28335控制AD9852输出扫频信号,芯片发热说明有工作,但是却没有输出结果,求大侠帮忙解决?程序如下:
 
 
 
 
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#define  Period         3750		  // 周期0.1ms,周期太小时,会导致程序运行时间大于周期时间

#if (CPU_FRQ_150MHZ)     // Default - 150 MHz SYSCLKOUT
  #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)   = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
  #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)   = 25.0 MHz
#endif

/*******************************************************
--------------- 变量定义------------------------
********************************************************/
float adc[16];         //用于存储AD转换结果
float adclo=0;           //AD转换的模拟参考电平,通常接地
float Output0[300]={0},Output1[300]={0}; //用于保存ADCINA0、ADCINA1两个通道滤波处理后的采样结果
float adcresulta0[10]={0}; //用于保存ADCINA0通道的10次采样结果
float adcresulta1[10]={0}; //用于保存ADCINA1通道的10次采样结果
float NUM[3]={0};
float VALUE[3]={0};
int SampleCount=0;         //采样次数计数器
int flag=0;         //用于保存数据的数组下标

Uint16    *p1 = (Uint16 *)0x004000;
Uint16    *p2 = (Uint16 *)0x004020;
Uint16    *P1 = (Uint16 *)0x004010;
Uint16    *P2 = (Uint16 *)0x004030;
Uint16    *f1 = (Uint16 *)0x004008;
Uint16    *f2 = (Uint16 *)0x004028;
Uint16    *f3 = (Uint16 *)0x004018;
Uint16    *f4 = (Uint16 *)0x004038;
Uint16    *f5 = (Uint16 *)0x004004;
Uint16    *f6 = (Uint16 *)0x004024;
Uint16    *F1 = (Uint16 *)0x004014;
Uint16    *F2 = (Uint16 *)0x004034;
Uint16    *F3 = (Uint16 *)0x00400C;
Uint16    *F4 = (Uint16 *)0x00402C;
Uint16    *F5 = (Uint16 *)0x00401C;
Uint16    *F6 = (Uint16 *)0x00403C;
Uint16    *bujin1 = (Uint16 *)0x004002;
Uint16    *bujin2 = (Uint16 *)0x004022;
Uint16    *bujin3 = (Uint16 *)0x004012;
Uint16    *bujin4 = (Uint16 *)0x004032;
Uint16    *bujin5 = (Uint16 *)0x00400A;
Uint16    *bujin6 = (Uint16 *)0x00402A;
Uint16    *xielv1 = (Uint16 *)0x004016;
Uint16    *xielv2 = (Uint16 *)0x004036;
Uint16    *xielv3 = (Uint16 *)0x00400E;
Uint16    *diaodian = (Uint16 *)0x00402E;
Uint16    *gongneng = (Uint16 *)0x00401E;
Uint16    *moshi = (Uint16 *)0x00403E;
Uint16    *shineng = (Uint16 *)0x004001;
Uint16    *a1 = (Uint16 *)0x004021;
Uint16    *a2 = (Uint16 *)0x004011;
Uint16    *A1 = (Uint16 *)0x004031;
Uint16    *A2 = (Uint16 *)0x004009;
Uint16    *xielv = (Uint16 *)0x004029;
Uint16    *DA1 = (Uint16 *)0x004019;
Uint16    *DA2 = (Uint16 *)0x004039;


/*******************************************************
------------------函数声明------------------------------
*******************************************************/
void ADC_init(void);        	        // ADC初始化函数
void ePWM_init(void);
void sequence(float a[], int n);        //排序算法
interrupt void  ADCINT_isr(void);   // 中断函数
void fir_filter(float b[],float c[]);
void set_freq(float x,float y);
void Updata_Deltaword(void);
void Updata_Ramprateword(void);
void set_phase(Uint16 x,Uint16 y);
void set_amplitude(void);
void UPDATA(void);
void Gpio_setup(void);

/******************************************************
------------------主函数-------------------------------
*******************************************************/

void main(void)
{
   	int i;
   	InitSysCtrl();
//    InitXintf16Gpio();
   	//EALLOW;
    //SysCtrlRegs.HISPCP.all = ADC_MODCLK;	// HSPCLK = SYSCLKOUT/ADC_MODCLK
    //EDIS;

	//MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
	//InitFlash();

	InitPieCtrl();
	InitPieVectTable();
//  InitGpio();
	Gpio_setup();
	GpioDataRegs.GPASET.bit.GPIO2=1;//初始化复位,超过十个时钟周期的高电平
	DELAY_US(10000);
	GpioDataRegs.GPACLEAR.bit.GPIO2=1;//初始化复位,超过十个时钟周期的高电平

	GpioDataRegs.GPASET.bit.GPIO1=1;//上升沿更新信号,开始时置高,防止烧毁芯片

	GpioDataRegs.GPACLEAR.bit.GPIO3=1;//扫频起始频率选择,低电平选择F1
	//GpioDataRegs.GPASET.bit.GPIO3=1;//高电平选择F2
	GpioDataRegs.GPASET.bit.GPIO4=1;//高电平选择并行模式
	GpioDataRegs.GPASET.bit.GPIO5=1;//输出振幅控制引脚

    GpioDataRegs.GPASET.bit.GPIO0=1;//写数据时置高电平,写数据结束,置低电平
    //GpioDataRegs.GPACLEAR.bit.GPIO0=1;//写数据时置高电平,写数据结束,置低电平

    InitXintf16Gpio();

	*moshi=0xE4;//清ACC1和ACC2,线性三角扫频模式,外部更新时钟
	UPDATA();
	*gongneng=0x05;//5倍频(150MHz)
	UPDATA();
	*shineng =0x60;
	UPDATA();
	*diaodian =0x10;
	UPDATA();
	set_freq(2*10^6,3*10^6);
	set_phase(0,0);
	set_amplitude();
	Updata_Deltaword();
	Updata_Ramprateword();

	GpioDataRegs.GPACLEAR.bit.GPIO1=1;//上升沿更新信号
	GpioDataRegs.GPASET.bit.GPIO1=1;//上升沿更新信号
	DELAY_US(10);//至少保持八个系统时钟周期
	GpioDataRegs.GPACLEAR.bit.GPIO1=1;//上升沿更新信号


   GpioDataRegs.GPACLEAR.bit.GPIO0=1;//写数据时置高电平,写数据结束,置低电平

//   InitXintf16Gpio();

   	DINT;
   	IER = 0x0000;
   	IFR = 0x0000;

	ePWM_init();
	ADC_init();

	IER |= M_INT1;
	PieCtrlRegs.PIEIER1.bit.INTx6 = 1; 		// 使能PIE模块中的ADC采样中断
	EINT;
	ERTM;

   EALLOW;	// Allow access to EALLOW protected registers
   PieVectTable.ADCINT= &ADCINT_isr;
   //SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;	// Start all the timers synced
   EDIS;   // Disable access to EALLOW protected registers

	for(i=0;i<300;i++)//只利用初始化赋初值的话,数组好像并不是等于零,好奇怪啊
           {
             Output0[i]=0;
             Output1[i]=0;
           }

	for(;;)
	{

    	asm("          NOP");

   	}
}

/***************************************************************
----------------------中断函数----------------------------------
***************************************************************/
interrupt void  ADCINT_isr(void)     // ADC中断函数
{

 	SampleCount++; //采样计数器计数
 	//读取转换结果
 	adc[0]=((float)AdcMirror.ADCRESULT0)*3.0/4096.0+adclo; //读取ADCINA0通道采样结果
	adc[1]=((float)AdcMirror.ADCRESULT1)*3.0/4096.0+adclo; //读取ADCINA1通道采样结果
	adcresulta0[SampleCount-1]=adc[0]; //将ADCINA0通道采样到的数据存入数组adcresulta0[]中,等待数据处理
	adcresulta1[SampleCount-1]=adc[1]; //将ADCINA1通道采样到的数据存入数组adcresulta1[]中,等待数据处理

    if(SampleCount==5) //采样十次之后,需要进行滤波处理
    {
        int i;
        i=0;


        sequence(adcresulta0,5); //对采样十次得到的数据进行排序
        sequence(adcresulta1,5);

        for(i=1;i<4;i++)
        {
            Output0[flag]=Output0[flag]+adcresulta0[i]; //中值滤波法
            Output1[flag]=Output1[flag]+adcresulta1[i]; //去掉最小的1个和最大的1个,取中间的3个数据进行求和
        }
        Output0[flag]=Output0[flag]/3; //计算4个采样数据的平均值
        Output1[flag]=Output1[flag]/3;
        flag++;
        if(flag==300)
          {
        	fir_filter(Output0,Output1);
        	int t=0;
        	for(i=0;i<300;i++)
        	{
        		if(Output0[i]>1.5&&Output0[i]<Output0[i+1])
        		{
        			if(Output0[i+1]>Output0[i+2])
        				{
        				NUM[t]=i+1;
        				VALUE[t]=Output0[i+1];
        				t++;
        				if(t>2)
        				{
        					t=0;
        					goto out;
        				}

        				}
        		}
        	}
        	out:asm ("      ESTOP0");
          	flag=0;
            for(i=0;i<300;i++)
           {
             Output0[i]=0;
             Output1[i]=0;
           }
          }
        SampleCount=0; //清采样计数器,进入新的连续十次的采样

    }
    PieCtrlRegs.PIEACK.all=0x0001;  //响应PIE同组中断
	AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除AD中断的标志位
	AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;//复位序列发生器

	//AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;  //立即启动下一次转换(不是使用EV触发了嘛?)
	EINT;  //使能全局中断
}

/************************************************************
--------------------EPWM配置函数-----------------------------
*************************************************************/
void ePWM_init(void)
{
	//InitEPwmGpio();//使能内部上拉电阻并配置成EPWM模式

	//EALLOW;
    //SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;	// Stop all the TB clocks
    //EDIS;

   	//EPwm1Regs.TBCTL.bit.PRDLD  = TB_SHADOW;//使用映射寄存器
   	EPwm1Regs.TBPRD            = Period;  //周期为
   	//EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // 相位为0
   	EPwm1Regs.TBCTR            = 0x0000; //初始计数值
   	EPwm1Regs.TBCTL.bit.CTRMODE   = TB_COUNT_UP;  //增计数
   	//EPwm1Regs.TBCTL.bit.PHSEN     = TB_DISABLE;   //禁止TBCTR加载相位
   	//EPwm1Regs.TBCTL.bit.SYNCOSEL  = TB_SYNC_IN;   //定时器时钟源选择(同步信号输出选择)
   	EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;      //分频系数2*k
   	EPwm1Regs.TBCTL.bit.CLKDIV    = TB_DIV1;      //分频系数
   	EPwm1Regs.ETSEL.bit.SOCAEN = 1;
   	EPwm1Regs.ETSEL.bit.SOCASEL = 2;                   //周期中断
   	EPwm1Regs.ETPS.bit.SOCACNT  =1;               // 事件发生次数
   	EPwm1Regs.ETPS.bit.SOCAPRD  =1;               // 发生一次事件启动ADC
   	EPwm1Regs.ETFLG.bit.SOCA  =1;               // 清除标志位(如果不清除会有触发信号吗?)
}

/*******************************************************************
-----------------------AD采样配置函数--------------------------------
********************************************************************/
void ADC_init(void)
{
    InitAdc();

    AdcRegs.ADCTRL1.bit.ACQ_PS    = 0xf;	     // Acquisition window size
	AdcRegs.ADCTRL1.bit.CPS       = 0;		     // ADC预分频
	AdcRegs.ADCTRL3.bit.ADCCLKPS  = 3;		     // ADCCLK=25MHz
    AdcRegs.ADCTRL1.bit.SEQ_CASC  = 1;           // 级联方式
    AdcRegs.ADCTRL1.bit.CONT_RUN  = 0;           // 启停模式
	AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;		     // 顺序采样
//	AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM = 0;
	AdcRegs.ADCMAXCONV.all        = 0x0001;      // 2 channels of AD convertion in SEQ
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;
    AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;   //清除SEQ1中的中断标志位INT_SEQ1
    AdcRegs.ADCTRL2.bit.RST_SEQ1=0;          //复位序列发生器
	AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;     //使能SEQ1的中断请求
	AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;    //中断方式(每次转换结束置位标志位)
	AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=1;   //EVA事件启动AD转换
      //AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;  //外部引脚触发位,此例无用
}


void fir_filter(float b[],float c[])
{
	int i,j=0;
	float sum;
	float h[21]={
			   -0.09055792262407, 0.009744804975761,  0.01838867509003,  0.03195961694651,
			    0.04917012260358,  0.06836127325356,  0.08774901331544,   0.1053433191277,
			     0.1194310387162,    0.128484986607,   0.1316381457976,    0.128484986607,
			     0.1194310387162,   0.1053433191277,  0.08774901331544,  0.06836127325356,
			    0.04917012260358,  0.03195961694651,  0.01838867509003, 0.009744804975761,
			   -0.09055792262407
			    };

	for(i=0;i<300;i++)
	{
		sum=0.0;
		for(j=0;j<21;j++)
		{
			if(i >= j)
			sum+=h[j]*b[i-j];
			else
			;

		}
		c[i]=sum;
	}
	for(i=0;i<280;i++)
		{
		c[i]=c[i+20];
		}
}




void sequence(float a[],int n)
{
   int i=0;
   int j=0;
   float temp=0;
   for(i=0;i<n;i++)
   {
      for(j=i+1;j<=n;j++)
      {
         if(a[i]>a[j]) //如果a[i]比a[j]大,则交换数据,前面的总是保存较小的数据
         {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
         }
      }
   }
}

void set_freq(float x,float y)
{
	Uint16 k;
	float ftw,temp;
	float ftw1[6]={0},ftw2[6]={0};
	ftw=x*281474976.7106/240;//240MHz系统频率
	//ftw=x*5864062/5;//240MHz系统频率
	for(k=9;k>3;k--)//计算频率1的控制字
	{
		//temp=ftw/256;//取商
		//temp=ftw-temp*256;//取余
		temp=(long int)ftw%256;
		ftw1[k-4]=(Uint16)temp;
		ftw/=256;
	}
	ftw=y*281474976.7106/240;//240MHz系统频率
	//ftw=y*5864062/5;//240MHz系统频率
	for(k=9;k>3;k--)//计算频率2的控制字
	{
		//temp=ftw/256;//取商
		//temp=ftw-temp*256;//取余
		temp=(long int)ftw%256;
		ftw2[k-4]=(Uint16)temp;
		ftw/=256;
	}
//	for(k=0;k<6;k++)	//写频率控制字1
//	*(   	                    (&dds1)    +k*256)=ftw1[k];
//	for(k=0x00;k<0x06;k++)//写频率控制字2
//	*(   	                    (&dds2)    +k*256)=ftw2[k];
//取最终的地址的内容			取地址   地址加i

	//写频率控制字1
	*f1=ftw1[0];
	UPDATA();
	*f2=ftw1[1];
	UPDATA();
	*f3=ftw1[2];
	UPDATA();
	*f4=ftw1[3];
	UPDATA();
	*f5=ftw1[4];
	UPDATA();
	*f6=ftw1[5];
	UPDATA();
	//写频率控制字2
	*F1=ftw2[0];
	UPDATA();
	*F2=ftw2[1];
	UPDATA();
	*F3=ftw2[2];
	UPDATA();
	*F4=ftw2[3];
	UPDATA();
	*F5=ftw2[4];
	UPDATA();
	*F6=ftw2[5];
	UPDATA();
}

void Updata_Deltaword(void)
{
     //	Uint16 k;
	Uint16  deltaword[6]={0x00,0x80,0x00,0x00,0x00,0x00}; //40bit = 585.9khz
	//for(k=0;k<6;k++)	//写频率控制字1
	//*(   	                    (&delta)    +k)=deltaword[k];
   	//写48位斜率计数器值
	*bujin6=deltaword[5];
	UPDATA();
	*bujin5=deltaword[4];
	UPDATA();
	*bujin4=deltaword[3];
	UPDATA();
	*bujin3=deltaword[2];
	UPDATA();
	*bujin2=deltaword[1];
	UPDATA();
	*bujin1=deltaword[0];
	UPDATA();
}

void Updata_Ramprateword(void)
{
	Uint16  ramprateword[3]={0x00,0x75,0x30};     // 时间步进 现取100us 最大6990.506us
	//写Ramp Rate寄存器的值
	*xielv3=ramprateword[2];
	UPDATA();
	*xielv2=ramprateword[1];
	UPDATA();
	*xielv1=ramprateword[0];
	UPDATA();

}
void set_phase(Uint16 x,Uint16 y)
{
	Uint16 phase_word1[2],phase_word2[2];
	phase_word1[1]=x%256;
	phase_word1[0]=(x/256)%256;
	phase_word2[1]=y%256;
	phase_word2[0]=(y/256)%256;
	//写相位值1
	*p1=phase_word1[0];
	UPDATA();
	*p2=phase_word1[1];
	UPDATA();
	//写相位值2
	*P1=phase_word2[0];
	UPDATA();
	*P2=phase_word2[1];
	UPDATA();
//	for(k=0;k<2;k++)
//	*(   	                    (&phase1)    +k)=phase_word1[k];
//取最终的地址的内容			取地址   地址加i
//	for(k=0;k<2;k++)
//	*(   	                    (&phase2)    +k)=phase_word2[k];
}

void set_amplitude(void)
{
	Uint16  amplitude[2]={0xFF,0xFF};
		*a1=amplitude[1];
		UPDATA();
		*a2=amplitude[0];
		UPDATA();
		*A1=amplitude[1];
		UPDATA();
		*A2=amplitude[0];
		UPDATA();
}

void UPDATA(void)
{
    GpioDataRegs.GPACLEAR.bit.GPIO1=1;//上升沿更新信号
	GpioDataRegs.GPASET.bit.GPIO1=1;//上升沿更新信号
	DELAY_US(10);//至少保持八个系统时钟周期
	GpioDataRegs.GPACLEAR.bit.GPIO1=1;//上升沿更新信号
}

void Gpio_setup(void)
{
	EALLOW;
	GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//选择数字IO模式
	GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;
	GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;

	GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能内部上拉电阻
	GpioCtrlRegs.GPAPUD.bit.GPIO1=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO2=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO3=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO4=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO5=0;

	GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成输出方向
	GpioCtrlRegs.GPADIR.bit.GPIO1=1;
	GpioCtrlRegs.GPADIR.bit.GPIO2=1;
	GpioCtrlRegs.GPADIR.bit.GPIO3=1;
	GpioCtrlRegs.GPADIR.bit.GPIO4=1;
	GpioCtrlRegs.GPADIR.bit.GPIO5=1;

    EDIS;
}


用DSP28335控制AD9852时发现一直没有输出,但是板子发热倒是挺烫的说明是有工作的,现在找不到原因了,求问各位大侠怎么解决?
  • 板子发烫不一定正常工作     你先检查一下28335是否正常工作   

    最好用示波器看看28335对AD9852的配置时序 

  • mangui zhang 说:

    板子发烫不一定正常工作     你先检查一下28335是否正常工作   

    最好用示波器看看28335对AD9852的配置时序 

    28335是正常工作的,但是感觉AD9852不受控,我用数据线和地址线分别和AD9852的数据线和地址线相连,应该是直接像向外扩存储器那样写入数据就可以了吧?而且那个更新引脚感觉自己也有1V左右的脉冲输出