GD32_ADC采样+DMA多通道扫描传输
文章目录
前言
<1>、硬件平台:可运行软件程序的GD32单片机(本项目使用GD32F103CBT6硬件平台)
<2>、软件平台:基于使用标准库GD32F10x_Firmware_Library_V2.2.4固件库编写
一、资源介绍
所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

二、原理
1.ADC连续扫描模式
在配置多个通道采集时,如图:CH2、CH1、CH5、CH7、CH11,在扫描模式下,会对各个通道一次进行数据采样,再使用连续模式时,会对循环对上述通道进行连续数据采样,配置原理如下:
扫描运行模式可以通过将 ADC_CTL0 寄存器的 SM 位置 1 来使能。在此模式下, ADC 扫描转换所有被 ADC_RSQ0~ADC_RSQ2 寄存器选中的所有通道。一旦 ADCON 位被置 1,当相应软件触发或者外部触发产生, ADC 就会一个接一个的采样和转换常规序列通道。转换数据存储在 ADC_RDATA 寄存器中。常规序列转换结束后, EOC 位将被置 1。如果 EOCIE 位被置1,将产生中断。当常规序列工作在扫描模式下时, ADC_CTL1 寄存器的 DMA 位必须设置为1。如果 ADC_CTL1 寄存器的 CTN 位也被置 1,则在常规序列转换完之后,这个转换自动重新开始。

常规序列扫描运行模式的软件流程:
- 设置 ADC_CTL0 寄存器的 SM 位和 ADC_CTL1 寄存器的 DMA 位为 1;
- 配置 ADC_RSQx 和 ADC_SAMPTx 寄存器;
- 如果有需要,配置 ADC_CTL1 寄存器中的 ETERC 和 ETSRC 位;
- 准备 DMA 模块,用于传输来自 ADC_RDATA 的数据;
- 设置 SWRCST 位,或者给常规序列产生一个外部触发;
- 等待 EOC 标志位置 1;
- 写 0 清除 EOC 标志位。
2.DMA传输
当ADC使用连续扫描时,采样数据非常快且数据都暂存在ADC_RDATA寄存器中,我们可使用DMA自动将采样数据依次保存到内存中备用,各个通道采样数据经DMA传输到内存后的映射关系如图:

如图:一共五个通道需要连续扫描,我们定义一个二维数组Value[3][5]储存扫描值,3表示每个通道保存最近3次扫描的数据,5表示五个通道,该二维数组的内存分布如图所示,每个数据为两个字节大小。扫描时会依次将各通道数据保存到ADC_data寄存器,DMA会将寄存器数据依次搬迁到Value[][]数组中备用,Value空间30个字节,为当第四次扫描时会覆盖第一次扫描的数据,依次覆盖更新。
3.ADC内部通道
将 ADC_CTL1 寄存器的 TSVREN 位置 1 可以使能温度传感器通道(ADC0_IN16)和 VREFINT 通道(ADC0_IN17)。温度传感器可以用来测量器件周围的温度。传感器输出电压能被 ADC 转换成数字量。建议温度传感器的采样时间至少设置为 ts_temp µs(具体数值请参考datasheet 文档)。温度传感器不用时,复位 TSVREN 位可以将其置于掉电模式。温度传感器的输出电压随温度线性变化,由于生产过程的多样化,温度变化曲线的偏移在不同的芯片上会有不同(最多相差 45°C)。内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量精确的温度,应该使用一个外置的温度传感器来校准这个偏移错误。内部电压参考(VREFINT)提供了一个稳定的(带隙基准)电压输出给 ADC 和比较器。 VREFINT 内部连接到 ADC0_IN17 输入通道

使用温度传感器:
- 配置温度传感器通道(ADC0_IN16)的转换序列和采样时间为 ts_temp µs
- 置位 ADC_CTL1 寄存器中的 TSVREN 位,使能温度传感器
- 置位 ADC_CTL1 寄存器的 ADCON 位,或者由外部触发启动 ADC 转换
- 读取内部温度传感器输出电压 Vtemperature, 并由下面公式计算出实际温度:
温度 ( ° C ) = ( V 25 – V t e m p e r a t u r e ) / A v g S l o p e + 25 温度 (°C) = {(V_{25} – V_{temperature}) / A_{vg_Slope}} + 25 温度(°C)=(V25–Vtemperature)/AvgSlope+25
V25: 内部温度传感器在 25°C 下的电压,典型值请参考相关型号 datasheet。
Avg_Slope:温度与内部温度传感器输出电压曲线的均值斜率,典型值请参考相关型号datasheet。
三、配置
我们使用通道ADC_CHANNEL_8和通道ADC_CHANNEL_1分别采样3.3V和12V电压,再使用通道ADC_CHANNEL_16和通道ADC_CHANNEL_17分别采样内部温度传感器和内部参考电压,一共四个通道,每个通道采集五个数据,计算时候再取平均值,因此定义一个二维数组ADC0_Vallue保存数据。
1.ADC配置
代码如下(示例):
static void ADC_Init(void)
{
uint16_t i = 0;
/* enable ADC0 clock */
rcu_periph_clock_enable(RCU_ADC0);
/* config ADC clock */
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
/* ADC mode config */
adc_mode_config(ADC_MODE_FREE);
/* ADC scan function enable */
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE


45

被折叠的 条评论
为什么被折叠?



