stm32 ADC基础配置

来源:互联网 发布:怎样做淘宝返利群 编辑:程序博客网 时间:2024/05/16 06:01

一,基础知识

1,通道组

ADC有两组通道:STM32 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规
则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。
● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入
组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。
*如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉
冲将发送到ADC以转换新选择的组*。

二,初始化配置

1,基本功能

    ADC_InitTypeDef ADC_InitStructure;     GPIO_InitTypeDef GPIO_InitStructure;    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1    , ENABLE );   //ADC时钟初始化    RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频因子要确保 ADC1 的时钟( ADCCLK)不要超过 14Mhz。当前72/6=12MHz。    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//GPIO设置为模拟输入模式        GPIO_Init(GPIOA, &GPIO_InitStructure);      ADC_DeInit(ADC1);  //恢复默认值    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//双模式选择,注1;    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//是否多通道模拟输入,注2;    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//是否是单次转换,注3;    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发,注4;    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //数据对齐方式    ADC_InitStructure.ADC_NbrOfChannel = 1; //规则组通道数,ADC规则序列寄存器 1(ADC_SQR1)的第23:20位:L[3:0]:规则通道序列长度 (Regular channel sequence length);    ADC_Init(ADC1, &ADC_InitStructure); //    ADC_Cmd(ADC1, ENABLE);  //初始化ADC,ADON位置1。只是给ADC上电,转换开始需要按照前面的设置触发。例如软件触发用ADC_SoftwareStartConvCmd(ADC1, ENABLE);        ADC_ResetCalibration(ADC1); //复位ADC校准。    while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位完成    ADC_StartCalibration(ADC1);  //校准    while(ADC_GetCalibrationStatus(ADC1));   //等待校准完成    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );//通道配置:注5;                        ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发所以对SWSTART置位。              while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束    return ADC_GetConversionValue(ADC1);//返回最近一次转换结果    

注1:双模式选择 (Dual mode selection)

对应ADC控制寄存器 1(ADC_CR1)中的:DUALMOD[3:0]:双模式选择 (Dual mode selection)
软件使用这些位选择操作模式。
0000:独立模式
0001:混合的同步规则+注入同步模式
0010:混合的同步规则+交替触发模式
0011:混合同步注入+快速交叉模式
0100:混合同步注入+慢速交叉模式
0101:注入同步模式
0110:规则同步模式
0111:快速交叉模式
1000:慢速交叉模式
1001:交替触发模式
*注意:1, 在双ADC模式里,为了在主数据寄存器上读取从转换数据,必须使能DMA位,即使不使用DMA
传输规则通道数据。
2,改变通道的配置会产生一个重新开始的条件,这将导致同步丢失。建议在进行任
何配置改变前关闭双模式。*

注2:扫描模式 (Scan mode)

Specifies whether the conversion is performed in Scan (multichannels) or Single (one channel) mode.This parameter can be set to ENABLE or DISABLE.
ADC控制寄存器 1(ADC_CR1)中的:SCAN:扫描模式 (Scan mode);

注3:连续转换 (Continuous conversion)

Specifies whether the conversion is performed inContinuous or Single mode. This parameter can be set to ENABLE or DISABLE.
ADC控制寄存器 2(ADC_CR2)的CONT:连续转换 (Continuous conversion)
CONT=0,SCAN=0 单次转换模式(Single conversion mode)单次扫描1通道
CONT=1,SCAN=0 连续转换模式(Continuous conversion mode) 连续扫描1通道
CONT=0,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后停止。(单次扫描组)
CONT=1,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环。连续扫描一组
如果开启多个通道不开启扫描模式,则只转换每组通道的第一个通道。

注4:选择启动规则通道组转换的外部事件 (External event select for regular group)

Defines the external trigger used to start the analog to digital conversion of regular channels.
ADC控制寄存器 2(ADC_CR2)的EXTSEL[2:0]:选择启动规则通道组转换的外部事件 (External event select for regular group)这些位选择用于启动规则通道组转换的外部事件,其中111是SWSTART即软件启动。库函数:ADC_SoftwareStartConvCmd(ADC1, ENABLE);

注5:通道配置

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)

配置ADCx的,通道,序列,转换时间。其中序列就是第几个被转换的。主要对应两个寄存器:ADC采样时间寄存器 1,2(**ADC_SMPR**1,2)和ADC规则序列寄存器 1,2,3(**ADC_SQR**1,2,3)

0 0
原创粉丝点击