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

📄 agc.c

📁 利用单片机和ad9851来产生1KHz--10MHz的正弦信号的代码。
💻 C
字号:
//本程序为AGC模块应用程序,IOA口分配为:IOA0--TLV5618的DIN,DA_DIN;IOA1--DA_SCLK;IOA2--DA_CS;
//IOA3--AD_DCLK;IOA4--AD_CS;IOA5--AD_DIN;IOA6--AD_DOUT;
//***************************************************************************************//
#include "SPCE061V004.H"
#define	Set_IOA_Bit(x)		(*P_IOA_Data = *P_IOA_Buffer | x)
#define	Clear_IOA_Bit(x)	(*P_IOA_Data = *P_IOA_Buffer & ~x)
#define	DA_DIN		0x0001         //串行数据输入
#define	DA_SCLK	    0x0002         //串行时钟
#define	DA_CS		0x0004         //使能信号
#define AD_DCLK		0x0008                     
#define AD_CS      	0x0010                     
#define AD_DIN 		0x0020                     
#define CH0         0x0010         //AD四个通道的选择
#define CH1         0x0050
#define CH2         0x0020
#define CH3         0x0060  	
extern unsigned int data_val;             //5618的控制字
extern unsigned int AD_Data0,AD_Data1,AD_Data2,AD_Data3;     //CHX的AD转换得到的数据
extern unsigned long int AMP;
//*************************************************************//
//函数名称:CtrlTLV5618()
//功能:向12位串行DA TLV5618置数
//参数:12位数据
//*************************************************************//
void CtrlTLV5618(unsigned int dat)
{
	unsigned int order,value,mask,i;
	mask = 0x8000;
	order = 0x8000;         //OUTA,OUTB,SLOW
	value = order | dat;
	Set_IOA_Bit(DA_CS);
	Clear_IOA_Bit(DA_CS);
	for(i=0;i<16;i++)
	{
		*P_Watchdog_Clear= 0x0001;
		Set_IOA_Bit(DA_SCLK); 	
		if(mask & value)
		Set_IOA_Bit(DA_DIN);
		else
		Clear_IOA_Bit(DA_DIN);	
		Clear_IOA_Bit(DA_SCLK);
		mask = mask>>1;
	}
	Set_IOA_Bit(DA_SCLK);		
	Set_IOA_Bit(DA_CS);	
}
//**************************************************************************
//延时函数
//**************************************************************************
void delay()
{
	unsigned int i;
	for(i=0;i<100;i++)	
	{
		*P_Watchdog_Clear = 1;
	}
}		
//**************************************************************************
//函数名称:CtrlAndRead7841()
//功能:控制ADS7841并读取AD转换的数据
//参数:四个通道的选择
//**************************************************************************
unsigned int  CtrlAndRead7841(unsigned int CHX)
{
	unsigned int mask,i,Order,Reader,temp,AD_Data;
	*P_Watchdog_Clear = 1;
	Order = 0x0087 | CHX;
    mask = 0x0080;
    Reader = 0x0040;                //IOA6为DOUT,即AD转换的数据由此输入单片机
    AD_Data = 0;
	Clear_IOA_Bit(AD_DCLK);
	Set_IOA_Bit(AD_CS);
	Clear_IOA_Bit(AD_CS);
	for(i=0;i<8;i++)
	{
    	if(mask & Order)
    	Set_IOA_Bit(AD_DIN);
    	else
    	Clear_IOA_Bit(AD_DIN);
    	Set_IOA_Bit(AD_DCLK);
    	Clear_IOA_Bit(AD_DCLK); 
    	mask = mask>>1; 
    }	 
    delay();
    for(i=0;i<16;i++)
    {
    	Set_IOA_Bit(AD_DCLK);
    	Clear_IOA_Bit(AD_DCLK);
    	if(*P_IOA_Data & Reader)
    	temp = 1;
    	else
    	temp = 0;
    	AD_Data = AD_Data<<1;         //先读最高位    	
    	AD_Data = AD_Data | temp;
    }
    AD_Data = AD_Data>>4;             //得到最后的转换结果
    return  AD_Data;
}

//**********************************************************************************//
//函数名称:AGC()
//函数功能:对系统进行自动增益控制
//参数:无
//**********************************************************************************//
void  AGC()
    {    
    	unsigned int ad_dat,sum,j;
    	*P_Watchdog_Clear=1;
    	sum = 0;
    	for(j=0;j<8;j++)
    	{
    		ad_dat = CtrlAndRead7841(CH0);       //读取AD采样值
    		sum = sum + ad_dat;
    	}	
    	AD_Data0 = sum >> 3;                        //取平均值,相当于软件滤波	
    	AMP = AD_Data0 *6; 
        if(AD_Data0<1641)                           //幅度小于1V
          {  
          	 if(data_val<4095) 
             { 
               data_val+=1;
               CtrlTLV5618(data_val);
             }
             else
             { 
               data_val=4095;
               CtrlTLV5618(data_val);
             }   
           }
        else if(AD_Data0>1645 && AD_Data0<3000)                      //幅度大于1V
           {  
           	  if(data_val>0)
              { 
                data_val-=1;
                CtrlTLV5618(data_val);
              }
              else
              {  
                 data_val=0;
                 CtrlTLV5618(data_val);
              }   
           }
        else if(AD_Data0>=3000)
           {
           	  data_val=10;
              CtrlTLV5618(data_val); 	
           }		   
        else
        CtrlTLV5618(data_val);
     }    	

⌨️ 快捷键说明

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