一、ADC基本参数:
1、输入电压范围:取决于参数与外接电路;如果超过ADC的参考电压,需要外接电路配合;
2、stm32具有3个ADC控制器,每个控制器外接16路通道(GPIO),3个控制器一共有24个通道,因此有一部分通道,3个控制器之间存在复用;
3、输入通道分类:16路规则通道和4路注入通道;规则通道在转换的时候,某一路通道需要着急转换完成,因此插入到正在转换通道的序列中,插入的通道是注入通道;那么规则通道的转换顺序如何安排?什么时候注入到通道插入进来?
3.1 规则通道的转换顺序可以在规则序列寄存器中配置;4路注入通道的转换顺序可以在注入通道的转换顺序寄存器中配置;那么ADC转换什么时候开始?
3.2 软件触发和硬件触发:软件触发使用相应的控制位;硬件触发使用响应的外设;规则通道与注入通道一样;
3.3 ADC转换时间:Tconv=采样时间+12个周期;采样周期可以在对应的寄存器中配置,最低采样周期3个周期;ADC的时钟根据手册可以看出来36MHz;
4、转换方式:单次转换和连续转换、扫描转换;扫描单词模式和扫描连续模式;转换完成后数据存放在哪里?
5、数据寄存器:ADC根据不同的组,将数据放在对应的数据寄存器,规则组放在ADC_CR。注入组放在JDRx;ADC_DR所有通道的采集的数据都放在这里,因此需要及时取走数据,使用中断或者DMA方式;比较常用DMA;注入通道每个通道都有对应的数据寄存器,因此不需要着急取走数据;
6、ADC通道输入电压保护:外部输入信号超过ADC信号范围,可以使用模拟看门狗保护多个通道;
7、ADC工作模式:单独模式、双重模式、三重模式;(三个ADC控制器工作的个数)
7.1 单独模式:只有一个ADC控制器工作,可以使任意一个;也可以是单通道也可以使多个通道,转换的数据存放在ADC_DR中,存取数据可以用中断或者DMA;
7.2 双重规则同步模式:用于规则通道,使用两个及以上的控制器同时采集;
7.3 多重交替模式:交替模式只能用在规则组,通常只有一个通道,在一个ADC采集的时候,另一个ADC开始转换,这样可以提高ADC的采样率;可以达到6M,数据传输使用DMA2模式,有两个数据传输数据;
二、ADC初始化
1、原理图:PA5--->ADC12_IN5,使用外部的管脚座STM_ADC,这里的ADC12是指控制器ADC控制器1或者控制器2;
2.1 时钟初始化
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹÄÜGPIOAʱÖÓ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ʹÄÜADC1ʱÖÓ
2.2 配置GPIO属性
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;// 配置复用功能 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;// 不需要上下拉电阻 GPIO_Init(GPIOA, &GPIO_InitStructure);//
2.3 复位ADC1控制器
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1使能复位 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); // 停止复位
2.4 ADC控制器通用功能初始化
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;// 设置独立工作模式 ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;// 设置两个采样之间周期间隔,为5个周期,最小3个周期 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA访问失能 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;// 配置ADC时钟分频ADC CLK=PCLK2/4=84/4=21Mhz,ADC时钟最大为36Mhz ADC_CommonInit(&ADC_CommonInitStructure);// 通用初始化
2.5 ADC控制器初始化
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//设置ADC分辨率 ADC_InitStructure.ADC_ScanConvMode = DISABLE;// 关闭ADC1控制器扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;// 关闭ADC连续转换模式 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;// 没有外部触发源 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// 设置数据对齐方式 ADC_InitStructure.ADC_NbrOfConversion = 1;//设置转换通道大小 ADC_Init(ADC1, &ADC_InitStructure);//ADC1控制器初始化
2.6 开启ADC转换
ADC_Cmd(ADC1, ENABLE);// 开启转换
2.7 设置ADC规则通道,通道个数,采样时间(与精度有关),这里ch固定为5
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );// 规则通道组,规则序列、采样时间 ADC_SoftwareStartConv(ADC1); //启动ADC1软件转启动功能
配置完成上面就可以实时获取ADC的数据,通过判断转换完成的中断标志;
2.8 判断转换完成的中断标志位、获取数据寄存器中的数据
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));// 获取中断标志位EOC return ADC_GetConversionValue(ADC1); // 获取ADC转换完成结果
2.9 获取采集数据的平均值,提高准确率
u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t<times;t++) { temp_val+=Get_Adc(ch); delay_ms(5); } return temp_val/times; }
2.10 获取转换结果
adcx=Get_Adc_Average(ADC_Channel_5,20); // 获取20次求平均值,指定通道5
2.11 初始化步骤:
1、开启GPIO时钟和ADC时钟,设置GPIO口为复用功能;
2、复用ADC1同时设置ADC的分频因子;
3、初始化ADC_CCR寄存器,通用功能;
4、配置规则通道参数;
5、开启软件转换;
6、等待转换完成,读取ADC值;
三、多通道DMA读取ADC数据---独立模式-多通道--使用DMA
1、PB0和PB1,ADC1
2、配置步骤:
2.1、初始化ADC对应的GPIO(多通道配置多个GPIO)
2.2、配置ADC初始化结构体,DMA初始化结构体
2.3、配置通道的转换顺序,使能DMA请求,使能DMA、打开ADC、触发ADC开始转换;
2.4、编写main