MSP432的ADC模数转换

专栏

基于MSP432的嵌入式系统实践

ADC相关知识

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),其功能是将电压信号转换为相应的数字信号。

图10-1 数字控制系统组成框图

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 采样电路

在实际应用中,将光敏或热敏电阻接入图10-2的采样电路中,光敏或热敏电阻和一个特定阻值的电阻串联,由于光敏或热敏电阻会随之外界环境的变化而变化,因此AD采样点的电压也会随之变化,AD采样点的电压为:

采样点的电压公式
式中x是一特定阻值,根据光敏或热敏电阻的不同而加以选定。

3、采样保持电路

采样保持电路(Sample hold devices,缩写为S/H)是模数转换系统中的一种重要电路,其作用是采集模拟输入电压在某一时刻的瞬时值,并在模数转换器进行期间保持输出电压不变,以供模数转换。该电路存在的原因在于模数转换需要一定时间,在转换过程中,如果送给ADC的模拟量发生变化,则不能保证采样的精度。为了简单起见,在此我们只分析单端输入ADC的采样保持电路,如图6-9所示。

6-9 采样保持电路示意图

采样保持电路有两种工作状态:采样状态和保持状态。当控制开关K闭合时,输出跟随输入变化,称为采样状态,当控制开关K断开时,由保持电容C维持该电路的输出不变,称为保持状态。

4、多通道同步采样和分时复用

大多数单片机都集成了8个以上的ADC通道,这些单片机内部的ADC模块大多都是多通道分时复用的结构,其内部其实只有一个ADC内核,依靠增加模拟开关的方法轮流使用ADC内核,所以,有多个ADC的输入通道。MSP432单片机也是采用这种结构,如图6-10所示。

图6-10 ADC内核

同步采样ADC实际就是多个完整独立的ADC。如图6-11所示为3通道同步采样ADC的示意图。每一组通道都有各自独立的采样保持电路和ADC内核,3个ADC模块共用控制电路和输入输出接口。

图6-11 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

ADC14模块的结构框图如图6-12所示。ADC14模块支持快速的14位模数转换。该模块具有一个14位的逐次渐进(SAR)内核、模拟输入多路复用器、参考电压发生器、采样及转换所需的时序控制电路和32个转换结果缓冲及控制寄存器。转换结果缓冲及控制寄存器允许在没有CPU干预的情况下,进行多达32路ADC采样、转换和保存。下面对ADC14内部各模块进行介绍。

6-12 ADC模块的结构框图
14-Bit ADC Core

  • ADC核心将模拟输入转换为其14位数字表示。

  • 核心使用两个可编程电压基本(VR+和VR-)来定义转换的上限和下限。

  • 当输入信号等于或大于VR+时,数字输出(NADC)为全尺度(3FFFh),当输入信号等于或小于VR-时为零。输入通道和参考电压电平(VR+和VR-)定义在转换控制存储器中。

  • 单端模式ADC结构NADC的转换公式
    单端模式ADC结果NADC的转换公式

  • 差分模式下ADC结构NADC的转换公式
    差分模式下ADC结果NADC的转换公式

  • 单端模式ADC输出饱和时的输入电压
    单端模式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)
    图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被置位。
  • 可能的设置格式如下页图片所示。

Table 22-2

精密ADC转换方式

  • 表22-3列出CONSEQx钻头选择的四种ADC精确工作模式。所有状态图都采用14位分辨率设置
    Table 22-3

(1)单通道单次转换模式

ModeA单通道采样转换一次。ADC结果被写入由CSTARTADDx位定义的ADC14MEMx。下图为14位模式(adc14res = 03h)时单通道单转换模式的流程。当ADC14SC触发转换时,可以由ADC14SC位触发连续的转换。当使用任何其他触发器源时,必须在每次转换之间切换ADC14ENC。低脉冲持续时间必须至少三个ADC14CLK周期。
Figure 22-7

(2)通道顺序模式(自动扫描模式)

在通道序列模式(也称为自动扫描模式)中,对通道序列进行一次采样和转换。ADC结果从CSTARTADDx位定义的ADCMEMx开始写入转换存储器。在用一个集合测量通道后,序列停止ADC14EOS。左图显示了14位模式(ADC14RES = 03h)的通道序列模式。当ADC14SC启动一个序列时,ADC14SC位还可以启动其他序列。

Figure 22-8

(3)通道重复序列模式(重复自动扫描模式)

在此模式下,对通道序列进行采样,并进行重复转换。这种模式也称为重复自动扫描模式。
Figure 22-9

停止转换

  • 停止精度ADC活动取决于操作方式。
  • 停止ADC活动转换或转换序列的方法有:
    • 单通道单转换模式下设置ADC14ENC = 0,立即停止转换。结果是不可靠的。为了得到可靠的结果,在清除ADC14ENC之前轮询忙碌位,直到它被重置。
    • 设置ADC14ENC = 在重复单通道操作时,在电流转换结束时停止转换器。
    • 序列或重复序列模式中设置ADC14ENC = 0,以在当前转换结束时停止转换器。
    • 若要在任何模式下立即停止转换,请设置CONSEQx = 0和ADC14ENC = 0。在这种情况下,转换数据是不可靠的。

集成温度传感器

  • 芯片集成了片上温度传感器
  • 将ADC14CTL1寄存器中ADC14TCMAP位设置为1,即可选择温度传感器为输入通道
  • 选择模拟输入通道ADC14INCHx = MAX 1,其中MAX为温度传感器零启动计数时设备外部ADC输入通道的最大数量。
  • 图为典型的温度传感器传递函数,需要进行校准。使用温度传感器时,采样周期必须大于5 s。

Figure 22-11

窗口比较器

  • 窗口比较器允许在没有任何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
Conversion Modes
Conversion Modes
Repeat Modes

Repeat Modes

Conversion of Results
Conversion of Results
Functions

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 6.12 引脚复用
    引脚复用
    表 6-71
    引脚复用
    表 6-75

printf

C语言嵌入式编程printf语句和纯粹的C语言编程中的printf语句不同。

嵌入式编程中的printf是经过改造的打印语句,一般只支持%d的整数输出。

资料

MSP432P401R官方手册

  • 32
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
MSP432微控制器提供了多通道ADC模数转换器)功能,可以同时采样多个输入通道的模拟信号。通过配置ADC模块的寄存器,您可以选择要采样的通道和采样的顺序。 以下是使用MSP432ADC多通道采样的一般步骤: 1. 配置ADC模块:设置ADC控制寄存器和配置位,选择ADC输入时钟源和分频因子。 2. 配置引脚:将所需的模拟输入通道引脚配置为ADC输入。 3. 配置ADC序列:选择要采样的通道和采样顺序。MSP432具有多个序列,每个序列可以包含多个通道。 4. 启动ADC转换:启动ADC转换过程。 5. 读取采样结果:等待转换完成,并从ADC结果寄存器中读取采样结果。 以下是一个简单的示例代码片段,展示了如何配置ADC多通道采样: ```c #include <msp432.h> void ADC_Init(void) { ADC14->CTL0 &= ~ADC14_CTL0_ENC; // 禁用ADC ADC14->CTL0 = ADC14_CTL0_SHT0_4 | ADC14_CTL0_ON; // 设置转换时间和启用ADC ADC14->CTL1 = ADC14_CTL1_RES_2; // 设置转换分辨率为12位 ADC14->MCTL[0] = ADC14_MCTLN_INCH_0; // 选择通道A0作为第一个采样通道 ADC14->MCTL[1] = ADC14_MCTLN_INCH_1; // 选择通道A1作为第二个采样通道 ADC14->MCTL[2] = ADC14_MCTLN_INCH_2 | ADC14_MCTLN_EOS; // 选择通道A2作为最后一个采样通道,并设置EOS(序列结束)位 ADC14->CTL0 |= ADC14_CTL0_ENC; // 启用ADC } void ADC_Start(void) { ADC14->CTL0 |= ADC14_CTL0_SC; // 启动ADC转换 } int ADC_ReadResult(void) { while (ADC14->CTL0 & ADC14_CTL0_BUSY); // 等待转换完成 return ADC14->MEM[2]; // 从结果寄存器中读取采样结果 } int main(void) { ADC_Init(); // 初始化ADC ADC_Start(); // 启动ADC转换 while (1) { int result = ADC_ReadResult(); // 读取采样结果 // 处理采样结果 } } ``` 请注意,以上代码仅为示例,具体的配置和使用方法可能因MSP432的型号和具体要求而有所不同。您可以参考MSP432的技术参考手册和示例代码来获取更详细的信息和示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FantasyQin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值