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

📄 adc.c

📁 lpc2148 uc/gui的移植例程
💻 C
字号:
/*****************************************************************************
 *  
  AD转换函数
 *
******************************************************************************/
#include "define.h"
#if ADC_EN                      /*如果启动ADC*/



uint32 ADC0Value[ADC_NUM];
uint32 ADC0IntDone = 0;

#if ADC_INTERRUPT_FLAG
/**************************************************************************************
** 函数名称 :ADC0Handler (void) __irq
** 函数功能 :ADC0中断处理
** 入口参数 :
** 出口参数 :
***************************************************************************************/
void ADC0Handler (void) __irq 
{
    uint32 regVal;
  
    IENABLE;			/* 处理嵌套中断 */

    regVal = AD0STAT;		/* 读ADC将清除ADC中断标志 */
    if ( regVal & 0x0000FF00 )	/*检查OVERRUN  */
    {
	regVal = (regVal & 0x0000FF00) >> 0x08;
	switch ( regVal )
	{
	    case 0x01:
		regVal = AD0DR0;
		break;
	    case 0x02:
		regVal = AD0DR1;
		break;
	    case 0x04:
		regVal = AD0DR2;
		break;
	    case 0x08:
		regVal = AD0DR3;
		break;
	    case 0x10:
		regVal = AD0DR4;
		break;
	    case 0x20:
		regVal = AD0DR5;
		break;
	    case 0x40:
		regVal = AD0DR6;
		break;
	    case 0x80:
		regVal = AD0DR7;
		break;
	    default:
		break;
	}
	AD0CR &= 0xF8FFFFFF;	/*停止ADC */ 
	ADC0IntDone = 1;
	return;	
    }
    
    if ( regVal & ADC_ADINT )
    {
	switch ( regVal & 0xFF )	/* 检查DONE位 */
	{
	    case 0x01:
		ADC0Value[0] = ( AD0DR0 >> 6 ) & 0x3FF;
		break;
	    case 0x02:
		ADC0Value[1] = ( AD0DR1 >> 6 ) & 0x3FF;
		break;
	    case 0x04:
		ADC0Value[2] = ( AD0DR2 >> 6 ) & 0x3FF;
		break;
	    case 0x08:
		ADC0Value[3] = ( AD0DR3 >> 6 ) & 0x3FF;
		break;
	    case 0x10:
		ADC0Value[4] = ( AD0DR4 >> 6 ) & 0x3FF;
		break;
	    case 0x20:
		ADC0Value[5] = ( AD0DR5 >> 6 ) & 0x3FF;
		break;
	    case 0x40:
		ADC0Value[6] = ( AD0DR6 >> 6 ) & 0x3FF;
		break;
	    case 0x80:
		ADC0Value[7] = ( AD0DR7 >> 6 ) & 0x3FF;
		break;		
	    default:
		break;
	}
	AD0CR &= 0xF8FFFFFF;	/*停止ADC */ 
	ADC0IntDone = 1;
    }

    IDISABLE;
    VICVectAddr = 0;	
}
#endif
/**************************************************************************************
** 函数名称 :ADCInit (uint32)
** 函数功能 :ADC初始化
** 入口参数 :要初始化的通道
** 出口参数 :
***************************************************************************************/
boolen ADC_Init(uint32 ADCCLK )
{
/* 引脚设置为ADC功能, AD0.0~7*/	
    PINSEL0 = 0x0F333F00;

    AD0CR = ( 0x01 << 0 ) |   	        /* 设置为N时选择通道N  */
	( ( Fpclk / (ADCCLK - 1 )) << 8 ) |  /* CLKDIV = Fpclk / 1000000 - 1  */
	( 0 << 16 ) | 		// BURST = 0, 1
	( 0 << 17 ) |  		// CLKS = 0, 11
	( 1 << 21 ) |  		// PDN = 1, 
	( 0 << 22 ) |  		// TEST1:0 = 00 
	( 0 << 24 ) |  		// START = 0 A/D 转换停止
	( 0 << 27 );		/* EDGE = 0 (CAP/MAT 上升活下降启动 A/D conversion) */


#if ADC_INTERRUPT_FLAG
    AD0INTEN = 0x11E;		/*使能所有ADC中断*/

    if ( install_irq( ADC0_INT, (uint32*)ADC0Handler ) == FALSE )
    {
	return (FALSE);
    }
#endif
    return (TRUE);
}
/*****************************************************************************
**函数名:		ADC0Read
**
** 功能描述:	读ADC0转换结果
**
** 入口参数:			通道号
** 出口参数:	
** 
*****************************************************************************/
uint32 ADC0Read( uint8 channelNum )
{
#if !ADC_INTERRUPT_FLAG
    uint32 regVal, ADC_Data;
#endif

    /* 通道号 */
    if ( channelNum >= ADC_NUM )
    {
	channelNum = 0;		/*如果大于最大ADC通道数(7)则设置通道为0 */
    }
    AD0CR &= 0xFFFFFF00;
    AD0CR |= (1 << 24) | (1 << channelNum);	
				/* 选择通道开启ADC开始转换*/
#if !ADC_INTERRUPT_FLAG
    while ( 1 )			/* 等待ADC转换结束 */
    {
	regVal = *(volatile unsigned long *)(AD0_BASE_ADDR 
			+ ADC_OFFSET + ADC_INDEX * channelNum);
				/* 读ADC转换结果 */
	if ( regVal & ADC_DONE )
	{
	    break;
	}
    }	
        
    AD0CR &= 0xF8FFFFFF;	/* 停止ADC */    
    if ( regVal & ADC_OVERRUN )	/* 在没有错误的情况下保存数据 */
    {
	return ( 0 );
    }
    ADC_Data = ( regVal >> 6 ) & 0x3FF;
    return ( ADC_Data );	/* 返回ADC转换的值 */
#else
    return ( channelNum );	/* 如果ADC中断启动,那么结果将会在ADC中断服务程序中得到这里只返回通道号 */
#endif
}

#endif
/*********************************************************************************
**                            End Of File
*********************************************************************************/

⌨️ 快捷键说明

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