登录/注册

stm32 ad 电压检测

更多

好的,关于 STM32 的 ADC(模数转换器)电压检测,以下是关键步骤和注意事项的中文说明:

核心目标: 使用 STM32 内置的 ADC(模数转换器)将连接到其某个模拟输入引脚(如 PA0, PA1, PC0 等)的外部模拟电压(例如来自传感器或分压电阻网络)转换成数字值,并在软件中计算出其对应的实际电压值。

主要步骤:

  1. 硬件连接:

    • 将要测量的模拟电压源连接到 STM32 芯片上某个具有 ADC 功能的 GPIO 引脚(例如 PA0)。
    • 确保被测电压范围在 ADC 的允许输入范围内。通常对于 STM32,这个范围是 0V 到 VREF+(参考正电压)。如果 VREF+ 直接连接到 VDD(主供电电压,通常是 3.3V),那么范围就是 0V 到 3.3V。
    • 重要: 如果你的设计或 MCU 有 VREF+ 和 VREF- 引脚,它们决定了 ADC 的参考电压基准。务必确保 VREF+ 连接到稳定、干净的参考电压源(如外部高精度基准电压芯片或直接连接到 MCU 的 VDDA)。VREF- 通常接地(GND)。参考电压的精度和稳定性直接决定了 ADC 测量的精度。 若芯片无单独 VREF 引脚,VDDA 即为参考电压。
    • 确保 VDDA(模拟供电)和 VSSA(模拟地)连接良好且稳定。VDDA/VSSA 通常连接到与 VDD/VSS 同源的电源和地,但建议在物理走线和使用滤波电容(如 100nF + 1µF)方面尽可能隔离数字部分以减少噪声干扰。
    • 在电压源和 ADC 输入引脚之间,根据需要添加保护电路(如限流电阻)和/或抗混叠滤波器(RC 低通滤波)。例如,一个串联 100Ω - 1kΩ 电阻和一个到地的 100nF - 1µF 电容组成一个简单的低通滤波器,可以滤除高频噪声。
  2. STM32CubeMX 配置 (推荐):

    • 打开 STM32CubeMX,选择你的 STM32 型号。
    • 使能 ADC:Analog -> ADC 下,选择你需要使用的 ADC 模块(如 ADC1)。
    • 配置通道:Analog -> ADCx -> Input Channels 下,选择你连接电压的那个引脚对应的 ADC 通道(如 Channel 0)。
    • 配置参数 (关键!):
      • Clock Prescaler (时钟预分频器): 选择 ADC 时钟源的分频比,确保 ADC 时钟频率不超过芯片手册规定的最大频率(通常几十 MHz)。
      • Resolution (分辨率): 选择 ADC 的分辨率(如 12 位)。分辨率越高(如 16位 > 14位 > 12位),转换结果越精细,理论精度越高,但转换时间通常也越长。
      • Data Alignment (数据对齐方式): 通常选择 右对齐 (Right Alignment)。
      • Scan Conversion Mode (扫描转换模式): 如果你只测一个通道,设为 Disabled;如果测多个通道轮流转换,设为 Enabled
      • Continuous Conversion Mode (连续转换模式): 设为 Enabled 则 ADC 会不停地进行转换;设为 Disabled 则需要软件触发或外部触发每次转换。
      • Discontinuous Conversion Mode (非连续转换模式): 通常 Disabled
      • Number Of Conversion (转换数目): 扫描模式开启时,指一次序列转换的通道数。单通道填 1。
      • External Trigger Conversion Source (外部触发源): 如果不需要外部信号触发转换,选择 软件触发 (Software Trigger)。在代码里调用 HAL_ADC_Start() 启动转换。
      • End Of Conversion Selection (转换结束选择): 通常选 EOC flag at the end of single channel conversion
      • Sampling Time (采样时间): 为每个使用的通道选择合适的采样时间。较长的采样时间有助于输入源(尤其是高阻抗源)建立稳定信号,提高精度,但会降低最大采样率。具体时间查手册,如 CYCLES_480.5CYCLES_15_5
    • 配置时钟树: 确保给 ADC 提供时钟的 PLL 或 HSI 等时钟源配置正确。
    • 生成代码: 点击 Generate Code,选择你的开发工具链(Keil MDK-ARM, IAR EWARM, STM32CubeIDE 等),生成初始化代码工程。
  3. 编写软件代码 (基于 HAL 库):

    • 初始化 (CubeMX 已生成): 在生成的代码中,ADC、GPIO 和时钟的初始化函数 MX_ADC1_Init() 通常已在 main.c 中调用。
    • ADC 校准 (强烈推荐): 在主循环开始前或初始化后执行一次校准以减少偏移误差。
      if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK) {
          Error_Handler();
      }
    • 启动 ADC: 如果是连续转换模式且开启了扫描模式(单通道或多通道),只需启动一次 ADC。否则,每次转换都需要启动。
      HAL_ADC_Start(&hadc1); // 启动单个 ADC
    • 读取 ADC 值(轮询方式):
      uint32_t adc_value;
      if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) { // 等待转换完成
          adc_value = HAL_ADC_GetValue(&hadc1); // 获取12位或配置分辨率的原始转换结果
      }
      • 也可以使用中断或 DMA 方式读取,特别是对于多通道、连续转换或需要更高效率的场景。
    • 计算电压值:
      • 转换公式:
        实际电压值 (Volt) = (ADC原始值 / (2^分辨率 - 1)) * VREF+
      • 例如,12位分辨率 (0-4095),如果 VREF+ = VDDA = 3.3V:
        float voltage = (float)adc_value / 4095.0 * 3.3f;
      • 关键提示: VREF+ 的值 (3.3f 在这个例子中) 需要是 实际测量得到的高度精确的基准电压值。不能简单假设电源是理想的 3.3V!如果芯片支持且你连接了外部高精度基准源 VREF+(如 2.5V),就用它的值。如果 VREF+ 连到 VDDA(即你的 3.3V 电源),你应该 校准 VREF+ 的实际值 或者读取内部参考电压(如果芯片支持)来补偿电源的实际波动。这是提高精度的最关键一步。
    • 内部基准电压通道 (如果芯片支持): 很多 STM32 有内置的电压基准源(如典型值 1.2V,精确值在芯片校准数据区)。可以读取该通道的 ADC 值 (ADC_CHANNEL_VREFINT),结合其标称值 (VREFINT_CAL) 计算当前实际的 VDDA/VREF+ 值:
      uint32_t vrefint_adc_value; // 通过ADC读取内部基准电压通道的值
      uint32_t vrefint_cal = *((uint16_t *)0x1FFFF7BA); // 从校准区读取标称ADC值 (地址查手册!)
      float measured_vdda = ((float)vrefint_cal / (float)vrefint_adc_value) * VREFINT_CAL_VOLTAGE; // 假设标称基准电压是1.2V

      然后在你计算外部电压时,使用 measured_vdda 替代 3.3f。这大大提高了对电源波动的鲁棒性。

注意事项:

  1. 噪声与接地: 模拟信号路径对噪声敏感。做好电源滤波(使用适当容值的去耦电容、磁珠隔离模拟/数字电源和地),优化PCB布局布线(短而直接的模拟走线,远离数字线和电源线),使用数字滤波器(软件平均滑动滤波、中值滤波)。
  2. 输入阻抗与建立时间: ADC 输入引脚有采样保持电路,充电源需要有足够低的输出阻抗(或串联电阻够小)以在选定的 采样时间 内建立电压,否则会导致误差。对于高阻抗源(如热敏电阻、光敏电阻),需使用运算放大器作为缓冲器。
  3. 参考电压稳定性: VREF+ 的精度和稳定性是整个测量的核心。优先考虑使用外部基准源。若使用 VDDA,务必进行校准(如使用内部基准电压通道)。
  4. ADC 时钟速度: 确保 ADC 时钟(来源于 APB2 时钟,经 Clock Prescaler 分频后)不超过芯片手册规定的最大值(如 STM32F4 通常是 36MHz)。
  5. 采样时间选择: 根据信号源阻抗计算或实验选择合适的采样时间。阻抗越高,需要的采样时间越长。手册提供了 RC 模型和最小采样时间公式。
  6. 多通道切换: 如果需要测量多个通道,请确保合理配置 扫描转换顺序非连续模式 或使用 DMA 提高效率,并注意通道间切换时的延迟。
  7. 低功耗模式唤醒: ADC 可配置为在低功耗模式下(如 Stop 模式)通过外部事件唤醒,但需要仔细配置触发源。
  8. 过压保护: 避免输入电压超过 VREF+(更不要超过 VDDA + 0.3V)或低于 VSSA - 0.3V,否则可能损坏引脚内部保护二极管。添加外部箝位电路(如电阻串联二极管到 VDDA/VSSA)。

通过仔细遵循以上步骤并注意关键点(尤其是基准电压和输入信号完整性),你可以在 STM32 上实现可靠的电压检测功能。

祝你顺利完成项目!

stm32ad采样测电压范围

AD(模拟数字)转换模块是嵌入式系统中经常使用的一个功能模块,它可以将模拟电压信号转换成数字信号,以便后续处理。在STM32系列微控制器中,AD采样测电压

2023-12-29 10:35:37

电压检测芯片的工作原理 电源电压检测芯片的构成

电压检测芯片的工作原理 电源电压检测芯片的构成 

2023-11-09 09:36:41

如何使用stm32Cubemx软件配置DAC电压输出和ADC电压检测

stm32Cubemx实用篇(三):DAC电压输出和ADC电压检测本章将

2022-01-21 07:48:34

CubeMX配合PlatformIO开发STM32(STorM32),配置ADC实现电池电压检测

使用stm32f103rct6,准备使用ADC实现电池电压检测

资料下载 张艳 2021-12-22 19:41:38

STM32 检测信号频率

STM32 检测信号频率

资料下载 佚名 2021-11-23 18:21:47

高精度、低功耗、小封装电压检测芯片HX61C

HX61C系列芯片是使用CMOS技术开发的高精度、低功耗、小封装电压检测芯片。检测电压

资料下载 ah此生不换 2021-04-26 09:30:00

使用STM32采集电池电压踩过的坑资料下载

电子发烧友网为你提供使用STM32采集电池电压踩过的坑资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。

资料下载 佚名 2021-04-05 08:49:51

使用STM32单片机实现智能电表无线WIFI插座APP交流电压电流检测的设计

本文档的主要内容详细介绍的是使用STM32单片机实现智能电表无线WIFI插座APP交流电压电流检测的设计免费下载。

资料下载 佚名 2021-03-02 15:44:00

如何利用STM32F10x芯片多路ADC去检测电压

STM32F10x系列芯片ADC通道和引脚的对应关系是怎样的?如何利用STM32F10x芯片多路ADC去检测

2021-12-13 07:44:21

STM32是如何去实现对12V电压检测

STM32是如何去实现对12V电压的检测呢?有哪位大神可以解答一下这个问题吗

2021-12-02 06:43:48

STM32 ADC如何检测电路电流或电压

STM32 ADC如何检测电路电流或电压?

2021-11-16 07:55:33

如何利用ADC去检测STM32单片机实际的电压值呢

如何利用ADC去检测STM32单片机实际的电压值呢?有什么方法吗?

2021-11-15 07:24:10

STM32的掉电检测机制——PVD

有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。STM32就有这样的掉电检测机制——PVD(Programmab

2021-08-05 07:48:15

基于STM32F103单片机的直流电压电流检测仪设计

系统功能设计(末尾附文件)本系统由STM32F103C8T6单片机核心板、ACS712电流检测模块、电压采集、LCD1602液晶及电源组成。1、

2021-07-21 07:54:17

STM32_ DAC输出电压

STM32_DAC输出电压

2020-04-08 10:05:44

7天热门专题 换一换
相关标签