STM32嵌入式ADC模拟数字转换器

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

你可能感兴趣的:(stm32,arm,嵌入式硬件)