您的位置:首页 > 其它

stm32学习笔记 F1系列ADC

2017-11-23 15:47 316 查看
ADC:Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。

典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

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+

STM32通道组

①规则通道组:相当正常运行的程序。最多16个通道。

     规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则

     组转换的总数应写入ADC_SQR1寄存器的L[3:0]中

② 注入通道组:相当于中断。最多4个通道。

     注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组

     里转化的总数应写入ADC_JSQR寄存器的L[1:0]中

STM32F1的ADC的各通道可以单次,连续,扫描或者间断模式执行。

1>单次转换模式

单次转换模式下,ADC只执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON位(只

适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。

一旦选择通道的转换完成:

● 如果一个规则通道被转换:

─  转换数据被储存在16位ADC_DR寄存器中

─  EOC(转换结束)标志被设置

─  如果设置了EOCIE,则产生中断。

● 如果一个注入通道被转换:

─  转换数据被储存在16位的ADC_DRJ1寄存器中

─  JEOC(注入转换结束)标志被设置

─  如果设置了JEOCIE位,则产生中断。

2>连续转换模式

在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。此模式可通过外部触发启

动或通过设置ADC_CR2寄存器上的ADON位启动,此时CONT位是1。

每个转换后:

● 如果一个规则通道被转换:

─  转换数据被储存在16位的ADC_DR寄存器中

─  EOC(转换结束)标志被设置

─  如果设置了EOCIE,则产生中断。

● 如果一个注入通道被转换:

─  转换数据被储存在16位的ADC_DRJ1寄存器中

─  JEOC(注入转换结束)标志被设置

─  如果设置了JEOCIE位,则产生中断。

3>扫描模式

此模式用来扫描一组模拟通道。

扫描模式可通过设置ADC_CR1寄存器的SCAN位来选择。一旦这个位被设置,ADC扫描所有被

ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个

通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了CONT

位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。

如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而

注入通道转换的数据总是存储在ADC_JDRx寄存器中。

ADC 中断

规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有

独立的中断使能位。

注: ADC1 和 ADC2 的中断映射在同一个中断向量上,而 ADC3 的中断有自己的中断向量。

ADC_SR寄存器中有2个其他标志,但是它们没有相关联的中断:

● JSTRT(注入组通道转换的启动)

● STRT(规则组通道转换的启动)

ADC 时钟

由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个

专用的可编程预分频器.注:不要让ADC时钟超过14MHz,否则可能不准。

可编程的通道采样时间

ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和

ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。

总转换时间如下计算:

T(CONV) = 采样时间+ 12.5个周期

例如:

当ADCCLK=14MHz,采样时间为1.5周期

T(CONV) = 1.5 + 12.5 = 14周期 = 1μs

常用库函数

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

void ADC_DeInit(ADC_TypeDef* ADCx)

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);

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

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

void ADC_ResetCalibration(ADC_TypeDef* ADCx);

FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);

void ADC_StartCalibration(ADC_TypeDef* ADCx);

FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

ADC初始化函数ADC_Init

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

typedef struct

{

  uint32_t ADC_Mode; //ADC模式:配置ADC_CR1寄存器的位[19:16]  :DUALMODE[3:0]位

  FunctionalState ADC_ScanConvMode; //是否使用扫描模式。ADC_CR1位8:SCAN位 

  FunctionalState ADC_ContinuousConvMode; //单次转换OR连续转换:ADC_CR2的位1:CONT

  uint32_t ADC_ExternalTrigConv;   //触发方式:ADC_CR2的位[19:17] :EXTSEL[2:0]                

  uint32_t ADC_DataAlign;   //对齐方式:左对齐还是右对齐:ADC_CR2的位11:ALIGN         

  uint8_t ADC_NbrOfChannel; //规则通道序列长度:ADC_SQR1的位[23:20]: L[3:0]       

}ADC_InitTypeDef;

例:

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
//独立模式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使能函数 ADC_Cmd();

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);

例:

ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1

ADC使能软件转换函数 ADC_SoftwareStartConvCmd

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx,FunctionalState NewState)

例:

ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动

ADC 规则通道配置函数ADC_RegularChannelConfig

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

例:

ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );

ADC 获取转换结果函数ADC_GetConversionValue

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);

例:

ADC_GetConversionValue(ADC1);//获取ADC1转换结果

ADC 配置过程:

①开启PA口时钟和ADC1时钟,设置PA1为模拟输入。

      GPIO_Init();      

     APB2PeriphClockCmd();

② 复位ADC1,同时设置ADC1分频因子。

      RCC_ADCCLKConfig(RCC_PCLK2_Div6);

      ADC_DeInit(ADC1);

③ 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。

     void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

④ 使能ADC并校准。

      ADC_Cmd(ADC1, ENABLE);

⑤ 配置规则通道参数:

     ADC_RegularChannelConfig();

⑥开启软件转换:ADC_SoftwareStartConvCmd(ADC1);

⑦等待转换完成,读取ADC值。

   ADC_GetConversionValue(ADC1);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: