STM32 标准库 ADC

基础知识

现在很多传感器的反馈信号都为电压信号,是将我们需要测量采集的信号转化为电压大小进行反馈,而对于我们单片机来说,我们就需要将电压大小再方向换算位实际的数据,所以 ADC 对于我们来说至关重要。
ADC 是 STM32 中自带的数模转换器,具有高达 12 位的转换精度。并且具有多达 18 个测量通道,其中 16 个为外部测量通道,2 个为内部测量通道。各通道的 AD 转换都可以进行单次、连续、扫描或间断的模式执行。并将扫描结果存储在 16 位的数据寄存器中。
需要注意的是,我们的 ADC 输入时钟不得超过 14MHZ ,采集范围为 0~3.3V 电压。如果我们对于采集精度有很高的需求的话,需要提供准确的 V R E F V_{REF} VREF 或者使用专门的 AD 转换器模块。
在使用的过程中,我们需要关注 ADC 的以下的一些方面:

  • 采集模式
  • 输入时钟频率
  • 多 AD 采集模式等等
  • 通道选择

通道选择

通道选择时候我们有 16 个通道。我们可以将其分为两大组:规则组和注入组。然后可以在多通道上以任意顺序进行转换。

  • 规则组
    最多 16 个转换组成。推荐用于长时间不间断采集需求使用。
  • 注入组
    最多 4 个转换组成。推荐用于短时间间断采集时候使用,相当于中断一样

双 ADC 模式

在双 ADC 模式下,一共有 6 种可能的模式:

  • 同步注入模式
  • 同步规则模式
  • 快速交叉模式
  • 慢速交叉模式
  • 交替触发模式
  • 独立模式

具体每个模式的内容请查阅相关手册

输入时钟频率

手册上强调了,输入 ADC 的时钟频率最高不得超过 14MHZ, 所以在后续库函数配置的时候需要额外注意。


寄存器

ADC状态寄存器(ADC_SR)

image.png
此寄存器可获取当前 ADC 状态

ADC控制寄存器 1(ADC_CR1)

image.png
image.png
该寄存器用于相关 ADC 配置使用

ADC控制寄存器 2(ADC_CR2)

image.png
image.png
image.png
此寄存器主要用于配置一些 ADCDMA 等额外功能等等

ADC 采样时间寄存器 1 (ADC_SMPR1)

image.png

ADC采样时间寄存器 2(ADC_SMPR2)

image.png

ADC 注入通道数据偏移寄存器 x (ADC_JOFRx)(x=1…4)

image.png

ADC规则序列寄存器 1(ADC_SQR1)

image.png

ADC规则序列寄存器 2(ADC_SQR2)

image.png

ADC规则序列寄存器 3(ADC_SQR3)

image.png

ADC注入序列寄存器(ADC_JSQR)

image.png

ADC 注入数据寄存器x (ADC_JDRx) (x= 1…4)

image.png

ADC规则数据寄存器(ADC_DR)

image.png


标准库函数

ADC 的标准库函数操作主要按照以下的几个步骤来:

  • 初始化 ADC 时钟线
  • 配置 ADC 参数并初始化
  • 配置 ADC 采样周期
  • 配置 ADCDMA 功能 (如有)
  • 开启 ADC 功能
  • 进行 ADC 校准
  • 设置 ADC 软件自动触发 (如果触发模式为软件自动触发模式)

ADC_Init

image.png
老样子,肯定是一个结构初始化方法。

ADC_Mode

image.png

ADC_ScanConvMode

ADC_ScanConvMode 规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式。可以设置这个参数为 ENABLE 或者 DISABLE。

ADC_ContinuousConvMode

ADC_ContinuousConvMode 规定了模数转换工作在连续还是单次模式。可以设置这个参数为 ENABLE 或 者 DISABLE。

ADC_ExternalTrigConv

image.png

ADC_DataAlign

image.png

ADC_NbrOfChannel

ADC_NbreOfChannel 规定了顺序进行规则转换的 ADC 通道的数目。这个数目的取值范围是 1 到 16。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一些关于STM32标准库ADC读取电压的基本信息。 首先,您需要了解ADC是模数转换器,它将模拟信号转换为数字信号。在STM32中,ADC是通过使用模拟输入引脚来读取电压的。 下面是一些基本的步骤,以使用STM32标准库读取ADC电压: 1. 配置ADC引脚:使用GPIO初始化函数配置ADC输入引脚,以便使其工作在模拟输入模式下。 2. 配置ADC:使用ADC初始化函数配置ADC,包括采样时间、分辨率、时钟分频等参数。 3. 配置ADC通道:使用ADC通道配置函数选择要使用的ADC通道。 4. 启动ADC转换:使用ADC启动函数启动ADC转换。 5. 等待转换完成:使用ADC转换完成函数等待ADC转换完成。 6. 读取ADC值:使用ADC读取函数读取ADC转换后的数字值。 7. 将数字值转换为电压值:使用公式将ADC转换后的数字值转换为电压值。 下面是一个简单的代码示例,用于读取ADC电压值: ``` #include "stm32f4xx.h" int main(void) { // 配置ADC引脚 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; // ADC输入引脚 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置ADC ADC_HandleTypeDef hadc; hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = DISABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.NbrOfDiscConversion = 0; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc) != HAL_OK) { // ADC初始化失败 while (1); } // 配置ADC通道 ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; sConfig.Offset = 0; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { // ADC通道配置失败 while (1); } // 启动ADC转换 if (HAL_ADC_Start(&hadc) != HAL_OK) { // ADC启动失败 while (1); } // 等待转换完成 if (HAL_ADC_PollForConversion(&hadc, 100) != HAL_OK) { // ADC转换失败 while (1); } // 读取ADC值 uint32_t adc_val = HAL_ADC_GetValue(&hadc); // 将数字值转换为电压值 float voltage = (3.3f * adc_val) / 4096.0f; while (1); } ``` 在上面的代码示例中,我们使用了ADC1的通道0来读取电压。您可以根据自己的需要修改代码,以读取不同的ADC通道和配置不同的ADC参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值