//*******************************************************************************
//** 厦门慧燊智能科技有限公司
//**
//**
//**
//**
//**
//**---------------------------------文件信息------------------------------------
//**文 件 名: adc.c
//**编 译 器: MDK5.23
//**描 述: lpc82xADC操作
//**
//**创 建 人: 沈德稳
//**最后修改日期:
//**项目 名称:
//**备 注:
//*******************************************************************************
//*******************************************************************************
// 系统头文件
//*******************************************************************************
#include "LPC8xx.h"
#include <stdio.h>
#include "lpc8xx_adc.h"
#include "lpc8xx_swm.h"
#include "lpc8xx_syscon.h"
#include "utilities.h"
//*******************************************************************************
//** 函数名称 : ADCInit
//** 功能描述 : ADC初始化
//** 输 入 : 无
//**
//**
//**
//**
//** 输 出 : 无
//** 返 回 : 无
//** 全局变量 :
//** 调用模块 :
//** 作 者 : 沈德稳
//** 日 期 : 2017年06月06日
//**-----------------------------------------------------------------------------
//** 修 改 人 :
//** 日 期 :
//**-----------------------------------------------------------------------------
//*******************************************************************************
void ADCInit(void)
{
uint32_t current_clkdiv;
LPC_SYSCON->PDRUNCFG &= ~(ADC_PD);
LPC_SYSCON->PRESETCTRL &= (ADC_RST_N);
LPC_SYSCON->PRESETCTRL |= ~(ADC_RST_N);
LPC_SYSCON->SYSAHBCLKCTRL |= ADC;
LPC_GPIO_PORT->DIR0 &= ~sADC0; //* 将P0.7方向设置为输入
LPC_GPIO_PORT->DIR0 &= ~sADC1; //* 将P0.6方向设置为输入
LPC_GPIO_PORT->DIR0 &= ~sADC2; //* 将P0.14方向设置为输入
LPC_SWM->PINENABLE0 &= ~(ADC_0|ADC_1|ADC_2); // 固定AD引脚使能,未使用开关矩阵 使能ADC-0-2为AD转换功能
LPC_SWM->PINENABLE0 |= (ADC_3|ADC_4|ADC_5|ADC_6|ADC_7|ADC_8|ADC_9|ADC_10|ADC_11); // 禁止AD3-11AD转换功能
current_clkdiv = (SystemCoreClock / 500000) - 1;
LPC_ADC->CTRL = (1UL << ADC_CALMODE) | (current_clkdiv & 0xFF);
while ((LPC_ADC->CTRL & (1UL << ADC_CALMODE)) != 0);
}
//*******************************************************************************
//** 函数名称 : adc_read
//** 功能描述 : 读取ADC转换结果 12位
//** 输 入 : channels ADC通道
//**
//**
//**
//**
//** 输 出 : 无
//** 返 回 : 无
//** 全局变量 :
//** 调用模块 :
//** 作 者 : 沈德稳
//** 日 期 : 2017年06月06日
//**-----------------------------------------------------------------------------
//** 修 改 人 :
//** 日 期 :
//**-----------------------------------------------------------------------------
//*******************************************************************************
uint16_t adc_read_Dat(uint8_t channels)
{
volatile uint32_t data;
// 设置ADC通道
LPC_ADC->SEQA_CTRL &= ~(0xFFF);
LPC_ADC->SEQA_CTRL |= (1UL << channels);
// 开始AD转换
LPC_ADC->SEQA_CTRL |= ((1UL << ADC_START) | (1UL << ADC_SEQ_ENA));
do
{
data = LPC_ADC->SEQA_GDAT; // 读取数据
} while ((data & (1UL << 31)) == 0); // 直到数据有效
// 停止AD转换
LPC_ADC->SEQA_CTRL &= ~(1UL << ADC_SEQ_ENA);
return (uint16_t)((data >> 4) & 0xfff);
}