1,注入转换器:类似于中断,当注入转换触发时,先进入注入转换在进行规则转换
2,规则转换:按照事先设定程序依次进行转换
3,编程步骤:(采集PC0和PC1上的电压)
1,打开时钟-----GPIOC,ADC1,AFIO,DMA1
2》配置ADC预分频器----6分频
3》初始化GPIOC
----GPIO_Pin_0|GPIO_Pin_1
----模拟输入
4》初始化ADC1
----ADC工作在独立模式
----扫描
----连续转换
----不使用外部触发
----2通道
----右对齐
5》DMA1的通道1初始化
----外设基地址----&ADC1->DR
----内存基地址----二维数组
----方向----外设作为数据来源
----数目----100
----外设地址递增----否
----内存地址递增----是
----外设数据宽度----半字
----内存数据宽度----半字
----是否循环----是
----优先等级----高
----内存到内存是否使能----否
6》使能ADC的DMA请求
7》使能DMA1的通道1
8》使能ADC1
9》设置ADC1的通道10和通道11的采样顺序和采样时间
10》校准
复位校准寄存器
等待复位成功
开始校准
等待校准成功
11》软件触发ADC1的转换
12》处理数据-----分开按键数据和光敏数据,并且50个数据取平均值
编程代码
#include "drv_adc.h"
#define ADC_CH 2
#define ADC_SIZE 50
uint16_t ADC_DATA[ADC_SIZE][ADC_CH];
void ADC1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;
DMA_InitTypeDef DMA_InitStruct;
// 打开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
// 配置ADC预分频器
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
// 初始化ADC1
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStruct);
// DMA1的通道1初始化
ADC_InitStruct.ADC_ContinuousConvMode =ENABLE;
ADC_InitStruct.ADC_DataAlign =ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None;
ADC_InitStruct.ADC_Mode =ADC_Mode_Independent;
ADC_InitStruct.ADC_NbrOfChannel =ADC_CH;
ADC_InitStruct.ADC_ScanConvMode =ENABLE;
ADC_Init(ADC1,&ADC_InitStruct);
// 使能ADC的DMA请求
DMA_InitStruct.DMA_PeripheralBaseAddr =(uint32_t)&ADC1->DR;
DMA_InitStruct.DMA_MemoryBaseAddr =(uint32_t)ADC_DATA;
DMA_InitStruct.DMA_DIR =DMA_DIR_PeripheralSRC;
DMA_InitStruct.DMA_PeripheralInc =DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc =DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize =DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize =DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode =DMA_Mode_Circular;
DMA_InitStruct.DMA_M2M =DMA_M2M_Disable;
DMA_InitStruct.DMA_Priority =DMA_Priority_High;
DMA_InitStruct.DMA_BufferSize =ADC_CH*ADC_SIZE;
DMA_Init(DMA1_Channel1,&DMA_InitStruct);
// 使能ADC的DMA请求
ADC_DMACmd(ADC1,ENABLE);
// 使能DMA1的通道1
DMA_Cmd(DMA1_Channel1, ENABLE);
// 8使能ADC1
ADC_Cmd(ADC1,ENABLE);
// 设置ADC1的通道10和通道11的采样顺序和采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2, ADC_SampleTime_239Cycles5);
// 校准
ADC_ResetCalibration(ADC1);
while(SET==ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(SET==ADC_GetCalibrationStatus(ADC1));
// 软件触发ADC1的转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
// 处理数据分开按键数据和光敏数据斌且50个数据平均值
uint16_t ADC_RG_Value(void)
{
uint32_t SUM=0;
uint8_t i;
for(i=0;i<ADC_SIZE;i++){
SUM=SUM+ADC_DATA[i][0];
}
return (uint16_t)(SUM/ADC_SIZE);
}
uint16_t ADC_KEY_Value(void)
{
uint32_t SUM=0;
uint8_t i;
for(i=0;i<ADC_SIZE;i++){
SUM=SUM+ADC_DATA[i][1];
}
return (uint16_t)(SUM/ADC_SIZE);
}