ADC(简易的DMA传输)的认识

时间:2024-03-05 09:04:22

ADC(简易的DMA传输)的认识

首先看到是ADC的特性

1、ADC的12位分辨率。不能直接测量负电压,然后是最小量程化单位是LSB=Vref+/212

2、单次和转换模式的使用

3、 从通道0到通道n的连续扫描模式00

4、自校准。

5、数据的内部自对齐。

6、触发方式。(根据功能描叙图。)

如下图所示

 

 看到这张图可以看到ADC的工作方式

可以看到所有的器件都是围绕着模数转换部分(ADC模块)展开的。可以看到左边的有些参考电压,而有2.4<=Vref+<=3.6

而下面的GPIO端口和温度传感器就是ADC的输入。这些输入到ADC模块需要有触发才能进行工作,所以请看下面就是有的就是定时器触发,GPIO(A~G)_EXIT_11和GPIO(A~G)_EXIT_15都是外部触发,也可以使用软件触发,今天我们就使用规则通道的软件触发实现循环扫描。

当转换数据完成后进入到规则通道数据寄存器,而寄存器是有32位和16位的,所有这个寄存器是选择16位的,这时就会让选择对齐当时,有左对齐和右对齐。

当然还有就是配置看门狗,当采集的电压值大于阀值,触发看门狗中断。

 

下面看下具体的实现规则通道的循环扫描通过串口发送到超级终端上。

首先就是配置ADC-GPIO

 

static void ADC1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);

/* Configure PC.01 as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure); // PC1,输入时不用设置速率。
}

 

/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //禁止扫描通道模式,适用于多通道模式。
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //启动连续扫描模式。
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发方式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //使用右对齐方式存放。
ADC_InitStructure.ADC_NbrOfChannel = 1; //要转换的通道数目
ADC_Init(ADC1, &ADC_InitStructure);

/*8分频,即9MHz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
/*规则通道的配置ADC1的通道1,采样周期为55.5个周期,序列号为1 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);

/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

/*复位校准寄存器*/
ADC_ResetCalibration(ADC1);
/*等待复位校准寄存器完成工作 */
while(ADC_GetResetCalibrationStatus(ADC1));

/* ADC校准寄存器*/
ADC_StartCalibration(ADC1);
/* 等待完成工作*/
while(ADC_GetCalibrationStatus(ADC1));

/* 启动软件触发ADC转化*/
ADC_SoftwareStartConvCmd(ADC1, ENABLE);