MSP432的ADC模数转换
ADC相关知识ADC传感器(温度、压力、流量等模拟量)->A/D->处理量(数字量)->显示设备能够将模拟量转换为数字量的器件称为模数转换器,简称A/D转换器或ADC。传感器(温度、压力、流量等模拟量)->A/D->处理量(数字量)->D/A->执行部件(模拟量控制)能够将数字量转换为模拟量的器件称为数模转换器,简称D/A转换器或DAC。ADC和DAC是沟
专栏
ADC相关知识
ADC
传感器(温度、压力、流量等模拟量)->A/D->处理量(数字量)->显示设备
能够将模拟量转换为数字量的器件称为模数转换器,简称A/D转换器或ADC。
传感器(温度、压力、流量等模拟量)->A/D->处理量(数字量)->D/A->执行部件(模拟量控制)
能够将数字量转换为模拟量的器件称为数模转换器,简称D/A转换器或DAC。
ADC和DAC是沟通模拟电路和数字电路的桥梁,也可称之为两者之间的接口
模/数转换概述
模数转换基本过程
在ADC转换过程中,因为输入的模拟信号在时间上是连续的,而输出的数字信号是离散的,所以ADC转换器在进行转换时,必须在一系列选定的瞬间(时间坐标轴上的一些规定点上)对输入的模拟信号采样,然后把这些采样值转换为数字量。因此,一般的ADC转换过程是通过采样保持、量化和编码这三个步骤完成的,即首先对输入的模拟电压信号采样,采样结束后进入保持时间,在这段时间内将采样的电压量转换为数字量,并按一定的编码形式给出转换结果,然后开始下一次采样。图6-8给出模拟量到数字量转换过程的框图。
模/数转换器ADC的通用基础知识
AD转换模块,即模/数转换模块(Analog To Digital Convert Module),其功能是将电压信号转换为相应的数字信号。
1、与AD转换编程直接相关的基本问题
①转换精度
②转换速度
③单端输入与差分输入
④AD参考电压
⑤滤波问题
⑥物理量回归
①转换精度
转换精度就是指数字量变化一个最小量时模拟信号的变化量,也称为分辨率(Resolution),通常用AD转换器的位数来表征。
通常,AD转换模块的位数通常有8位、10位、12位、14位、16位等。设采样位数为N,则最小的能检测到的模拟量变化值为1/2^N。
例如,某一AD转换模块是12位,若参考电压为5V(即满量程电压),则可检测到的模拟量变化最小为5/2^12 = 1.22(mV),就是这个AD转换器的实际精度(分辨率)了。
②转换速度
转换速度通常用完成一次AD转换所需要的时间来表征。
转换速度与AD转换器的硬件类型及制造工艺等因素密切相关。其特征值为纳秒级。
AD转换器的硬件类型主要有:逐次逼近型、积分型、∑-△调制型等等。
③单端输入与差分输入
单端输入只有一个输入引脚,使用公共地GND作为参考电平。这种输入方式的优点是简单,缺点是容易受干扰,由于GND电位始终是0V,因此AD值也会随着干扰而变化。
差分输入比单端输入多了一个引脚,AD采样值是两个引脚的电平差值(VIN+、VIN-两个引脚电平相减),优点是降低了干扰,缺点是多用了一个引脚。通常两根差分线会布在一起,因此受到的干扰程度接近,引入AD转换引脚的共模干扰,在进入AD内部电路时会被减掉,从而降低了干扰。
④AD参考电压
AD转换需要一个参考电平。比如要把一个电压分成1024份,每一份的基准必须是稳定的,这个电平来自于基准电压,就是AD参考电压。
粗略的情况,AD参考电压使用给芯片功能供电的电源电压。更为精准的要求,AD参考电压使用单独电压,要求功率小(在mW级即可),但波动小(例如0.1%),一般电源电压达不到这个精度,否则成本太高。
⑤滤波问题
为了使采样的数据更准确,必须对采样的数据进行筛选去掉误差较大的毛刺。
通常我们采用中值滤波和均值滤波来提高采样精度。所谓中值滤波,就是将M次连续采样值按大小进行排序,取中间值作为滤波输出。而均值滤波,是把N次采样结果值相加,然后再除以采样次数N,得到的平均值就是滤波结果。
若要得到更高的精度,可以通过建立其他误差模型分析方式来实现。
⑥物理量回归
在实际应用中,得到稳点的AD采样值以后,还需要把AD采样值与实际物理量对应起来,这一步称为物理量回归。
AD转换的目的是把模拟信号转化为数字信号,供计算机进行处理,但必须知道AD转换后的数值所代表的实际物理量的值,这样才有实际意义。
例如,利用MCU采集室内温度,AD转换后的数值是126,实际它代表多少温度呢?如果当前室内温度是25.1°C,则AD值126就代表实际温度25.1°C。
2、最简单的AD转换采样电路
这里给出一个最简单的AD转换采样电路,以表征AD转换应用中的硬件电路的基本原理示意。以光敏/温度传感器为例。
在实际应用中,将光敏或热敏电阻接入图10-2的采样电路中,光敏或热敏电阻和一个特定阻值的电阻串联,由于光敏或热敏电阻会随之外界环境的变化而变化,因此AD采样点的电压也会随之变化,AD采样点的电压为:
式中x是一特定阻值,根据光敏或热敏电阻的不同而加以选定。
3、采样保持电路
采样保持电路(Sample hold devices,缩写为S/H)是模数转换系统中的一种重要电路,其作用是采集模拟输入电压在某一时刻的瞬时值,并在模数转换器进行期间保持输出电压不变,以供模数转换。该电路存在的原因在于模数转换需要一定时间,在转换过程中,如果送给ADC的模拟量发生变化,则不能保证采样的精度。为了简单起见,在此我们只分析单端输入ADC的采样保持电路,如图6-9所示。
采样保持电路有两种工作状态:采样状态和保持状态。当控制开关K闭合时,输出跟随输入变化,称为采样状态,当控制开关K断开时,由保持电容C维持该电路的输出不变,称为保持状态。
4、多通道同步采样和分时复用
大多数单片机都集成了8个以上的ADC通道,这些单片机内部的ADC模块大多都是多通道分时复用的结构,其内部其实只有一个ADC内核,依靠增加模拟开关的方法轮流使用ADC内核,所以,有多个ADC的输入通道。MSP432单片机也是采用这种结构,如图6-10所示。
同步采样ADC实际就是多个完整独立的ADC。如图6-11所示为3通道同步采样ADC的示意图。每一组通道都有各自独立的采样保持电路和ADC内核,3个ADC模块共用控制电路和输入输出接口。
同步采样可以完成以下两项特殊工作:
(1)同时采集具有时间关联性的多组信号。例如,在交流电能计量中,需要同时对电流和电压进行采样,才能正确得出电流电压波形的相位差,进而算出功率因数。
(2)将N路独立ADC均匀错相位地对同一信号进行采样,可以“实质”上提高N倍采样率(这与等效时间采样不同)。在实际应用中,当由于多种原因难以获取高采样率ADC时,就可以使用多个ADC同步采样的方法来提高总的采样率。相比分立的多个ADC,集成在一个芯片上的同步ADC在均匀错相位控制方面更简单。
MSP432单片机内有高速14位ADC模块。因此,本节主要以ADC14模块为例,介绍模式转换模块。
MSP432相关ADC资源
MSP432中的ADC
MSP432包含一个14位的ADC14模块,支持快速14位模数转换。ADC14模块采用的是SAR(逐次逼近)内核,有32个独立的缓冲区和对应的控制寄存器,32路单端/差分可选的外部输入通道。在最高分辨率时,最高转换速率可达1Msps。
ADC14模块的特性
- 高达1Msps的最大转换率;
- 无数据丢失的单调的14位转换器,可以通过软件选择8位、10位、12位和14位模数转换;
- 采样周期可由软件或定时器编程控制的采样保持功能;
- 可通过软件或定时器启动转换;
- 可通过软件选择片内参考电压(1.2V、1.45V或2.5V);
- 可通过软件选择内部或外部参考电压;
- 高达32路可单独配置的外部输入通道,可选择单端输入或差分输入;
- 可为内部温度传感器、1/2*AVCC和外部参考电压分配转换通道;
- 正或负参考电压通道可独立选择;
- 转换时钟源可选;
- 具有单通道单词、单通道多次、序列通道单次和序列通道多次的转换模式;
- ADC内核和参考电压都可独立关闭;
- 具有38路快速响应的ADC中断;
- 具有32个转换结果存储寄存器。
ADC14相关寄存器
模/数转换模块ADC14
ADC14模块的结构框图如图6-12所示。ADC14模块支持快速的14位模数转换。该模块具有一个14位的逐次渐进(SAR)内核、模拟输入多路复用器、参考电压发生器、采样及转换所需的时序控制电路和32个转换结果缓冲及控制寄存器。转换结果缓冲及控制寄存器允许在没有CPU干预的情况下,进行多达32路ADC采样、转换和保存。下面对ADC14内部各模块进行介绍。
14-Bit ADC Core
-
ADC核心将模拟输入转换为其14位数字表示。
-
核心使用两个可编程电压基本(VR+和VR-)来定义转换的上限和下限。
-
当输入信号等于或大于VR+时,数字输出(NADC)为全尺度(3FFFh),当输入信号等于或小于VR-时为零。输入通道和参考电压电平(VR+和VR-)定义在转换控制存储器中。
-
单端模式ADC结构NADC的转换公式
-
差分模式下ADC结构NADC的转换公式
-
单端模式ADC输出饱和时的输入电压
转换时钟选择
- ADC14CLK为转换时钟。
- 在选择脉冲放大模式时产生采样周期。使用ADC14SSELx位选择高精度ADC源时钟。
- 输入时钟可以使用ADC14PDIV位除以1、4、32或64,然后使用ADC14DIV位除以1到8.
- ADC14CLK可能的来源是MODCLK、SYSCLK、ACLK、MCLK、SMCLK和HSMCLK。
- 应用程序必须确保为ADC14CLK选择的时钟一直处于活动状态,直到aconversion结束。如果在转换过程中时钟被删除,则该操作不完成,且任何结果为无效的。
精密ADC输入和复用器
-
MSP432提供多达32个外部和多达6个内部模拟信号,转换通道为由模拟输入多路复用器选择。
-
可用通道的数量是特定于设备的,并且是给定的特定于设备的数据表。
-
输入多路复用器是一种先断路后断路的复用器,用于减少输入对输入通道切换产生的噪声注入(见图22-2)
电压参考
- 精密ADC模块可以使用芯片上的共享参考模块,该参考模块提供1.2V、1.45V和2.5V三个可选电压级别(配置细节请参阅REF模块一章)VR+和VR-。
- 这些参考电压可用于内部和外部的引脚VREF+。或者可以通过引脚VREF+/VeREF+和VeREF-分别为VR+和VR-提供外部参考。
- 建议在使用将VeREF-连接到设备的GND信号端,同时设置寄存器ADC14VRSEL为1110或1111 b。
转换内存
- 有32个ADC14MEMx转换内存寄存器来存储转换结果。
- 每个ADC14MEMx配置有关联的ADC14MCTLx控制寄存器。
- ADC14VRSEL位定义参考电压参考。
- ADC14INCHx和ADC14DIF位定义输入通道。
- ADC14EOS位定义使用顺序转换模式。
- 当转换完成,寄存器ADC14IFGRx被置位。
- 可能的设置格式如下页图片所示。
精密ADC转换方式
- 表22-3列出CONSEQx钻头选择的四种ADC精确工作模式。所有状态图都采用14位分辨率设置
(1)单通道单次转换模式
ModeA单通道采样转换一次。ADC结果被写入由CSTARTADDx位定义的ADC14MEMx。下图为14位模式(adc14res = 03h)时单通道单转换模式的流程。当ADC14SC触发转换时,可以由ADC14SC位触发连续的转换。当使用任何其他触发器源时,必须在每次转换之间切换ADC14ENC。低脉冲持续时间必须至少三个ADC14CLK周期。
(2)通道顺序模式(自动扫描模式)
在通道序列模式(也称为自动扫描模式)中,对通道序列进行一次采样和转换。ADC结果从CSTARTADDx位定义的ADCMEMx开始写入转换存储器。在用一个集合测量通道后,序列停止ADC14EOS。左图显示了14位模式(ADC14RES = 03h)的通道序列模式。当ADC14SC启动一个序列时,ADC14SC位还可以启动其他序列。
(3)通道重复序列模式(重复自动扫描模式)
在此模式下,对通道序列进行采样,并进行重复转换。这种模式也称为重复自动扫描模式。
停止转换
- 停止精度ADC活动取决于操作方式。
- 停止ADC活动转换或转换序列的方法有:
- 在单通道单转换模式下设置ADC14ENC = 0,立即停止转换。结果是不可靠的。为了得到可靠的结果,在清除ADC14ENC之前轮询忙碌位,直到它被重置。
- 设置ADC14ENC = 在重复单通道操作时,在电流转换结束时停止转换器。
- 在序列或重复序列模式中设置ADC14ENC = 0,以在当前转换结束时停止转换器。
- 若要在任何模式下立即停止转换,请设置CONSEQx = 0和ADC14ENC = 0。在这种情况下,转换数据是不可靠的。
集成温度传感器
- 芯片集成了片上温度传感器
- 将ADC14CTL1寄存器中ADC14TCMAP位设置为1,即可选择温度传感器为输入通道
- 选择模拟输入通道ADC14INCHx = MAX 1,其中MAX为温度传感器零启动计数时设备外部ADC输入通道的最大数量。
- 图为典型的温度传感器传递函数,需要进行校准。使用温度传感器时,采样周期必须大于5 s。
窗口比较器
- 窗口比较器允许在没有任何CPU交互的情况下监视模拟信号。
- 如果ADC14MCTLx寄存器中的ADC14WINC位置1,芯片将ADC14MEMx转换结果进行转换
- ADC14LO中断标志(ADC14LOIFG):当前精度ADC转换结果小于寄存器ADC14LO中定义的低阈值)
- ADC14HI中断标志(ADC14HIIFG):当前精度ADC转换结果的情况下设置的大于寄存器ADC14HI中定义的高阈值。
- ADC14IN中断标志(ADC14INIFG):当前ADC转换的结果在设置的寄存器ADC14LO和ADC14HI之间。
- 这些中断是独立于转换模式生成的。
ADC+SDK资源
我们打开MSP432_DriverLib_Users_Guide-MSP432P4xx.pdf官方手册,进入目录2 14-Bit Analog-to-Digital Converter (ADC14),并进行分析。
模数转换SDK相关
- The ADC14 module for Driver Library is designed to allow the user to make simple analog to digital conversions as well make complex and simultaneous conversions across multiple channels.
- Conversion Modes
- Repeat Modes
Conversion Modes
Repeat Modes
Conversion of Results
Functions
编程实例
操作实例
在CCS中导入所安装的SDK的目录下C:\ti\simplelink_msp432p4_sdk_3_40_01_02\examples\nortos\MSP_EXP432P401R\driverlib\adc14_single_conversion_repeat\ccs 的工程文件
导入后打开adc14_single_conversion_repeat.c文件进行分析:
程序功能:通过单通道对旋转电位器进行反复采样。
电位器VCC引脚接板上5V,GND引脚接GND,OUT引脚接P5.5。
static volatile uint16_t curADCResult;//存储转换结果
static volatile float normalizedADCRes;//存储转换结果转换的电压值
int main(void)
{
MAP_WDT_A_holdTimer();//关闭看门狗
curADCResult = 0;//参数初始化
//配置Flash
MAP_FlashCtl_setWaitState(FLASH_BANK0, 2);
MAP_FlashCtl_setWaitState(FLASH_BANK1, 2);
//设置DCO 为48MHz
MAP_PCM_setPowerState(PCM_AM_LDO_VCORE1);
MAP_CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
//使能FPU,进行小数点运算
MAP_FPU_enableModule();
MAP_FPU_enableLazyStacking();
//从这里开始配置ADC
MAP_ADC14_enableModule();
//时钟配置
MAP_ADC14_initModule(ADC_CLOCKSOURCE_MCLK, ADC_PREDIVIDER_1, ADC_DIVIDER_4, 0);
//GPIO配置,将P5.5配置为ADC输入
MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5 , GPIO_PIN5, GPIO_TERTIARY_MODULE_FUNCTION);
//配置ADC存储器、通道、采样方式
MAP_ADC14_configureSingleSampleMode(ADC_MEM0, true);
MAP_ADC14_configureConversionMemory(ADC_MEM0, ADC_VREFPOS_AVCC_VREFNEG_VSS, ADC_INPUT_A0, false);
//配置采样定时器
MAP_ADC14_enableSampleTimer(ADC_MANUAL_ITERATION);
//使能转换
MAP_ADC14_enableConversion();
MAP_ADC14_toggleConversionTrigger();
//中断配置
MAP_ADC14_enableInterrupt(ADC_INT0);
MAP_Interrupt_enableInterrupt(INT_ADC14);
MAP_Interrupt_enableMaster();
while (1)
{
MAP_PCM_gotoLPM0();//进入低功耗模式LPM0
}
}
//ADC 中断处理函数
void ADC14_IRQHandler(void)
{
uint64_t status = MAP_ADC14_getEnabledInterruptStatus();
MAP_ADC14_clearInterruptFlag(status);//清除中断标志
if (ADC_INT0 & status)
{
curADCResult = MAP_ADC14_getResult(ADC_MEM0);//得到ADC转结果
normalizedADCRes = (curADCResult * 3.3) / 16384;//结果转换为电压
//printf("%d\n", normalizedADCRes);
//printf("%f\n", normalizedADCRes);
//printf("%f\n", 3.3);
//printf("%d.%d\n", ???);
MAP_ADC14_toggleConversionTrigger();//手动开启ADC转换
}
}
编译代码,设置断点
可用printf语句检测输出normalizedADCRes值,也可用视窗去检测变量normalizedADCRes,旋转电位器即可看到变化:
相关知识点
引脚复用
- 查看芯片data sheet
printf
C语言嵌入式编程printf语句和纯粹的C语言编程中的printf语句不同。
嵌入式编程中的printf是经过改造的打印语句,一般只支持%d的整数输出。
资料
更多推荐
所有评论(0)