qidao123.com技术社区-IT企服评测·应用市场

标题: STM32外设AD-轮询法读取模板 [打印本页]

作者: 来自云龙湖轮廓分明的月亮    时间: 前天 00:58
标题: STM32外设AD-轮询法读取模板
ADC 配置完成后(通常通过 STM32CubeMX 生成初始化代码),我们如何获取转换结果呢?最简朴直接的方法就是轮询法 (Polling)。
一,什么是轮询?

1,轮询法的直观理解

想象一下你要去楼下信箱取信:
你走到信箱旁 (HAL_ADC_Start(&hadc1); - 启动一次转换)。
你站在那边不停等,直到邮递员把信投进去 (HAL_ADC_PollForConversion(&hadc1, timeout); - 循环检查转换完成标志位,直到超时)。
邮递员投完信后,你打开信箱,取出信件 (adc_val = HAL_ADC_GetValue(&hadc1); - 读取转换结果)。
2,轮询法缺点

这种方式简朴粗暴,但在等待期间 CPU 基本被"卡住"了,不能干别的事。假如转换时间很长,或者需要频仍读取,效率会很低。但在某些简朴场景下,不失为一种快速验证功能的方法。
二,CubeMX配置

根据原理图选择ADC的输入引脚

将精度设置为12位

使能多通道

设置通道顺序和采样时间

三,模板移植

1,adc_app.c文件

  1. #include "adc_app.h"
  2. __IO uint32_t adc_val;
  3. __IO float voltage;
  4. void adc_task(void)
  5. {
  6.     // 1. 启动 ADC 转换
  7.     HAL_ADC_Start(&hadc1); // hadc1 是你的 ADC 句柄
  8.     // 2. 等待转换完成 (阻塞式)
  9.     //    参数 1000 表示超时时间 (毫秒)
  10.     if (HAL_ADC_PollForConversion(&hadc1, 1000) == HAL_OK)
  11.     {
  12.         // 3. 转换成功,读取数字结果 (0-4095 for 12-bit)
  13.         adc_val = HAL_ADC_GetValue(&hadc1);
  14.         // 4. (可选) 将数字值转换为实际电压值
  15.         //    假设 Vref = 3.3V, 分辨率 12 位 (4096)
  16.         voltage = (float)adc_val * 3.3f / 4096.0f;
  17.         // (这里可以加入你对 voltage 或 adc_val 的处理逻辑)
  18.          my_printf(&huart1, "ADC Value: %lu, Voltage: %.2fV\n", adc_val, voltage);
  19.     }
  20.     else
  21.     {
  22.         // 转换超时或出错处理
  23.          my_printf(&huart1, "ADC Poll Timeout!\n");
  24.     }
  25.    
  26.     // 5. (重要)如果 ADC 配置为单次转换模式,通常不需要手动停止。
  27.     //    如果是连续转换模式,可能需要 HAL_ADC_Stop(&hadc1);
  28.     // HAL_ADC_Stop(&hadc1); // 根据你的 CubeMX 配置决定是否需要
  29. }
复制代码
逻辑分解:
   adc_val在定义时前面加了__IO,这个修饰使得adc_val可以在Debug时举行修改
   2,变量声明

1,adc_app.c中

__IO uint32_t adc_val;
“数字读数”: 用于存储从 HAL_ADC_GetValue 读取到的原始数字结果。__IO (volatile) 提示编译器这个值可能在预期流程之外被改变(虽然在纯轮询模式下意义不大,但在中断/DMA 模式下很紧张)。
__IO float voltage;
“模拟电压”: 用于存储根据 adc_val 计算得到的实际电压值。使用 float 范例以得到更准确的小数值。
2,mydefine.h中

extern ADC_HandleTypeDef hadc1;
“ADC控制器”: HAL 库中代表 ADC1 硬件外设的布局体句柄。所有 ADC 操纵都需要通过它举行。
3,轮询法局限性

轮询方式非常斲丧 CPU 资源,因为它在等待期间反复检查状态,无法实行其他任务。只适用于对实时性要求不高、ADC 转换速度远快于处理需求的简朴场景。对于需要同时处理多个任务或要求高效的应用,应优先考虑中断或 DMA 方式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4