📄 adc.c
字号:
/*****************************************************************************
* adc.c: ADC module file for NXP LPC23xx Family Microprocessors
* *********** DEVELOPED BY RAVINDRANATH G *************
******************************************************************************/
#include "LPC23xx.h" /* LPC23xx definitions */
#include "type.h"
#include "adc.h"
//******************************************************************************
void init_ADC(BYTE channel)
{
/* Enable CLOCK into ADC controller */
PCONP |= (1 << 12);
AD0CR = ( 0x01 << channel ) | /* SEL=1,select channel 0~7 on ADC0.0 */
( 1 << 8 ) | /* CLKDIV = Fpclk / 1000000 - 1 */
( 1 << 11 ) | /* CLKDIV = 9 i.e. 4.2 Mhz*/
( 0 << 16 ) | /* BURST = 0, no BURST, software controlled */
( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */
( 1 << 21 ) | /* PDN = 1, normal operation */
( 0 << 22 ) | /* TEST1:0 = 00 */
( 0 << 24 ) | /* START = 0 A/D convezrsion stops */
( 0 << 27 ); /* EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion) */
}
DWORD read_ADC(BYTE channel)
{
DWORD regVal, ADC_Data;
AD0CR &= 0xFFFFFF00; /* switch channel,start A/D convert */
AD0CR |= (1 << 24) | (1 << channel); //AD0.0
while ( 1 ) /* wait until end of A/D convert */
{
regVal = *(volatile unsigned long *)(AD0_BASE_ADDR
+ ADC_OFFSET + ADC_INDEX * channel);
/* read result of A/D conversion */
if ( regVal & ADC_DONE )
{
break;
}
}
AD0CR &= 0xF8FFFFFF; /* stop ADC now */
if ( regVal & ADC_OVERRUN ) /* save data when it's not overrun, otherwise, return zero */
{
return ( 0 );
}
ADC_Data = ( regVal >> 6 ) & 0x3FF;
return ( ADC_Data ); /* return A/D conversion value */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -