您的当前位置:首页正文

EFM32外设模块—ADC V1.00

来源:画鸵萌宠网
 广州周立功单片机科技有限公司 ADCEFM32系列微控制器 目 录

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top