【STM32+cubemx】0008 HAL库开发:ADC的四种用法:轮询、中断、DMA、定时器触发

2023-05-16

ADC即模数转换器,能把模拟量(电压)转换为数字量。

这一节我们讲讲stm32的ADC用法,stm32自带的ADC有四种用法:轮询、中断、DMA、定时器触发。

1)ADC轮询的用法

我们在之前的串口中断工程上修改,以便于打印数值查看。

使用cubemx打开串口中断的工程,然后另存为ADC工程,增加如下设置,启用ADC及其中断:

可以看到选择ADC1,勾选IN0后,右侧PA0引脚自动配置成了ADC输入;在NVIC选项卡下勾选ADC中断使能,这样我们可以在这个工程里演示轮询和中断模式。

到时钟设置选项卡下,更改ADC时钟,因为我们使用的主时钟是72M,ADC的时钟不能太高,所以要分频,如下是分到12M:

然后生成工程代码,在keil中打开,我们先试验轮询模式,即软件开始ADC转换后,一直等到转换完成后,才向后执行,代码如下:

这个代码在初始化ADC之后执行一次校准(不执行这一步也可以,但精度可能会低一些);然后就可以使用ADC轮询转换了,只需要三步:启动转换、等待转换完成、读取转换数据,即可完成一次ADC转换。

这里将转换结果通过串口发出来了,可以看到右下角的串口调试助手的结果显示。Stm32的adc是12位,这里拆成两个字节发送。

2)ADC中断用法

仍然使用上述代码工程,添加中断方式的代码:

在主循环前,启动一次中断转换;然后在主循环中检查标志位,是否已经完成转换(ADC转换完成中断);如果已经转换完成,则读取结果,上传;再启动下一次中断转换:

回调函数中,只修改标志位,使得主循环中可以检测到已发生了转换完成中断:

注意上面的主函数里,使用了一个100ms的延时;主要是因为stm32的ADC转换是很快的,如果不使用延时,会有大量数据通过串口上传,不方便观察。

3)ADC的DMA多通道转换

仍然使用上面的cubemx工程,这次我们配置多个AD通道,使用DMA连续传输。

如下图,选择IN0和IN1两个通道,并启用DMA循环模式:

由于ad值为12位,所以这里DMA传输半字就可以了;当然也可以传输整个字。

然后设置ADC的通道,如下图:

解释一下需要修改的地方:

scan conversion mode是使能扫描模式,因为我们开了两个通道IN0和IN1,两个通道都要有转换;

continuous conversion mode是设置连续转换,即一次完成以后,自动进行下一次转换;

Number of conversion设置为2,因为我们有两个通道;

两个Rank下面设置通道号,因为我们有两个通道IN0和IN1,所以一个rank下选通道0,另一个rank下选择通道1。

Sampling time采样时间,如果资源允许可以选长一点的时间,转换结果更准确。

然后就可以生成工程代码了。

在keil中打开工程,主函数中添加代码如下:

注意这里的HAL_ADC_Start_DMA(&hadc1, ADC_Value, 16); 最后这个参数16,表示的是DMA搬移数据的次数;向ADC_Value及其之后的地址搬移16个数据;我们这里设置了2个通道,所以从首地址开始填入的是交替的两个通道的数据:ADC0、ADC1、ADC0、ADC1…一共16个数。

这里设置为16,是因为太小的数值很快就会执行完一个循环,产生DMA传输中断,时间太短的话会频繁产生中断,导致一直在中断中执行,没有时间执行主循环中的语句。这里是增加搬移数据的次数;也可以设置AD采样时间长一些,那么每次的转换时间变长,也不会产生过多的中断。

另外这里的校准函数一定要放在启动ADC、DMA之前,否则会占用一个通道,之后的AD通道顺序会有问题。

4)定时器触发ADC采样

顾名思义,就是由定时器设定时间,到点就启动ADC采样,这样可以精确控制采样率。

首先设置定时器的计时参数,这里设置为1s(可以不开启定时器中断):

ADC的设置中,要关闭连续转换模式,并且设置为定时器触发:

这里如果连续转换不关闭,会自动连续运行,不受定时器触发的控制。所以要disable。

最后,还要开启ADC中断。

设置好之后就可以生成工程代码了。

在keil中打开工程,重写ADC中断的回调函数,以指示ADC转换好:

main函数中添加如下代码,检测是否转换好,并读取AD值回传:

下载到板子运行,可以看到每1s输出一个ad值,说明实现了定时器触发adc转换的功能。

好了,这一节的内容基本讲完了。

欢迎关注我的公众号,可留言“资料”获取相关资料和软件:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32+cubemx】0008 HAL库开发:ADC的四种用法:轮询、中断、DMA、定时器触发 的相关文章

  • 树莓派搭建网站,并免费内网穿透发布上线到公网

    系列文章 树莓派搭建网站 xff0c 并免费内网穿透发布上线到公网树莓派搭建WordPress网站 xff0c 并内网穿透发布上线无需公网IP服务器为树莓派上的WordPress网站配置自己的域名 xff0c 并内网穿透发布上线公网可访问S
  • zookeeper 启动报错:exiting abnormally (org.apache.zookeeper.server.ZooKeeperServerMain) java.io.IOExcept

    ERROR Unexpected exception exiting abnormally org apache zookeeper server ZooKeeperServerMain java io IOException No sna
  • 放弃B/S模式开始新的探索

    真的已经到了自己的忍耐极限了 xff0c 从今天开始用C S模式去开发这个前入式系统 xff01 真的有点不舍 xff0c 毕竟自己已经付出了很多 xff0c 但确实没有办法 xff0c 导师在等着要结果哦 xff01 放弃 从另一个角度来
  • QGC地面站二次开发教程一

    这一节是关于Q Ground Control源码编译安装的教程 因为需要做二次开发 xff0c 所以必须要用QtCreator进行编译 改程序 再编译 采用的QGC源码版本是v3 4 0 是2018年8月10日最新的版本 xff0c 在QG
  • 从猿六年---C++笔试\面试的不成熟小建议来啦

    文章目录 前言 背景面试流程资料总结 刷题指南个人经验总结寄语 前言 背景 本人情况 xff0c 2014年毕业 xff0c 前两年做的更多的是量化分析岗 16年转的C 43 43 开发 xff0c 满打满算也有6年多C 43 43 开发经
  • UPDATE OPENDATASOURCE('SQLOLEDB','')的正确语法格式

    自己补充一下 update naika set xyhkr 61 dateadd Month 1 xyhkr syl 61 a syl b pssl b heti ywjyf 61 a ywjyf 43 39 43 39 43 b psyf
  • 教你玩转Linux—用户账号的管理

    导读用户账号的管理工作主要涉及到用户账号的添加 修改和删除 添加用户账号就是在系统中创建一个新账号 xff0c 然后为新账号分配用户号 用户组 主目录和登录Shell等资源 刚添加的账号是被锁定的 xff0c 无法使用 1 添加新的用户账号
  • 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法

    在不同的平台编译的时候 xff0c 会用到一些系统内置的变量 xff0c 比如操作系统名称 xff0c 版本号之类 xff1a CMAKE SYSTEM xff1a 系統全名 xff0c 如 Linux 2 4 22 xff0c FreeB
  • linux usb usbip驱动详解(一)

    在分析usbip驱动前 xff0c 我们先来学习一下usb总线在linux系统下的表示 我们知道在linux中 xff0c proc和 sys这个两个文件系统包含了很多有用的信息 xff0c 所以usb的信息自然也少不了利用它们来展示 1
  • linux usb usbip驱动详解(二)

    终于来到usbip驱动代码分析了 xff01 我们在做产品时 xff0c 通常是先讨论方案 制定协议 编码和测试 usbip的方案是行得通的 xff0c 它是从URB对象获取信息 xff0c 然后从tcp发送出去的 xff0c URB是li
  • linux usb usbip驱动详解(四)

    我们先讲解vhci hcd驱动 xff08 linux 4 20 14的usbip驱动 xff09 usb主机控制器驱动hcd学习心得 xff1a 可以阅读某款SOC的主机控制器驱动代码 xff0c 譬如TI的am3358芯片 xff0c
  • docker 启动 centos-7 xrpd server

    docker 启动 centos 7 xrpd server 效果预览 docker 启动 centos 7 xrpd server 连接容器 docker run dit name 61 xrdp p 10022 22 p 13389 3
  • 常见数据结构和算法 的图形界面可视化实现

    解压后 xff0c 运行里面的index html xff0c 推荐火狐浏览器下 针对某一数据结构 或 算法的实现 xff0c 有动态的界面演示 xff0c 并且有相应的代码 xff0c 对学习有很好的参考作用 http pan baidu
  • 再见,2012,你好,2013.

    其实这篇日志过年前 xff0c 已经写得差不多 xff0c 但是忘记发了 xff0c 现在补上 xff0c 现在应该还不是太晚吧 ps xff1a 想了一个很俗的标题 61 61 2012年 xff0c 是对我意义最不平凡的一年 这一年 x
  • 无人机—加速度计与光流数据融合

    加速度计与光流数据融合 无人机的定点定高飞行时实现目标识别追踪 xff0c 航点规划 xff0c 循迹巡线等下一个任务的基础 xff0c 稳定的定高定点飞行才能执行其他高级算法 在室内没有GPS的情况下 xff0c 要想实现这个目标 xff
  • 【转】C语言中 -> 是什么意思?

    gt 是一个整体 xff0c 它是用于指向结构体 C 43 43 中的class等含有子数据的指针用来取子数据 换种说法 xff0c 如果我们在C语言中定义了一个结构体 xff0c 然后申明一个指针指向这个结构体 xff0c 那么我们要用指
  • GIS开发学习推荐书目

    书名 作者 出版社 版次 GIS 基础 地理信息系统导论 US Kang tsung Chang xff1b 陈健飞 译 电子工业出版社 第七版 ArcGIS地理信息系统空间分析实验教程 汤国安 杨昕 科学出版社 第二版 编程 基础 C语言
  • SINS/GNSS组合导航:组合导航设计(卡尔曼滤波)

    SINS GNSS组合导航将SINS输出信息与GNSS信息进行组合 xff0c 状态量为 卡尔曼滤波原理参照卡尔曼滤波 xff08 KF xff09 与扩展卡尔曼滤波 xff08 EKF xff09 讲解与推导 xff0c 核心就是五个递推
  • VSLAM学习(一) 三维运动、相机模型、SLAM模型

    目录 VSLAM学习 一 三维运动 相机模型 SLAM模型 VSLAM学习 二 非线性优化 VSLAM学习 三 单目相机位姿估计 VSLAM学习 四 Bundle Adjustment 一 三维空间刚体运动 1 1 旋转矩阵 同一向量在不同
  • ssh远程提示“找不到匹配的keyexchange算法”解决方案

    20230216更新 xff1a xshell官网地址 xff1a https www xshell com zh free for home school 新的知识 xff1a 是因为openssh版本比自己的ssh工具如xshell4版

随机推荐

  • JAVA中的类和对象之this的详解

    系列文章目录 第一章 JAVA中的类和对象之this的详解 目录 前言 一 为什么要有this引用 二 this的三种用法 1 this 成员变量 2 this 成员方法 3 this 调用其它的构造方法 三 this的引用特性 前言 JA
  • 这么学,好玩,有趣,逗死了!(2017年系统规划与管理师上午综合知识试题试题解析(六))

    IT服务风险管理中 xff0c 对风险的识别是很重要的一项工作 识别方法中 xff0c 通常采用文档审查 信息收集技术 检查表 分析假设和图解技术 下面 xff08 xff09 选项不属于信息采集技术 xff08 51 xff09 A 德尔
  • 松滋历史(1)--松滋县建县历史考证

    刘鲋鮈总共4个儿子 xff1a 刘建德 刘梁 刘延年 刘度 长沙顷王刘鲋鮈的儿子刘梁 汉昭帝始元六年 xff08 公元前81年 xff09 xff0c 六月乙未封高城节侯 汉宣帝元康元年 xff08 公元前65年 xff09 xff0c 正
  • 松滋历史(2)--高成县为什么这么高光?

    东汉开国皇帝刘秀 xff0c 是长沙定王刘发第5代世孙 也就是说 xff0c 东汉开国皇帝刘秀爷爷的爷爷与高城侯刘梁 xff08 高城县 xff08 松滋县前身 xff09 创始人 xff09 的爷爷是亲兄弟 在哪个特别讲血统的年代 xff
  • 为什么要报考系统架构设计师考试

    为什么要报考系统架构师考试 最近一年多 xff0c 很多朋友来信 xff0c 问我什么要报考系统架构设计师考试 为什么参加这个考试 xff0c 这个考试有用吗 xff1f 对自己的职业会带来什么好处 xff1f 我想有以下几个方面 xff1
  • Unity中使用暴风魔镜进行VR游戏开发

    64 VR简介 虚拟现实VR Virtual Reality 和增强现实AR Argument Reality 的概念其实在很多年前就已经出现 xff0c 2015年下半年开始变得火热 xff0c 在各大媒体圈子中频繁出现 xff0c 而今
  • 我的2013

    我的 2013 一 工作 分为 2 个阶段 1 上半年 岗位 xff1a 系统架构师 心得体会 xff1a 1 多跟领导 团队 公司其他部门 客户 协助第三方多沟通 xff1b 2 快速理顺业务逻辑关系 xff0c 弄清楚业务流程 xff0
  • 2014年24段魔尺变三叶花视频教程

    2014年24段魔尺变三叶花视频教程 xff08 升级版 xff09 偶是真心喜欢24段魔尺制作的三叶花 xff0c 那是相当漂亮 xff0c 体现了几何美 xff0c 对称美 xff0c 空间美 xff0c 色彩美 xff0c 见下图 三
  • 24段魔尺,可以折出哪些精美图案

    24段魔尺 xff0c 可以折出哪些精美图案 24段魔尺 xff0c 究竟可以叠成哪些精美图案 xff1f 球 小乌龟 十字架 三叶花 三角形 牛魔王 音符是大家比较熟悉的 偶对这个问题 xff0c 比较感兴趣 先将网络上流传的24段魔尺折
  • 软考证到底有多大个鸟用?

    软考证到底有多大个鸟用 xff1f 小虎以信息系统项目管理师高级证书为例 xff0c 来说说这个证 xff0c 到底有什么用 xff1f 1 求职简历上 xff0c 可以浓彩重抹一笔 xff0c 好好吹嘘下自己 xff0c 是IT高级人才
  • 明朝开国第一重臣李善长长子李祺之长子李芳后裔在松滋

    明朝开国第一重臣李善长长子李祺之长子李芳后裔在松滋 李善长 xff0c 何许人也 肩比汉代丞相萧何 xff1b 功臣里排位第一 xff0c 比刘伯温 徐达 汤和 常遇春 蓝玉 李文忠地位高 xff1b 太师 xff0c 左丞相 xff0c
  • 程序员很少上《非诚勿扰》电视节目相亲之分析

    程序员很少上 非诚勿扰 电视节目相亲之分析 偶观看有线电视32 频道的江苏卫视 非诚勿扰 电视相亲节目 xff0c 半年有余 问题 为什么程序员很少上 非诚勿扰 节目进行相亲呢 xff1f 难道是程序员当中 xff0c 很少有大龄的剩男剩女
  • 2018年CSDN博客排名第一名,花落谁家?

    截止2018年10月9日 https blog csdn net stpeace 小虎问题 xff1a 通过搜索引擎例如 xff1a 百度 搜狗 Bing等 如何快速搜索 xff0c 定位谁是CSDN博客的第几名 xff1f 想知道谁CSD
  • 客家刘开七、刘广传刘氏七律族诗赏析V2.0

    七律 刘氏族诗 南宋 刘广传 骏马骑行各出疆 xff0c 任从随地立纲常 年深外境皆吾境 xff0c 日久他乡即故乡 早晚勿忘亲命语 xff0c 晨昏须顾祖炉香 苍天佑我卯金氏 xff0c 八七男儿共炽昌 一 平仄性赏析 除了 卯 字 xf
  • 无限制递归

    1006 无限制检查上层数目 无限制检查上层法则 最后跳出循环 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 1115 问题的解决在于把规模条理化 然后选取较小的规模 xf
  • 【模电】0009 方波和三角波产生电路(RC和比较器实现)

    本节我们来分析几个波形产生电路 xff0c 包括方波 三角波等波形产生电路 这类电路一般由比较器 电阻 电容等组成 我们先来看看比较器的特性 1 xff09 比较器的特性 比较器的原理图符号如下 xff1a 与运放的画法是一样的 xff0c
  • Ubuntu系统安装、配置与美化(Ubuntu20.04)

    阅读指南 目的 本文的写作目的在于帮助完全零基础的小白不理解原理而可以无脑安装Linux系统 xff0c 同时也是为自己进行的一个整理 xff0c 相较于网上大多数的教程 xff0c 本教程将一些内容进行了整合与整理 xff0c 加之本人在
  • 【模电】0010 正弦波产生电路(RC正弦波振荡电路)

    上一节我们分析了使用比较器产生方波和正弦波的电路 xff0c 其本质上是在电容充放电的一段延时后 xff0c 利用比较器产生电平翻转 而本节分析的正弦波产生电路 xff0c 产生的原理不同 1 xff09 振荡产生的原理 正弦波产生电路 x
  • 一种锂电池充放电及外部供电自动切换的电路

    介绍一种单节锂电池充放电一体的电路 该电路在外接电源时 xff0c 使用外接电源供电 xff0c 并且为锂电池充电 xff1b 在无外接电源时 xff0c 系统自动切换为锂电池供电 电路的原理如下图 xff1a 1 xff09 图中VBUS
  • 【STM32+cubemx】0008 HAL库开发:ADC的四种用法:轮询、中断、DMA、定时器触发

    ADC即模数转换器 xff0c 能把模拟量 xff08 电压 xff09 转换为数字量 这一节我们讲讲stm32的ADC用法 xff0c stm32自带的ADC有四种用法 xff1a 轮询 中断 DMA 定时器触发 1 xff09 ADC轮