Analog to Digital Converter

smallcracker 2021-01-29 00:00:00
Categories: Tags:

Analog to Digital Converter(模-数转换器)

一、简介

这款单片机有两个完全相同的转换器模块,它们共用12个输入通道。该ADC模块的转换分辨率为12位。

每个ADC模块都包含4个可编程的序列发生器。采样序列发生器(Sample Sequencer 简写为SS)用于采样控制和数据采集。所有序列发生器的实现方法都是相同的,区别仅在于能够捕捉的采样数和FIFO的深度有所不同,捕捉到的每个采样都要存入FIFO中。这四个采样序列发生器,它们可以同时捕获样本。每个序列都可以配置触发事件。第一个序列发生器至多捕获八个样本,第二个和第三个至多捕获四个样本,第四个序列只能捕获一个样本。每一个样本可以在同一路,不同路,或者其他什么顺序。

简介

如果很多个事件同时被触发的话,可以给样本序列发生器配置优先级确定谁先被捕获。被触发的最高优先级的序列先采样,一定要注意那些频繁触发的事件,如果它们的优先级太高的话,有些低优先级的序列就采不到样了。

ADV数据的硬件过采样可以用来提高精度。过采样的倍率可以2x 4x 8x 16x 32x 或者是32x,但是这样就会相应倍率地降低一个ADC的吞吐量(具体可以看这里)。注意所有采样序列只能设置一个统一的硬件过采样倍率。

还可以用软件实现过采样的!单片机支持2x 4x 8x 但是它会相应倍率的降低样本序列的深度的。比如说啊,第一份采样序列地深度是8,在4x过采样模式下,它就只能采两个样本了。这是因为头四个样本被拿去过采样了。每一个采样序列都能设置自己地软件过采样倍率。

一种更加复杂的软件过采样可以用于清除样本深度地减少。如果我们加快ADC触发速率4倍,然后再配置一个4倍地软件过采样,这样就不会减少采样序列容量了,这样做的后果是ADC触发数量就要增加了,因为这种方法需要在ADC驱动本身以外去做调整,所以不被驱动直接支持,如果我们要用这种方法,就不能用驱动里面的函数了。

函数地头文件是driverlib/adc.c 和driverlib/adc.h

二、然后再来看都干了啥

1.首先使能ADC外设

SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);

2.然后开始配置ADC采样序列发生器,主要是配置触发条件和触发优先级

ADCSequenceConfigure();
这个函数用来配置触发源和采样序列的优先级

前两个参数选择是哪个采样序列发生器
第三个是触发条件
第四个是触发优先级

触发条件有这些:

参数设置分析:这个参数应该是一系列参数的OR,主要设置了一个step的模式(单端输入还是差分输入),选用哪个输入通道,输入完要不要触发中断,以及选择的数字比较器(??)

5.获取采样结果

ADCSequenceDataGet();

第一个是ADC的基址
第二个是ADC的采样序列数
第三个填一个32位地址,表示把数填在这里

其实这个函数还有返回值,返回值就是get到的数

6.使能ADC采样序列发生器

ADCSequenceEnable()

一共两个参数,表示选择的那个采样序列发生器

三、直接上例程!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//定义变量用于存储采得样本
uint32_t ui32Value;

// 使能ADC0模块并等待其准备完成
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)){}

//配置E3引脚(对应CH0)为这个采样序列发生器的通道
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);

//使能第一个采样序列发生器来捕捉CH0的值
ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
ADCSequenceStepConfigure(ADC0_BASE, 0, 0,ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH0);
ADCSequenceEnable(ADC0_BASE, 0);

//以后每次触发时都要加上这几句
ADCProcessorTrigger(ADC0_BASE, 0);
while(!ADCIntStatus(ADC0_BASE, 0, false)){}
ADCSequenceDataGet(ADC0_BASE, 0, &ui32Value);

pin