1. 概述........................................................................................................................... 1 2. FAQ ............................................................................................................................ 2 3. 实验指导................................................................................................................... 3
3.1 3.2 3.3 3.4 3.5 3.6
实验目的................................................................................................................... 3实验设备................................................................................................................... 3实验内容................................................................................................................... 3试验步骤................................................................................................................... 3实验参考程序........................................................................................................... 3实验结果................................................................................................................... 44. 免责声明................................................................................................................... 5
Technology Co., Ltd. 产品应用笔记 ©2012 Guangzhou ZLG MCU
1
广州周立功单片机科技有限公司 ADCEFM32系列微控制器 1. 概述
模拟数字转换器(Analog to Digital Converter,简称ADC)是EFM32片上模拟外设之一,分辨率为12位时最大采样速率可达1M Samples/s。其具有以下特性:
z z z z z
可编程分辨率(6/8/12-bit);
可选输入通道包括8个外部输入引脚和7个内部输入信号; 单次转换和扫描转换两种工作模式;
可选择使用内部参考电压或外部参考电压; 支持硬件过采样。
如图1.1所示为EFM32片上ADC的结构框图。
图1.1 ADC内部结构框图
产品应用笔记 ©2012 Guangzhou ZLG MCU Technology Co., Ltd.
1
广州周立功单片机科技有限公司 ADCEFM32系列微控制器 2. FAQ
1. 怎样使用与ADC相关的emlib库函数?
A:首先将em_adc.c文件加入工程中,然后在需要调用与ADC相关的emlib库函数的源文件中添加如程序清单2.1所示的预编译代码。
程序清单2.1 预编译代码
#include \"em_adc.h\"
2. 什么是ADC的偏移误差、增益误差?
A:偏移误差是指ADC输入为0时实际转换结果与理想结果的差值。增益误差是指ADC输入最大量程且无偏移误差时,实际转换结果与理想结果的差值。在进行校准时需要先进行偏移校准再进行增益校准。
3. 什么是过采样,使用过采样有什么好处?
A:根据奈奎斯特定理,如果要从数字信号中恢复一个带宽为FB的信号,采样频率FS必须满足FS > 2FB,其中2FB被称为奈奎斯特频率。过采样就是将FS的采样率提高到k*FS。这样可以增加ADC的有效位数,提高采样精度。例如过采样率为2时,理论上可以把12位ADC精度提高到13位。
4. 一个12位的ADC其实际精度可以达到12位吗?
A:不一定,ADC的转换误差不仅仅是由量化误差所引起。一个实际ADC产生的噪声可能会超过量化噪声。由于其传递特性的非线性也会引入失真。那么有效位数为:
ENOB =
S/(N+D)−1.76dB
6.02
其中S(N+D)是以分贝(dB)计的实际信号与噪声加总谐波失真之和的比。例如,若某芯片的ADC在1MSPS的采样率,12位分辨率以及使用1.25V的参考电压时,实际信号与噪声加总谐波失真之和的比为58dB,那么此时该ADC的有效位数只有9.34位。即该12位的ADC转换精度在以上所述情况下仅与一个理想的9位ADC类似。
产品应用笔记 ©2012 Guangzhou ZLG MCU Technology Co., Ltd.
2
广州周立功单片机科技有限公司 ADCEFM32系列微控制器 3. 实验指导
3.1 实验目的
掌握Energy Micro Tiny Gecko系列微控制器EFM32TG840F32的ADC的使用方法。
3.2 实验设备
z 硬件:PC机一台和EFM32TG-STK3300开发板一套; z 软件:IAR(或Keil)集成开发环境。
3.3 实验内容
本实验主要演示如何利用EFM32片上ADC采集电压。
实验例程中配置ADC对内部提供的VDD/3电压信号进行转换,并将转换结果用LCD显示。
3.4 试验步骤
1) 连接开发板USB端口到电脑的USB端口,打开MCU电源; 2) 打开Keil(或IAR)工程,重新编译并下载程序到开发板; 3) 复位MCU,观察LCD显示的电压值。
3.5 实验参考程序
如程序清单3.1所示为主函数,首先进行LCD和ADC的初始化,然后触发ADC转换并进入EM1睡眠模式等待中断唤醒。当ADC转换完成时会触发中断将MCU从EM1睡眠模式唤醒。最后计算ADC转换值得到输入电压值并通过LCD显示。
程序清单3.1 主函数
int main (void) {
INT32U ulVoltage;
CHIP_Init();
SegmentLCD_Init(false); /* 初始化LCD SegmentLCD_Symbol(LCD_SYMBOL_DP10, 1); adcInit();
ADC_Start(ADC0, adcStartSingle); /* 启动单次转换 */ EMU_EnterEM1();
/* 进入EM1等待ADC转换结束 */ /* 计算采集到的电压值
*/
/* LCD显示电压值 */
ulVoltage = ADC_DataSingleGet(ADC0) * 330 / 4095; SegmentLCD_Number(ulVoltage); while(1); }
/* ADC初始化
*/
*/
/* LCD显示小数点 */
SegmentLCD_Write(\"Voltage\"); /* LCD显示字符 */
产品应用笔记 ©2012 Guangzhou ZLG MCU Technology Co., Ltd.
3
广州周立功单片机科技有限公司 ADCEFM32系列微控制器 在ADC的初始化函数中主要完成ADC基本配置和单次转换模式的初始化。配置ADC为12bit分辨率,无过采样,选择VDD作为ADC参考源,输入信号选择内部提供的VDD/3。在初始化函数最后开启ADC单次转换完成中断。初始化函数如程序清单3.2所示。
程序清单3.2 ADC初始化函数
void adcInit (void) {
CMU_ClockEnable(cmuClock_ADC0, true);
ADC_Init_TypeDef tAdcInit = { .ovsRateSel = adcOvsRateSel2,
/* ADC过采样配置 /* 正常预热模式 /* 基时间配置 /* 不使能Tailgate
*/ */ */ */ */
.lpfMode = adcLPFilterBypass, .warmUpMode = adcWarmupNormal,
/* 旁路输入滤波RC电路 */
/* 使能ADC模块时钟 */
.timebase = ADC_TimebaseCalc(0), .tailgate = false };
ADC_InitSingle_TypeDef tSingleInit = { .prsSel .acqTime
= adcPRSSELCh0, = adcAcqTime16,
.prescale = ADC_PrescaleCalc(7000000, 0), /* ADC时钟分频配置
/* 选择PRS通道0 */ /* 配置采集时间为16周期 /* 使用12位分辨率
*/ */
/* 使用VDD参考电压 */ /* 输入选择VDD/3 */ /* 不采用差分采集模式 */ /* 禁能PRS输入 /* 使用右对准
*/ */ */
.reference = adcRefVDD, .resolution = adcRes12Bit, .input .diff
= false,
= adcSingleInpVDDDiv3,
.prsEnable = false, .leftAdjust = false, .rep };
= false
/* 不使用连续转换
ADC_Init(ADC0, &tAdcInit);
ADC_InitSingle(ADC0, &tSingleInit); /*
* 使能单次采集完成中断 */
ADC_IntEnable(ADC0, ADC_IF_SINGLE); NVIC_EnableIRQ(ADC0_IRQn); }
/* 初始化ADC单次转换 */
3.6 实验结果
下载程序到开发板并复位MCU,在LCD的第一行数字区可以看到“01.09”,表示ADC采集到电压值为1.09V。
Technology Co., Ltd. 产品应用笔记 ©2012 Guangzhou ZLG MCU
4
因篇幅问题不能全部显示,请点此查看更多更全内容