关于ADC的一些原理和实验我们已经有了2篇笔记,链接如下:
关于ADC的笔记1_Mr_rustylake的博客-CSDN博客
STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客
实验要求:通过ADC1通道1(PA1)采集电位器的电压,并显示ADC转换的数字量和换算后的电压值。
我们通过下表可以知道DMA1通道1的外设对应的就是ADC1的读取。
首先确定我们的最小刻度,Vref = 3.3V,所以0V <= Vin <= 3.3V,所以最小刻度是3.3V / 4096(2^12)。
接下来确定转换时间。采样时间239.5个ADC时钟周期为例,可以得到转换时间为21us。
时间转换公式参考如下公式:Tcvtmin=(12.5+X)周期=(12.5 + X)/(12MHz)=21us。
因为使用的是DMA读取,所以采取连续转换模式,因为使用的是单通道,所以不扫描。
接下来我们编写实验代码:
先编写函数代码adc.c:
#include "./BSP/ADC/adc.h"
ADC_HandleTypeDef g_adc_handle;
DMA_HandleTypeDef g_dma_handle;
uint8_t g_adc_dma_sta; //标志DMA的传输是否完成
void adc_dam_init(uint32_t mar){
ADC_ChannelConfTypeDef adc_ch_conf;
__HAL_RCC_DMA1_CLK_ENABLE();
g_dma_handle.Instance = DMA1_Channel1;
g_dma_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; //外设到内存
g_dma_handle.Init.PeriphInc = DMA_PINC_DISABLE; //因为选取的是DMA1的数据寄存器,选择不增量
g_dma_handle.Init.MemInc = DMA_MINC_ENABLE; //对于存储器需要存储多个数据ÿ