文章目录
- ADC
- ADC函数
- Ⅰ、ADC_InitTypeDef结构体参数
- ①、ADC_Mode
- ②、ADC_DataAlign
- ③、ADC_ExternalTrigConv
- ④、ADC_ContinuousConvMode
- ⑤、ADC_ScanConvMode
- ⑥、ADC_NbrOfChannel
- Ⅱ、ADC配置示例
- 1、单次转换,非扫描
- 单次转换非扫描模式下,获取多通道的ADC值
- 2、 连续转换,非扫描
ADC
ADC函数
// 将指定的ADC寄存器重置为默认值
void ADC_DeInit(ADC_TypeDef* ADCx);// 根据初始化结构体配置ADC参数
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);// 初始化ADC初始化结构体的默认值
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);// 开启或关闭指定的ADC
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 开启或关闭ADC的DMA功能
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 开启或关闭ADC的中断
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);// 重置ADC校准,准备进行校准操作
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
// 获取ADC重置校准状态,检查是否完成
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
// 开始ADC校准
void ADC_StartCalibration(ADC_TypeDef* ADCx);
// 获取ADC校准状态,检查是否完成
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);// 开启或关闭软件启动ADC转换,用于软件触发转换
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 获取软件启动ADC转换状态
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);// 配置ADC不连续模式的通道数量
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);// 开启或关闭ADC不连续模式
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 配置ADC常规通道
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);// 开启或关闭外部触发ADC转换
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 获取ADC转换值
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);// 获取双模式下ADC的转换值
uint32_t ADC_GetDualModeConversionValue(void);// 开启或关闭自动注入转换
void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 开启或关闭注入通道不连续模式
void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 配置外部触发注入转换
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);// 开启或关闭外部触发注入转换
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 开启或关闭软件启动注入转换
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 获取软件启动注入转换命令状态
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);// 配置注入通道
void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);// 配置注入序列长度
void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);// 设置注入通道的偏移值
void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
// 获取注入通道的转换值
uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);// 开启或关闭模拟看门狗
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
// 配置模拟看门狗的阈值
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
// 配置模拟看门狗的单通道模式
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);// 开启或关闭温度传感器和Vrefint通道
void ADC_TempSensorVrefintCmd(FunctionalState NewState);// 获取ADC标志状态
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
// 清除ADC标志
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);// 获取ADC中断状态
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
// 清除ADC中断待处理位
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);
Ⅰ、ADC_InitTypeDef结构体参数
①、ADC_Mode
ADC的工作模式 (将ADC配置为独立或操作双模式)
该参数可以是
@ref ADC_mode
:
枚举类型定义
typedef enum {ADC_Mode_Independent = 0x00000000, /*!< 独立模式 */ADC_Mode_RegInjecSimult = 0x00010000, /*!< 规则和注入组同时转换模式 */ADC_Mode_RegSimult_AlterTrig = 0x00020000, /*!< 规则组同时转换,交替触发模式 */ADC_Mode_InjecSimult_FastInterl = 0x00030000, /*!< 注入组同时转换,快速交错模式 */ADC_Mode_InjecSimult_SlowInterl = 0x00040000, /*!< 注入组同时转换,慢速交错模式 */ADC_Mode_InjecSimult = 0x00050000, /*!< 注入组同时转换模式 */ADC_Mode_RegSimult = 0x00060000, /*!< 规则组同时转换模式 */ADC_Mode_FastInterl = 0x00070000, /*!< 快速交错模式 */ADC_Mode_SlowInterl = 0x00080000, /*!< 慢速交错模式 */ADC_Mode_AlterTrig = 0x00090000 /*!< 交替触发模式 */ } ADCMode_TypeDef;
ADC_Mode_Independent
:
- 表示ADC工作在独立模式
- 每个ADC独立操作,适用于单个ADC通道的简单应用
ADC_Mode_RegInjecSimult
:
- 规则和注入组同时转换模式
ADC_Mode_RegSimult_AlterTrig
:
- 规则组同时转换,交替触发模式
ADC_Mode_InjecSimult_FastInterl
:
- 注入组同时转换,快速交错模式
ADC_Mode_InjecSimult_SlowInterl
:
- 注入组同时转换,慢速交错模式
ADC_Mode_InjecSimult
:
- 注入组同时转换模式
ADC_Mode_RegSimult
:
- 规则组同时转换模式
ADC_Mode_FastInterl
:
- 快速交错模式
ADC_Mode_SlowInterl
:
- 慢速交错模式
ADC_Mode_AlterTrig
:
- 交替触发模式
宏函数
#define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \((MODE) == ADC_Mode_RegInjecSimult) || \((MODE) == ADC_Mode_RegSimult_AlterTrig) || \((MODE) == ADC_Mode_InjecSimult_FastInterl) || \((MODE) == ADC_Mode_InjecSimult_SlowInterl) || \((MODE) == ADC_Mode_InjecSimult) || \((MODE) == ADC_Mode_RegSimult) || \((MODE) == ADC_Mode_FastInterl) || \((MODE) == ADC_Mode_SlowInterl) || \((MODE) == ADC_Mode_AlterTrig))
- 描述:检查给定的ADC模式是否有效
- 参数:
MODE
,代表ADC模式- 功能:检查
MODE
是否等于预定义的ADC模式中的任一个- 返回值:如果
MODE
有效,返回1
(真),否则返回0
(假)
②、ADC_DataAlign
指定ADC数据是左对齐还是右对齐
该参数可以是
@ref ADC_data_align
:
宏定义解释
ADC_DataAlign_Right
- 描述:表示ADC转换结果右对齐
- 在这种模式下,转换结果存储在寄存器的最低位,高位补零
ADC_DataAlign_Left
- 描述:表示ADC转换结果左对齐
- 在这种模式下,转换结果存储在寄存器的最高位,低位补零
宏函数
IS_ADC_DATA_ALIGN(ALIGN)
- 描述:检查给定的数据对齐设置是否有效
- 参数:
ALIGN
,代表ADC的数据对齐方式- 功能:检查
ALIGN
是否等于ADC_DataAlign_Right
或ADC_DataAlign_Left
中的任一个- 返回值:如果
ALIGN
有效,返回1
(真),否则返回0
(假)
③、ADC_ExternalTrigConv
配置ADC的外部触发源
对常规信道进行数字转换。这个参数可以是
@ref ADC_external_trigger_sources_for_regular_channels_conversion
:
宏定义解释
这些宏定义用于选择特定的外部触发源,每个宏定义一个特定的触发源,值为该触发源对应的位掩码
ADC_ExternalTrigConv_T1_CC1
:使用定时器1的捕获/比较1事件作为外部触发源。适用于ADC1和ADC2
ADC_ExternalTrigConv_T1_CC2
:使用定时器1的捕获/比较2事件作为外部触发源。适用于ADC1和ADC2
ADC_ExternalTrigConv_T2_CC2
:使用定时器2的捕获/比较2事件作为外部触发源。适用于ADC1和ADC2
ADC_ExternalTrigConv_T3_TRGO
:使用定时器3的TRGO事件作为外部触发源。适用于ADC1和ADC2
ADC_ExternalTrigConv_T4_CC4
:使用定时器4的捕获/比较4事件作为外部触发源。适用于ADC1和ADC2
ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO
:使用外部中断11或定时器8的TRGO事件作为外部触发源。适用于ADC1和ADC2
ADC_ExternalTrigConv_T1_CC3
:使用定时器1的捕获/比较3事件作为外部触发源。适用于ADC1、ADC2和ADC3
ADC_ExternalTrigConv_None
:不使用外部触发源,即软件触发。适用于ADC1、ADC2和ADC3
ADC_ExternalTrigConv_T3_CC1
:使用定时器3的捕获/比较1事件作为外部触发源。仅适用于ADC3
ADC_ExternalTrigConv_T2_CC3
:使用定时器2的捕获/比较3事件作为外部触发源。仅适用于ADC3
ADC_ExternalTrigConv_T8_CC1
:使用定时器8的捕获/比较1事件作为外部触发源。仅适用于ADC3
ADC_ExternalTrigConv_T8_TRGO
:使用定时器8的TRGO事件作为外部触发源。仅适用于ADC3
ADC_ExternalTrigConv_T5_CC1
:使用定时器5的捕获/比较1事件作为外部触发源。仅适用于ADC3
ADC_ExternalTrigConv_T5_CC3
:使用定时器5的捕获/比较3事件作为外部触发源。仅适用于ADC3宏函数
#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO) || \((REGTRIG) == ADC_ExternalTrigConv_None) || \((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \((REGTRIG) == ADC_ExternalTrigConv_T5_CC3))
- 描述:检查给定的外部触发源设置是否有效
- 参数:
REGTRIG
,代表ADC的外部触发源- 功能:检查
REGTRIG
是否等于预定义的外部触发源中的任一个- 返回值:如果
REGTRIG
有效,返回1
(真),否则返回0
(假)表格:
宏定义 值 描述 适用ADC ADC_ExternalTrigConv_T1_CC1 0x00000000 使用定时器1的捕获/比较1事件作为外部触发源 ADC1, ADC2 ADC_ExternalTrigConv_T1_CC2 0x00020000 使用定时器1的捕获/比较2事件作为外部触发源 ADC1, ADC2 ADC_ExternalTrigConv_T2_CC2 0x00060000 使用定时器2的捕获/比较2事件作为外部触发源 ADC1, ADC2 ADC_ExternalTrigConv_T3_TRGO 0x00080000 使用定时器3的TRGO事件作为外部触发源 ADC1, ADC2 ADC_ExternalTrigConv_T4_CC4 0x000A0000 使用定时器4的捕获/比较4事件作为外部触发源 ADC1, ADC2 ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO 0x000C0000 使用外部中断11或定时器8的TRGO事件作为外部触发源 ADC1, ADC2 ADC_ExternalTrigConv_T1_CC3 0x00040000 使用定时器1的捕获/比较3事件作为外部触发源 ADC1, ADC2, ADC3 ADC_ExternalTrigConv_None 0x000E0000 不使用外部触发源,即软件触发 ADC1, ADC2, ADC3 ADC_ExternalTrigConv_T3_CC1 0x00000000 使用定时器3的捕获/比较1事件作为外部触发源 ADC3 ADC_ExternalTrigConv_T2_CC3 0x00020000 使用定时器2的捕获/比较3事件作为外部触发源 ADC3 ADC_ExternalTrigConv_T8_CC1 0x00060000 使用定时器8的捕获/比较1事件作为外部触发源 ADC3 ADC_ExternalTrigConv_T8_TRGO 0x00080000 使用定时器8的TRGO事件作为外部触发源 ADC3 ADC_ExternalTrigConv_T5_CC1 0x000A0000 使用定时器5的捕获/比较1事件作为外部触发源 ADC3 ADC_ExternalTrigConv_T5_CC3 0x000C0000 使用定时器5的捕获/比较3事件作为外部触发源 ADC3
④、ADC_ContinuousConvMode
单次转换or连续转换
值:
ENABLE
:连续转换DISABLE
:单次转换
⑤、ADC_ScanConvMode
非扫描模式or扫描模式
值:
ENABLE
:扫描模式DISABLE
:非扫描模式
⑥、ADC_NbrOfChannel
指定要转换的ADC通道的数量
- 功能:指定在常规通道组中,将使用序列器进行转换的ADC通道的数量
- 取值范围:1到16
- 作用:这个参数决定了ADC在一次转换序列中将转换多少个通道。例如,如果你设置
ADC_NbrOfChannel
为3,那么ADC将在一次转换序列中依次转换3个通道
Ⅱ、ADC配置示例
1、单次转换,非扫描
#include "stm32f10x.h" // Device header
//模拟量转换为数字量
void AD_Init(void)
{ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟(72MHz/6=12MHz)//配置GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_41Cycles5);//配置ADC常规通道//配置ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//将ADC配置为独立或操作双模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换or连续转换ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描模式or扫描模式ADC_InitStruct.ADC_NbrOfChannel = 1;//仅在扫描模式下该参数才有用ADC_Init(ADC1, &ADC_InitStruct);ADC_Cmd(ADC1, ENABLE);//开启ADC//ADC复位+校准ADC_ResetCalibration(ADC1);//重置ADC校准,准备进行校准操作while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取ADC重置校准状态,检查是否完成ADC_StartCalibration(ADC1);//开始ADC校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取ADC校准状态,检查是否完成
}uint16_t AD_GetValue(void)//获取模拟值
{ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//获取ADC标志状态--等待return ADC_GetConversionValue(ADC1);//获取ADC转换值--读取
}
单次转换非扫描模式下,获取多通道的ADC值
uint16_t AD_GetValue(uint8_t ADC_Channel)//获取模拟值
{//选择不同的通道或取ADC值ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//获取ADC标志状态--等待return ADC_GetConversionValue(ADC1);//获取ADC转换值--读取
}
2、 连续转换,非扫描
//配置ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//将ADC配置为独立或操作双模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//单次转换or连续转换ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描模式or扫描模式ADC_InitStruct.ADC_NbrOfChannel = 1;//仅在扫描模式下该参数才有用ADC_Init(ADC1, &ADC_InitStruct);ADC_Cmd(ADC1, ENABLE);//开启ADC//ADC复位+校准ADC_ResetCalibration(ADC1);//重置ADC校准,准备进行校准操作while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取ADC重置校准状态,检查是否完成ADC_StartCalibration(ADC1);//开始ADC校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取ADC校准状态,检查是否完成ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动
}uint16_t AD_GetValue(void)//获取模拟值
{while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//获取ADC标志状态--等待return ADC_GetConversionValue(ADC1);//获取ADC转换值--读取
}