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

embedded/2025/1/14 23:35:18/

文章目录

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

http://www.ppmy.cn/embedded/153962.html

相关文章

《CPython Internals》阅读笔记:p118-p150

《CPython Internals》学习第 8 天&#xff0c;p118-p150 总结&#xff0c;总计 33 页。 一、技术总结 补充一些本人整理的关于 Context-Free Grammar(CFG) 的知识。 1.symbol(符号) A mathematical symbol is a figure or a combination of figures that is used to repre…

第六章:网页设计

文章目录&#xff1a; 一&#xff1a;网页设计 1.基本概念 1.1 网页 1.2 网站 1.3 工具 2.HTML语言 2.1 基础 2.2 标记 2.2.1 结构 2.2.2 文本 2.2.3 功能 2.2.4 表单 2.3 属性 二&#xff1a;IIS 1.定义 2.主要功能 3.特点与优势 4.应用场景 4.1 安装IIS …

Redis:数据类型

1. 字符串&#xff08;String&#xff09; 简介 概念&#xff1a;这是最简单的数据类型&#xff0c;可以存储字符串、整数或浮点数。特点&#xff1a;支持原子操作&#xff0c;如递增和递减数值。 示例 # 设置一个键值对 SET mykey "Hello, Redis!"# 获取该键的值…

如何添加合适的索引:MySql 数据库索引认知

写在前面 博文内容涉及 Mysql 数据库索引简单认知&#xff0c;包括SQL执行过程&#xff0c;数据库数据存储原理。如何通过索引加快数据查询原理简单介绍适合有一定SQL基础的开发运维小伙伴建立数据库索引认知&#xff0c;学会如何添加索引理解不足小伙伴帮忙指正 &#x1f603;…

CentOS 7.9 通过 yum 安装 Docker

文章目录 前言一、删除已安装的 Docker二、网络设置三、设置 yum 源&#xff0c;并安装依赖四、设置 Docker 仓库五、安装及使用 Docker六、镜像仓库总结 前言 CentOS 7.9 过了维护期&#xff0c;Docker 官方文档没有了相关的安装文档。记录一下&#xff0c;备用&#xff01; …

Django Admin 自定义操作封装

1. 为什么需要封装? 在Django开发中,我们经常需要在Admin界面添加自定义操作按钮,以便管理员执行特定的任务。通过封装,我们可以: 减少重复代码统一管理自定义操作的逻辑提高代码的可维护性和可扩展性 © ivwdcwso (ID: u012172506)2. CustomActionMixin 的实现 让我…

Java - Http 通讯

Java - Http 通讯 PS&#xff1a; 1. Http 协议 POST | GET 请求&#xff1b; 2. 支持 报头、报文、参数 自定义配置&#xff1b; 3. GET 返回支持 String | Stream; 4. 相关依赖&#xff1a; <dependency><groupId>org.apache.httpcomponents</groupId><…

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…