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

📄 ad.c

📁 使用TI DSP 2407A 进行开发的源代码
💻 C
字号:
#include "ad.h"


//ad *adptr;  


#define ADC_SIZE    16
#define MAX_DAC     4

unsigned int nNewConvert;



void AD_Init(void)
{

  
    /* Set Calibration Register to 0 */

	CALIBRATION = 0;   

    wait_us(2 );
	ADCTRL1 = ADC_RESET;  
    wait_us(2 );


    /* Enable AD CTL REGISTER1 */

   // ADCTRL1 = ADC_SOFT | ACQ_PS_7 |  ADC_SEQ_ACSC;

	ADCTRL1 = ADC_SOFT | ACQ_PS_7 ;//|  ADC_SEQ_ACSC;
    



    /*----------------------------------------*/
    /* Set Maximum Conversion to 15 at a time */
    /*----------------------------------------*/
    MAXCONV = 0;
	

    /*---------------------------------------------*/
    /* set the mux				   */
    /*---------------------------------------------*/

    CHSELSEQ1 = 0x0000;
	CHSELSEQ2 = 0x0000;
	CHSELSEQ3 = 0x1111;
	CHSELSEQ4 = 0x1111;
	
		nNewConvert = 0;

     /*  *(volatile unsigned int *)CHSELSEQ3 = 0xba98;
    *(volatile unsigned int *)CHSELSEQ4 = 0xfedc;  */



	ADC_CONV_NUM_SET(15);

	ADCTRL1_PARA_SET(ACQ_PS_0);
	ADCTRL1_PARA_SET(ADC_SEQ_ACSC); 
	ADCTRL1_PARA_SET(CONT_RUN); 

//	ADCTRL1_PARA_SET(BRG_ENA);

//	ADCTRL1_PARA_SET(STEST_ENA);

	ADCTRL2_PARA_SET(RST_SEQ1);

	ADCTRL2_PARA_SET(EVA_SOC_SEQ1);
	
	ADCTRL2_PARA_SET(SOC_SEQ1);


}



//ADCTRL1参数设定,具体见上表
//使用方法:ADCTRL1_PARA_SET(ACQ_PS_x),ADC时钟的预定标系数
//ADCTRL1_PARA_SET(CPS),ADC转换逻辑时钟的预定标系数
//ADCTRL1_PARA_SET(CONT_RUN),设定排序器工作模式
//ADCTRL1_PARA_SET(SEQ_ACSC),设定级连排序器工作方式
//ADCTRL1_PARA_SET(ADC_RESET),ADC模块软件复位
//ADCTRL1_PARA_SET(CAL_ENA),ADC偏差校准使能位
//ADCTRL1_PARA_SET(BRG_ENA),ADC桥使能位
//ADCTRL1_PARA_SET(HI_LO),VREFHI作为ADC输入的值
//ADCTRL1_PARA_SET(STEST_ENA),使能自测试模式




void ADCTRL1_PARA_SET(unsigned int PARA)
{
		ADCTRL1 |= PARA;
}


//ADCTRL1参数设定,具体见上表
//使用方法:ADCTRL1_PARA_SET(ACQ_PS_x),ADC时钟的预定标系数
//ADCTRL1_PARA_UNSET(CPS),ADC转换逻辑时钟的预定标系数为CLK/2;
//ADCTRL1_PARA_UNSET(CONT_RUN),设定排序器工作模式
//ADCTRL1_PARA_UNSET(SEQ_ACSC),设定级连排序器工作方式
//ADCTRL1_PARA_UNSET(ADC_RESET),ADC模块软件复位
//ADCTRL1_PARA_UNSET(CAL_ENA),ADC偏差校准使能位
//ADCTRL1_PARA_UNSET(BRG_ENA),ADC桥使能位
//ADCTRL1_PARA_UNSET(HI_LO),VREFHI作为ADC输入的值
//ADCTRL1_PARA_UNSET(STEST_ENA),使能自测试模式

void ADCTRL1_PARA_UNSET(unsigned int PARA)
{
	unsigned int temp,temp2;

    	temp =  ~PARA;

		ADCTRL1 &= temp;
}



//ADCTRL2参数获取,
//使用方法:
//ADCTRL1_PARA_SET(CONT_RUN),测试是否为连续转换状态

//是,返回1,否则返回0


unsigned int ADCTRL1_PARA_GET(unsigned int PARA)
{
	unsigned int temp;
	temp = ADCTRL1;
	temp = temp & PARA;

	if (temp>0)
		return 1;
	else 
		return 0;

}




//ADCTRL2参数设定,
//使用方法:ADCTRL2_PARA_SET(EVB_SOC_SEQ),允许级连的排序器SEQ被EVB启动
//ADCTRL2_PARA_SET(RST_SEQ1),立即复位排序器
//ADCTRL2_PARA_SET(SOC_SEQ1),通过向这位写1来软件启动SEQ1转换
//ADCTRL2_PARA_SET(INT_ENA_SEQ1_X),SEQ1的中断方式使能控制位
//ADCTRL2_PARA_SET(EVA_SOC_SEQ1),允许SEQ1\SEQ被EVA的触发源启动
//ADCTRL2_PARA_SET(EXT_SOC_SEQ1),允许外部的ADCSOC引脚上的信号启动ADC自动转换
//ADCTRL2_PARA_SET(RST_SEQ2),复位排序器2
//ADCTRL2_PARA_SET(SOC_SEQ2),软件触发启动排序器2
//ADCTRL2_PARA_SET(INT_ENA_SEQ2_X),SEQ2的中断方式使能控制位
//ADCTRL2_PARA_SET(EVB_SOC_SEQ2),允许SEQ2被EVB的触发源启动

void ADCTRL2_PARA_SET(unsigned int PARA)
{
		ADCTRL2 |= PARA;
}


//ADCTRL2参数设定,
//使用方法:ADCTRL2_PARA_SET(EVB_SOC_SEQ),允许级连的排序器SEQ被EVB启动
//ADCTRL2_PARA_SET(RST_SEQ1),立即复位排序器
//ADCTRL2_PARA_SET(SOC_SEQ1),通过向这位写1来软件启动SEQ1转换
//ADCTRL2_PARA_SET(INT_ENA_SEQ1_X),SEQ1的中断方式使能控制位
//ADCTRL2_PARA_SET(EVA_SOC_SEQ1),允许SEQ1\SEQ被EVA的触发源启动
//ADCTRL2_PARA_SET(EXT_SOC_SEQ1),允许外部的ADCSOC引脚上的信号启动ADC自动转换
//ADCTRL2_PARA_SET(RST_SEQ2),复位排序器2
//ADCTRL2_PARA_SET(SOC_SEQ2),软件触发启动排序器2
//ADCTRL2_PARA_SET(INT_ENA_SEQ2_X),SEQ2的中断方式使能控制位
//ADCTRL2_PARA_SET(EVB_SOC_SEQ2),允许SEQ2被EVB的触发源启动

void ADCTRL2_PARA_UNSET(unsigned int PARA)
{
	unsigned int temp,temp2;

    	temp =  ~PARA;

	ADCTRL2 &= temp;
}


//ADCTRL2参数获取,
//使用方法:
//ADCTRL2_PARA_SET(SEQ1_BSY),测试SEQ1是否处于忙状态
//ADCTRL2_PARA_GET(INT_FLAG_SEQ1),测试SEQ!是否发生过中断事件
//ADCTRL2_PARA_SET(SEQ2_BSY),测试SEQ2是否处于忙状态
//ADCTRL2_PARA_GET(INT_FLAG_SEQ2),测试SEQ2是否发生过中断事件

//是,返回1,否则返回0


unsigned int ADCTRL2_PARA_GET(unsigned int PARA)
{
	unsigned int temp;
	temp = ADCTRL2;
	temp = temp & PARA;

	if (temp>0)
		return 1;
	else 
		return 0;

}






void ADC_CONV_NUM_SET(unsigned int CONV_NUM_VAL)
{
	MAXCONV = CONV_NUM_VAL;

}

void ADC_CONV_RESULT_GET(unsigned int *p)
{
	unsigned int i,temp;
	volatile unsigned int *j;

	
	temp = MAXCONV + 1;
	j = Val_RESULT0;

	for (i=0;i<temp;i++)
	{
	
		*p = *j>>6;
		p++;
		j++;
	}

}




void READ_AD(unsigned int *p)
{
    unsigned int TimeOutCtr = 0xffff;
    
    if(ADCTRL1_PARA_GET(CONT_RUN))
    {
    ADC_CONV_RESULT_GET(p);
    }
    
    else
    {
    
     while(TimeOutCtr--)
    {

	/* Finished the Conversion */
	if( ADCTRL2_PARA_GET(SEQ1_BSY)>0)
    	{
	      break;
	    }	
    }

 
   if(TimeOutCtr>0)
    {                          
      ADC_CONV_RESULT_GET(p);
    }
    
    }
   
}



void AD_Test(void)
{

         unsigned int res[16];
         unsigned int i;

	ADC_CONV_NUM_SET(15);

	ADCTRL1_PARA_SET(ACQ_PS_0);
	ADCTRL1_PARA_SET(ADC_SEQ_ACSC); 
	ADCTRL1_PARA_SET(CONT_RUN); 

//	ADCTRL1_PARA_SET(BRG_ENA);

//	ADCTRL1_PARA_SET(STEST_ENA);

	ADCTRL2_PARA_SET(RST_SEQ1);

	ADCTRL2_PARA_SET(EVA_SOC_SEQ1);
	
	ADCTRL2_PARA_SET(SOC_SEQ1);

	wait_us(3);
	
	

//	CHSELSEQ1=0x3210;
//	CHSELSEQ2=0x7654;
//	CHSELSEQ1=0xBA98;
//	CHSELSEQ2=0xFEDC;

     
     for(i=0;i<10;i++)
     {
     
     wait_second(5);
     READ_AD(res);
     }

	//GPTx_Frequence_Set(GPT2,6);	
	//GPTxPINT_ENA(GPT2);
       //	GPTCONx_PARA_SET(EVA_NUM,T2TOADC_2);
	//GPTx_ENA(GPT2);

}




void light_value(unsigned int *p,unsigned int maxconv_num)
{

    unsigned int res[16];

	unsigned int i,j,num,temp;
        

		

//	CHSELSEQ1=0x3210;
//	CHSELSEQ2=0x7654;
//	CHSELSEQ1=0xBA98;
//	CHSELSEQ2=0xFEDC;

     
     READ_AD(res);

    for(i=0;i<2;i++)
    	{
    	
    	num=i*8;
    	
    	temp = 0;
    	
    	for(j=num;j<(num+8);j++)
    		{
    			temp= temp+res[j];
    		}

	    *p = temp/8;
	    p++;
	  
    	}




	//GPTx_Frequence_Set(GPT2,6);	
	//GPTxPINT_ENA(GPT2);
       //	GPTCONx_PARA_SET(EVA_NUM,T2TOADC_2);
	//GPTx_ENA(GPT2);

}
      








⌨️ 快捷键说明

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