STM32学习21--ADC模拟数字转换2 一、配置步骤1、时钟配置1打开GPIO口的时钟2打开ADC外设时钟3设置ADC预分频保证时钟14MHz2、GPIO引脚配置引脚必须配置为模拟输入AIN3、ADC_Init结构体1ADC_Mode独立ADC或双ADC同步一般配置独立模式2ADC_ScanConvMode单通道DISABLE多通道轮询扫描ENABLE;3) ADC_ContinuousConvMode只采集一次DISABLE单次转换不停循环采集ENABLE连续转换4ADC_ExternalTrigConv 触发源软件启动NONE定时器触发TIM2_TRGO等5ADC_DataAlign数据对齐一般写右对齐6ADC_NbrOfChannel规则通道总个数4、通道参数配置ADC_RegularChannelConfig每一路通道都要单独配置1通道号CH0~CH172Rank采集顺序序号3采样保持时长充电时长5、ADC自校准工程必加减少读数漂移顺序固定开启ADC上电→复位校准→等待复位完成→启动校准→等待校准结束。6、可选配置(DMA/外部触发/中断DMA把AD数据自动搬运到内存解放CPUTIM触发定时采样不用软件反复启动中断转换完成进中断读取数据二、多通道转换传感器输出电压电路光敏、热敏、红外接收、麦克风等可等效为N1可变电阻图一电位器图二光敏、热敏等图三电压转换电路练习多通道读取电位器、光敏电阻采用非DAM模式1、ADC.c文件#include stm32f10x.h // Device header void AD_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //ADC分频最大14MHz RCC_ADCCLKConfig(RCC_PCLK2_Div6); //GPIOA配置模拟输入 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA,GPIO_InitStructure); //初始化ADC ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_ContinuousConvMode DISABLE;//单次转换 ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right ; ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None ;//不使用外部触发使用软件触发 ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_NbrOfChannel 1; ADC_InitStructure.ADC_ScanConvMode DISABLE; ADC_Init(ADC1,ADC_InitStructure); //启用ADC ADC_Cmd(ADC1,ENABLE); //校准 ADC_ResetCalibration(ADC1);//复位标准 while(ADC_GetResetCalibrationStatus(ADC1) SET);//等待复位校准完成 ADC_StartCalibration(ADC1);//开始校准 while(ADC_GetCalibrationStatus(ADC1) SET);//等待校准完成 } uint16_t AD_GetValue(uint8_t ADC_Channel) { ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5); ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) RESET); return ADC_GetConversionValue(ADC1); }2、ADC.h文件#ifndef __AD_H #define __AD_H void AD_Init(); uint16_t AD_GetValue(uint8_t ADC_Channel); #endif3、main函数#include stm32f10x.h #include Delay.h #include AD.h #include OLED.h uint16_t AD0,AD1,AD2,AD3; int main() { OLED_Init(); AD_Init(); OLED_ShowString(1,1,AD0:); OLED_ShowString(2,1,AD1:); OLED_ShowString(3,1,AD2:); while(1) { AD0 AD_GetValue(ADC_Channel_0); AD1 AD_GetValue(ADC_Channel_1); AD2 AD_GetValue(ADC_Channel_2); OLED_ShowNum(1,5,AD0,4); OLED_ShowNum(2,5,AD1,4); OLED_ShowNum(3,5,AD2,4); Delay_ms(100); } }本文完