STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器,它有 18 个通道,可测量 16 个外部和 2 个内部信号源
各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据
寄存器中。
当ADC 通道 1 在 PA1 上时。
1 //初始化 ADC 2 //这里我们仅以规则通道为例 3 //我们默认将开启通道 0~3 4 void Adc_Init(void) 5 { ADC_InitTypeDef ADC_InitStructure; 6 GPIO_InitTypeDef GPIO_InitStructure; 7 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 8 RCC_APB2Periph_ADC1 , ENABLE ); //使能 ADC1 通道时钟 9 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置 ADC 分频因子 6 10 //72M/6=12,ADC 最大时间不能超过 14M 11 //PA1 作为模拟通道输入引脚 12 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1; 13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入 14 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.1 15 ADC_DeInit(ADC1); //复位 ADC1,将外设 ADC1 的全部寄存器重设为缺省值 16 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC 独立模式 17 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //单通道模式 18 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式 19 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由 20 //软件而不是外部触发启动 21 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC 数据右对齐 22 ADC_Init(ADC1, &ADC_InitStructure); //根据指定的参数初始化外设 ADCx 24 ADC_Cmd(ADC1, ENABLE); //使能指定的 ADC1 25 ADC_ResetCalibration(ADC1); //开启复位校准 26 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束 27 ADC_StartCalibration(ADC1); //开启 AD 校准 28 while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束 29 } 30 //获得 ADC 值 31 //ch:通道值 0~3 32 u16 Get_Adc(u8 ch) 33 { 34 //设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间 35 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); 36 //通道 1,规则采样顺序值为 1,采样时间为 239.5 周期 37 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能软件转换功能 38 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 39 return ADC_GetConversionValue(ADC1); //返回最近一次 ADC1 规则组的转换结果 40 } 41 u16 Get_Adc_Average(u8 ch,u8 times) 42 { 43 u32 temp_val=0; 44 u8 t; 45 for(t=0;t<times;t++) 46 { temp_val+=Get_Adc(ch); //通过Get_Adc_Average函数,用于多次获取 ADC 值,取平均,用来提高准确度。 47 delay_ms(5); 48 } 49 return temp_val/times; 50 }
知识来源:STM32F1 开发指南(库函数版)