ADC功能特性:
1、12bitADC转换结果。
2、范围最大5V
3、选择电压3.0V-5.5V参考电压2.5V-VADD
4、8通道输入4个差动输入。
5、800KHZ的采样频率1.25US的时间。
6、最高20MHZADC工作频率。
7、三种模式:单模式,单循环模式,连扫描模式。
8、ADC启动:可以通过软件写ADST寄存器或者外部STADC
9、转换结果:每一个通道转换结果在每个通道存着。
10、转换结果可以同特别值比较,若相等可以产生中断。
11、有自检模式可以减少误差。
12、支持三个转换源:外部模拟电压、内部电压、内部温度传感器。
ADC分频器原理
ADC的模块框图
单次转换原理:
执行效果图
下以程序是用单次ADC,把助学板的AD1就是可调电压转换过来,然后通过串口发出结果
#include <stdio.h>
#include "NUC1xx.h"
#include "..\Driver\DrvGPIO.h"
#include "..\Driver\DrvI2C.h"
#include "..\Driver\DrvSYS.h"
#include "..\Driver\DrvUART.h"
void InitUART(void)
{
STR_UART_T sParam;
/* Set UART0 Pin */
DrvGPIO_InitFunction(E_FUNC_UART0);
/* UART Setting */
sParam.u32BaudRate = 9600;
sParam.u8cDataBits = DRVUART_DATABITS_8;
sParam.u8cStopBits = DRVUART_STOPBITS_1;
sParam.u8cParity = DRVUART_PARITY_NONE;
sParam.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES;
/* Select UART Clock Source From 12Mhz*/
DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);
/* Set UART0 Configuration */
DrvUART_Open(UART_PORT0, &sParam);
}
void InitADC(void)
{
/* Step 1. GPIO initial */
GPIOA->OFFD|=0x00020000; //the no.2 Disable digital input path
SYS->GPAMFP.ADC1_AD12=1; //Set ADC function
/* Step 2. Enable and Select ADC clock source, and then enable ADC module */
SYSCLK->CLKSEL1.ADC_S = 2; //Select 22Mhz for ADC
SYSCLK->CLKDIV.ADC_N = 1; //ADC clock source = 22Mhz/2 =11Mhz;
SYSCLK->APBCLK.ADC_EN = 1; //Enable clock source
ADC->ADCR.ADEN = 1; //Enable ADC module
/* Step 3. Select Operation mode */
ADC->ADCR.DIFFEN = 0; //single end input
ADC->ADCR.ADMD = 0; //single mode
/* Step 4. Select ADC channel */
ADC->ADCHER.CHEN = 0x02;
/* Step 5. Enable ADC interrupt */
ADC->ADSR.ADF =1; //clear the A/D interrupt flags for safe
ADC->ADCR.ADIE = 1;
// NVIC_EnableIRQ(ADC_IRQn);
/* Step 6. Enable WDT module */
ADC->ADCR.ADST=1;
}
void Delay(int count)
{
while(count--)
{
// __NOP;
}
}
/*---------------------------------------------------------------------------------------------------------*/
/*MAIN Function*/
/*---------------------------------------------------------------------------------------------------------*/
int main (void)
{
//uint32_t u32HCLK;
char adc_value[15]="ADC Value:";
UNLOCKREG();
SYSCLK->PWRCON.XTL12M_EN = 1;
SYSCLK->CLKSEL0.HCLK_S = 0;
//u32HCLK = DrvSYS_GetHCLKFreq() * 1000;
LOCKREG();
InitADC();
InitUART();
while(1)
{
//printf(adc_value);
while(ADC->ADSR.ADF==0);
ADC->ADSR.ADF=1;
printf(adc_value);
printf("%d\n",ADC->ADDR[1].RSLT);
Delay(20000);
//printf(adc_value);
ADC->ADCR.ADST=1;
}
}
NUC testADC.rar
(1.43 MB)
|