STM32外设AD-轮询法读取模板

news2025/5/20 11:35:29

STM32外设AD-轮询法读取模板

  • 一,什么是轮询?
    • 1,轮询法的直观理解
    • 2,轮询法缺点
  • 二,CubeMX配置
  • 三,模板移植
    • 1,adc_app.c文件
    • 2,变量声明
        • 1,adc_app.c中
        • 2,mydefine.h中
    • 3,轮询法局限性

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文件

#include "adc_app.h"

__IO uint32_t adc_val;
__IO float voltage;


void adc_task(void) 
{
    // 1. 启动 ADC 转换
    HAL_ADC_Start(&hadc1); // hadc1 是你的 ADC 句柄

    // 2. 等待转换完成 (阻塞式)
    //    参数 1000 表示超时时间 (毫秒)
    if (HAL_ADC_PollForConversion(&hadc1, 1000) == HAL_OK) 
    {
        // 3. 转换成功,读取数字结果 (0-4095 for 12-bit)
        adc_val = HAL_ADC_GetValue(&hadc1);

        // 4. (可选) 将数字值转换为实际电压值
        //    假设 Vref = 3.3V, 分辨率 12 位 (4096)
        voltage = (float)adc_val * 3.3f / 4096.0f; 

        // (这里可以加入你对 voltage 或 adc_val 的处理逻辑)
         my_printf(&huart1, "ADC Value: %lu, Voltage: %.2fV\n", adc_val, voltage);

    } 
    else 
    {
        // 转换超时或出错处理
         my_printf(&huart1, "ADC Poll Timeout!\n");
    }
    
    // 5. (重要)如果 ADC 配置为单次转换模式,通常不需要手动停止。
    //    如果是连续转换模式,可能需要 HAL_ADC_Stop(&hadc1);
    // HAL_ADC_Stop(&hadc1); // 根据你的 CubeMX 配置决定是否需要
}


逻辑分解:

  1. HAL_ADC_Start(&hadc1);: “开始转换!” 通知 ADC 硬件启动一次模数转换过程。

  2. HAL_ADC_PollForConversion(&hadc1, 1000);: “等等看结果出来没?” 这个函数会不断检查 ADC 状态寄存器中的转换完成标志位 (EOC - End Of Conversion)。如果标志位被硬件置位,表示转换完成,函数返回 HAL_OK。如果超过了设定的超时时间 (1000ms) 标志位还没置位,就返回 HAL_TIMEOUT。注意:这是一个阻塞函数,在等待期间,CPU 会卡在这里,执行一个循环检查。

  3. adc_val = HAL_ADC_GetValue(&hadc1);: “结果拿来!” 如果上一步返回 HAL_OK,就调用此函数从 ADC 数据寄存器中读取转换后的数字值。对于 12 位 ADC,这个值通常在 0 到 4095 之间。

adc_val在定义时前面加了__IO,这个修饰使得adc_val可以在Debug时进行修改

  1. 电压计算: 将读取到的数字值根据参考电压和分辨率,按比例计算出对应的模拟电压值。这是可选步骤,取决于你的应用需求。

  2. HAL_ADC_Stop(&hadc1); (可能需要): 如果你在 CubeMX 中将 ADC 配置为连续转换模式 (Continuous Conversion Mode),调用 HAL_ADC_Start 后 ADC 会不停地转换。在这种情况下,读取完一次后如果想停止,就需要调用 HAL_ADC_Stop。如果是单次转换模式 (Single Conversion Mode),ADC 完成一次转换后会自动停止,通常不需要调用 Stop。请检查你的 CubeMX 配置。

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 方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS音视频解封装分析

首先是进行解封装的简单的配置 /// 解封装配置 class KFDemuxerConfig {// 媒体资源var asset: AVAsset?// 解封装类型,指定是音频、视频或两者都需要var demuxerType: KFMediaType .avinit() {} }然后是实现解封装控制器 import Foundation import CoreMedia i…

突破智能驾舱边界,Imagination如何构建高安全GPU+AI融合计算架构

日前,“第十二届汽车电子创新大会暨汽车芯片产业生态发展论坛(AEIF 2025)”在上海顺利举办。大会围绕汽车前沿性、关键性和颠覆性技术突破,邀请行业众多专家学者,分享与探讨了汽车电子产业的技术热点与发展趋势。在5月…

DeepSeek 如何实现 128K 上下文窗口?

DeepSeek 如何实现 128K 上下文窗口?长文本处理技术揭秘 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 DeepSeek 如何实现 128K 上下文窗口?长文本处理技术揭秘摘要引言技术架构解析1. 动态…

Python 实现图片浏览和选择工具

实现将截图预览,并按照顺序加入一个pdf文件中,实现照片管理尤其对于喜欢看教程截图做笔记的网友们。 C:\pythoncode\new\python-image-pdf-processor.py 界面展示 🧱 一、核心结构概述 主类 ImageViewer(wx.Frame) 是主窗口类,…

Python实现的在线词典学习工具

Python实现的在线词典学习工具 源码最初来自网络,根据实际情况进行了修改。 主要功能: 单词查询 通过Bing词典在线获取单词释义(正则提取网页meta描述),支持回车键快速查询 内置网络请求重试和异常处理机制 在线网页…

BGP综合实验(2)

一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略,让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略,让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略,让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…

代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ

图论 题目 99. 岛屿数量 使用 DFS 实现方法 判断岛屿方法 1. 遍历图,若遍历到了陆地 grid[i][j] 1 并且陆地没有被访问,在这个陆地的基础上进行 DFS 方法,或者是 BFS 方法 2. 对陆地进行 DFS 的时候时刻注意以访问的元素添加访问标记 //…

【占融数科-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

【CF】Day62——Codeforces Round 948 (Div. 2) CD (思维 + LCM + 枚举因数 | 思维 + 哈希)

C. Nikita and LCM 题目: 思路: 非常好的思维题,顺便复习了一下快速枚举因数和lcm的性质 我们先来看答案的上界,即全选,此时说明 lcm(a1,a2,a3,...) > a_max 其中 a_max 为 a 中最大的数,那么如果答案不…

基于requests_html的python爬虫

前言:今天介绍一个相对性能更高的爬虫库requests_html,会不会感觉和requests有点联系?是的。为什么开始不直接介绍呢?因为我觉得requests是最基本入门的东西,并且在学习过程中也能学到很多东西。我的python老师在介绍这…

STM32:按键模块 传感器模块 以及 相关C语言知识(详细讲解)

目录 按键 传感器模块 C语言知识 C语言数据类型 C语言宏定义 C语言typedef C语言结构体 C语言枚举 按键 常见的输入设备,按下导通,松手断开 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬…

C++23 std::mdspan:多维数组处理新利器

文章目录 引言C23简介std::mdspan的定义与特点定义特点 std::mdspan的优势零成本抽象的多维数据访问减少内存开销提高代码灵活性 std::mdspan的应用场景科学计算图形学 相关提案示例代码使用动态扩展使用静态和动态扩展 总结 引言 在C的发展历程中,每一个新版本都带…

基于高德MCP2.0的智能旅游攻略系统设计与实现

前言:旅游规划的技术革命 在数字化旅游时代,MCP2.0(Map-based Collaborative Planning)系统代表着旅游攻略技术的最新演进。作为对1.0版本的全面升级,MCP2.0通过深度整合高德地图API和智能算法,实现了从静…

【时时三省】(C语言基础)用函数实现模块化程序设计

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 为什么要用函数? 已经能够编写一些简单的C程序,但是如果程序的功能比较多,规模比较大,把所有的程序代码都写在一个主函数(main函数)中&#x…

Flink流处理:实时计算URL访问量TopN(基于时间窗口)

目录 代码分析 背景知识拓展 代码调优 1. 性能优化 1.1 使用 KeyedStream 和 ProcessWindowFunction 替代 windowAll 1.2 使用 ReduceFunction 优化聚合 2. 功能扩展 2.1 支持动态窗口大小 2.2 支持多维度统计 2.3 支持持久化存储 3. 代码可读性 3.1 提取公共逻辑 …

华为OD机试真题——考勤信息(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Go语言测试用例的执行与分析

在软件开发过程中,测试用例是确保代码质量的关键环节。Go语言作为一种现代的编程语言,它内置了强大的测试框架,可以帮助开发者轻松编写和执行测试用例。本文将介绍如何在 Go 语言中编写、执行测试用例,并对测试结果进行分析。 ## …

MyBatis:动态SQL

文章目录 动态SQLif标签trim标签where标签set标签foreach标签include标签和sql标签 Mybatis动态SQL的官方文档: https://mybatis.net.cn/dynamic-sql.html 动态SQL 动态SQL是 MyBatis的强大特性之一,如果是使用JDBC根据不同条件拼接sql很麻烦,例如拼接…

游戏引擎学习第280天:精简化的流式实体sim

回顾并为今天的内容做铺垫 今天的任务是让之前关于实体存储方式的改动真正运行起来。我们现在希望让实体系统变得更加真实和实用,能够支撑我们游戏实际所需的功能。这就要求我们对它进行更合理的实现和调试。 昨天我们基本让代码编译通过了,但实际上还…

王树森推荐系统公开课 排序03:预估分数融合

融合预估分数 p c l i c k ⋅ p l i k e p_{click} \cdot p_{like} pclick​⋅plike​ 有实际意义,等于在曝光中点赞的概率。 p c l i c k ⋅ p c o l l e c t p_{click} \cdot p_{collect} pclick​⋅pcollect​ 同理。 按多种排名做 ensemble sort。 某电商的融…