?? adc.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 + =
減小字號
Ctrl + -