STM32系列第18篇--ADC
扫描二维码
随时随地手机看文章
ADC特点:
12位逐次逼近型的模拟数字转换器
最多带3个ADC控制器
最多支持18个通道,可最多测量16个外部和2个内部信号源
支持单次和连续转换模式
通道0到通道n的自动扫描模式
自动校准
采样间隔可以按通道编程
规则通道和注入通道均有外部触发选项
转换结果支持左对齐或右对齐方式存储在16位数据寄存器
ADC转换时间:最大转换速率1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)
ADC供电要求:2.4V-3.6V
ADC输入范围:VREF- ≤ VIN ≤ VREF+
ADC引脚:如下图所示:
注:只有144引脚的STM32才有PF脚。ADC引脚:Vref+模拟参考+极;Vref-模拟参考-极;Vdda模拟电源;Vssa模拟电源地;其中Vdda和Vssa分别接Vdd和Vss。
规则通道组:相当于正常运行程序,最多16个通道
注入通道组:相当于中断。最多4个通道,在执行规则通道组转换过程中,如果遇到注入通道组则先去执行注入通道组,执行完返回继续执行规则通道组。
注:STM32F1的ADC的各通道可以单次,连续,扫描或者间断模式执行;不要让ADC时钟超过14MHz,否则可能不准。
CODE:实验目的:ADC1的通道1(PA1)进行单次转化。
//adc.c#include"adc.h"#include"delay.h"//初始化ADC//这里我们仅以规则通道为例//我们默认将开启通道0~3voidAdc_Init(void){ADC_InitTypeDefADC_InitStructure;GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//使能ADC1通道时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子672M/6=12,ADC最大时间不能超过14M//PA1作为模拟通道输入引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入引脚GPIO_Init(GPIOA,&GPIO_InitStructure);ADC_DeInit(ADC1);//复位ADC1ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE;//模数转换工作在单通道模式ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//模数转换工作在单次转换模式ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel=1;//顺序进行规则转换的ADC通道的数目ADC_Init(ADC1,&ADC_InitStructure);//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器ADC_Cmd(ADC1,ENABLE);//使能指定的ADC1ADC_ResetCalibration(ADC1);//使能复位校准while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束ADC_StartCalibration(ADC1);//开启AD校准while(ADC_GetCalibrationStatus(ADC1));//等待校准结束//ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的软件转换启动功能}//获得ADC值//ch:通道值0~3u16Get_Adc(u8ch){//设置指定ADC的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//ADC1,ADC通道,采样时间为239.5周期ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的软件转换启动功能while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束returnADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果}u16Get_Adc_Average(u8ch,u8times){u32temp_val=0;u8t;for(t=0;t