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

📄 adc.c

📁 周立功2103开发板CD资料
💻 C
字号:
/*********************************************************************************************************
**文件名称: ADC.c
**功能说明: ADC操作软件包
**使用说明: 
********************************************************************************************************/

#include "config.h"
#include "ADC.h"

static uint8 g_CHn = 0;

/*********************************************************************************************************
**函数名称:uint8 SetADnCH(uint8 CHn)
**函数功能:设置AD转换通道
**入口参数:CHn     AD通道0~7
**出口参数:0 :参数错误
**          1 :操作成功 
**说明:
********************************************************************************************************/
uint8 SetADnCH(uint8 CHn)
{
    if(CHn > 7)	
    {
        return 0;
    }
    
    switch(CHn)		//进行引脚连接
    {
    	case	0:
    		PINSEL1 = PINSEL1|(3<<12);
    		break;
    	case	1:
    		PINSEL1 = PINSEL1|(3<<14);
    		break;
    	case	2:
    		PINSEL1 = PINSEL1|(3<<16);
    		break;
    	case	3:
    		PINSEL0 = PINSEL0|(3<<20);
    		break;
    	case	4:
    		PINSEL0 = PINSEL0|(3<<22);
    		break;
    	case	5:
    		PINSEL0 = PINSEL0|(3<<24);
    		break;
    	case	6:
    		PINSEL1 = PINSEL1|(3<<18);
    		break;
    	case	7:
    		PINSEL1 = PINSEL1|(3<<20);
    		break;
    	default :  break;	
    }

    g_CHn = CHn;

    AD0CR = (AD0CR & 0xFFFFFF00)|(1<<CHn);
    return 1; 
}


/*********************************************************************************************************
**函数名称:uint8 ADC_InitToSW(uint8 nCH, uint32 Fadc, uint8 StartMode, uint8 bEdge)
**函数功能:AD初始化操作
**入口参数:CHn		          AD通道,0~7
**			Fadc	          ADC的转换时钟  ≤4.5MHz
**          StartMode         AD启动方式:
                              0  不启动
                              1  立即启动转换
                              2  bEdge选择的边沿出现在P0.16/EINT0/ MAT0.2脚时启动转换
                              4  bEdge选择的边沿出现在MAT0.1时启动转换
                              5  bEdge选择的边沿出现在MAT0.3时启动转换
                              6  bEdge选择的边沿出现在MAT1.0时启动转换
                              7  bEdge选择的边沿出现在MAT1.1时启动转换
                              
            bEdge             边沿方式选择:bEdge > 0  :在所选CAP/MAT信号的上升沿启动转换
   											bEdge = 0  : 在所选CAP/MAT信号的下降沿启动转换
**出口参数:0 :参数错误
**          1 :初始化成功
**说明:
********************************************************************************************************/
uint8 ADC_InitToSW(uint8 CHn, uint32 Fadc, uint8 StartMode, uint8 bEdge)
{
    uint8 edge;
	if(Fadc > 4500000)	
	{   
	    Fadc = 4500000;		//最大的转换速率为4.5M
	}
	
	if(StartMode > 7)
	{
	    return 0;
	}
	
	if(bEdge > 0)    
	{				  
	    edge = 0;
	}
    else
    {
        edge = 1;
    }
	
	if(SetADnCH(CHn) == 0) 	    //设置通道
	{
	    return 0;
	}
	
	//软件模式
	AD0CR = (AD0CR & 0x000000FF)|
	        ((Fpclk/Fadc - 1)<<8)|	//转换时钟最大为4.5MHz
			(0<<16)|	     //BURST=0,软件控制转换操作
			(0<<17)|	     //CLKS=0,使用11 clock转换
			(1<<21)|	     //PDN=1.正常方式
			(0<<22)|	     //TEST1:0=00,正常工作模式
			(StartMode<<24)| //设置启动模式
			(edge<<27);	     //设置边沿模式 
							 //edge > 0  :在所选CAP/MAT信号的下降沿启动转换
	                         //edge = 0  : 在所选CAP/MAT信号的上升沿启动转换
	return 1;
} 

/*********************************************************************************************************
**函数名称:uint8 ADC_InitToHW(uint8 Ch,uint32 Fadc, uint8 Accurate)
**函数功能:将AD初始化成硬件扫描模式.
**入口参数:Ch          通道设置,按位操作:
                              bit0:   1  使能AD通道0      0  不使能AD通道0
                              bit1:   1  使能AD通道1      0  不使能AD通道1
                              bit2:   1  使能AD通道2      0  不使能AD通道2
                              bit3:   1  使能AD通道3      0  不使能AD通道3
                              bit4:   1  使能AD通道4      0  不使能AD通道4
                              bit5:   1  使能AD通道5      0  不使能AD通道5
                              bit6:   1  使能AD通道6      0  不使能AD通道6
                              bit7:   1  使能AD通道7      0  不使能AD通道7
                              
            Fadc	    ADC的转换时钟  ≤4.5MHz
            Accurate    转换精度,范围3~10bits 
**出口参数:0 : 参数错误
**          1 : 初始化成功
**说明:
********************************************************************************************************/
uint8 ADC_InitToHW(uint8 Ch,uint32 Fadc, uint8 Accurate) 
{
    uint8 i;
    
    if(Fadc > 4500000)	
	{   
	    Fadc = 4500000;		//最大的转换速率为4.5M
	}
	
	if(Accurate > 10)
	{
	   Accurate = 10; 	   //转换精度最高为10bits
	}
	else if(Accurate < 3)
	{
	    Accurate = 3;	   //转换精度最低为3bits
	}
	
	for(i = 0; i < 8; i++)
	{
	    if(Ch & (1<<i))
	    {
            switch(i)		//进行引脚连接
            {
            	case	0:
            		PINSEL1 = PINSEL1|(3<<12);
            		break;
            	case	1:
            		PINSEL1 = PINSEL1|(3<<14);
            		break;
            	case	2:
            		PINSEL1 = PINSEL1|(3<<16);
            		break;
            	case	3:
            		PINSEL0 = PINSEL0|(3<<20);
            		break;
            	case	4:
            		PINSEL0 = PINSEL0|(3<<22);
            		break;
            	case	5:
            		PINSEL0 = PINSEL0|(3<<24);
            		break;
            	case	6:
            		PINSEL1 = PINSEL1|(3<<18);
            		break;
            	case	7:
            		PINSEL1 = PINSEL1|(3<<20);
            		break;
            	default :  break;	
            }
            
	    }//endof if(Ch & (1<<i))

	}
	
	//硬件扫描模式
	AD0CR = Ch|                     //设置通道
           ((Fpclk/Fadc - 1)<<8)|	//转换时钟最大为4.5MHz
    		(1<<16)|	            //BURST=0,软件控制转换操作
    		((10-Accurate)<<17)|	//CLKS
    		(1<<21)|	            //PDN=1.正常方式
    		(0<<22)|	            //TEST1:0=00,正常工作模式
    		(0<<24)|                //硬件扫描模式下必须为000,否则AD不能启动
    		(0<<27);	            //硬件扫描模式下无效 

	
	return 1;

}

/*********************************************************************************************************
**函数名称:void ADC_PowerDown(uint8 bPD)
**函数功能:ADC掉电控制
**入口参数:bPD       0:  ADC正常工作
                      >0: ADC掉电
**出口参数:无
**说明:    控制ADC的掉电
********************************************************************************************************/
void ADC_PowerDown(uint8 bPD)
{
    if(bPD > 0)
    {
        AD0CR &= ~(1<<21); //ADC 掉电
    }
    else
    {   
        AD0CR |= 1<<21; //ADC正常工作
    }
}

/*********************************************************************************************************
**函数名称:uint8 Read_ADC(uint32 *ADC_Data)
**函数功能:读取AD转换值
**入口参数:ADC_Data  读取出来的AD结果
**出口参数:0:参数错误
            1:操作成功
**说明:    
********************************************************************************************************/
uint8 Read_ADC(uint32 *ADC_Data)
{
    uint32 Val;
    
    AD0CR |= (1<<24);					     	    //启动转换
	while((AD0STAT & (0x00000001 << g_CHn))==0);	//等待转换结束

    Val = *((volatile unsigned long *)(0xE0034010+g_CHn*4));  //读取指定通道的AD0DR(0~7)
    *ADC_Data = (Val>>6) & 0x3ff;	//处理转换值
    return 1;   
    
} 

/*********************************************************************************************************
**函数名称:uint8 SetADnIntEn(uint8 CHn)
**函数功能:使能指定AD通道产生中断标志
**入口参数:CHn		AD通道,0~7  当CHn = 8时表示仅使能ADDR中的全局DONE标志来产生中断。
**出口参数:0:参数错误
            1:操作成功
**说明:    
********************************************************************************************************/
uint8 SetADnIntEn(uint8 CHn)
{
    if(CHn > 8)
    {
        return 0;
    } 
           
    AD0INTEN = 1<<CHn; 
    
    return 1;
}







⌨️ 快捷键说明

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