当前位置: 首页 > article >正文

【STM32-学习笔记-5-】ADC

文章目录

  • 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);

image-20241226134409713

image-20241226134447722

image-20241226134504368

Ⅰ、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

    • 宏定义解释

      1. ADC_DataAlign_Right
        • 描述:表示ADC转换结果右对齐
          • 在这种模式下,转换结果存储在寄存器的最低位,高位补零
      2. ADC_DataAlign_Left
        • 描述:表示ADC转换结果左对齐
          • 在这种模式下,转换结果存储在寄存器的最高位,低位补零

      宏函数

      1. IS_ADC_DATA_ALIGN(ALIGN)
        • 描述:检查给定的数据对齐设置是否有效
        • 参数ALIGN,代表ADC的数据对齐方式
        • 功能:检查ALIGN是否等于ADC_DataAlign_RightADC_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_CC10x00000000使用定时器1的捕获/比较1事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T1_CC20x00020000使用定时器1的捕获/比较2事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T2_CC20x00060000使用定时器2的捕获/比较2事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T3_TRGO0x00080000使用定时器3的TRGO事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T4_CC40x000A0000使用定时器4的捕获/比较4事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO0x000C0000使用外部中断11或定时器8的TRGO事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T1_CC30x00040000使用定时器1的捕获/比较3事件作为外部触发源ADC1, ADC2, ADC3
      ADC_ExternalTrigConv_None0x000E0000不使用外部触发源,即软件触发ADC1, ADC2, ADC3
      ADC_ExternalTrigConv_T3_CC10x00000000使用定时器3的捕获/比较1事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T2_CC30x00020000使用定时器2的捕获/比较3事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T8_CC10x00060000使用定时器8的捕获/比较1事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T8_TRGO0x00080000使用定时器8的TRGO事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T5_CC10x000A0000使用定时器5的捕获/比较1事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T5_CC30x000C0000使用定时器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)
	
	//配置GPIO
	GPIO_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常规通道
	//配置ADC
	ADC_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、 连续转换,非扫描

	//配置ADC
	ADC_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转换值--读取
}


http://www.kler.cn/a/503019.html

相关文章:

  • 【Vue实战】Vuex 和 Axios 拦截器设置全局 Loading
  • pandas与sql对应关系【帮助sql使用者快速上手pandas】
  • 22、PyTorch nn.Conv2d卷积网络使用教程
  • 设计一篇利用python爬虫获取1688详情API接口的长篇软文
  • Vue.js组件开发-图片剪裁性能优化最佳方案实例
  • Github 2025-01-11 Rust开源项目日报 Top10
  • Redis十大数据类型详解
  • 第三十八章 Spring之假如让你来写MVC——适配器篇
  • 人工智能知识分享第十天-机器学习_聚类算法
  • 笔记本电脑 选购 回收 特权模式使用 指南
  • qt 快捷功能 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 查看父类及父类中的虚函数
  • RabbitMQ 高可用方案:原理、构建与运维全解析
  • Go语言Zero框架中实现在线签名与验签功能设计与实现
  • JDK下载安装配置
  • java人脸识别
  • 养生讲堂潮州建民医院-潮州男科医院介绍冬季平衡身心健康生活
  • 现代JavaScript开发
  • Unity shader中真的可以动态关闭Stencil Test吗?
  • java_将数据存入elasticsearch进行高效搜索
  • 【centos】校时服务创建-频率修改
  • Spring Boot整合SSE实时通信
  • ansible 知识点【回顾梳理】
  • Unity TextMesh Pro入门
  • 谈谈人工智能在中国:现状与未来展望
  • Swift语言的正则表达式
  • 理解AJAX与Axios:异步编程的世界