Hi3518EV200平台ADC多通道采样
Hi3518EV200平台ADC多通道采样流程
Hi3518EV200 ADC
本文针对Hi3518EV200平台处理器,通过ADC单次采样方式,实现对多通道(1~4通道)ADC进行采样控制。本文仅仅是对Hi3518EV200芯片ADC的用法的介绍,不涉及ADC具体的工作原理、转换原理等细节内容。废话不多说,直入正题!
Hi3518EV200芯片ADC模块简介:
特性:
电源电压:3.3V
扫描频率不能高于200K/s
独立通道:4路
特点:
支持单次启动,每次扫描一个通道,不滤毛刺,提供中断以及查询。
支持连续扫描功能:
根据ch_vld自动轮询各通道
根据Tscan(扫描间隔)启动连续查询
根据Tglitch进行滤毛刺,完成对毛刺的有效判定
上报LSADC转换结果、对应的通道号
上报中断:有按键中断,按键有变化中断(此部分不太明白,是笔误写成了按键还是另有深意,不太清楚)
以上特性和特点摘自Hi3518EV200芯片手册,文章还会摘取Hi3518EV200芯片手册的部分寄存器截图以作介绍。
ADC的实现方法简述:
Hi3518EV200平台的ADC模块支持4个通道,分两种模式采样:
第一种是单次扫描模式,支持多通道扫描;
第二种是连续Scan扫描模式,支持多通道扫描(测试验证未成功,在此处就不多说了)
单次扫描模式的工作实现方法
- 打开ADC时钟
- 各个控制寄存器配置(参考手册流程配置,含采样值位数,通道使能,单次扫描,不支持powerdown等)
- 使用request_irq注册ADC中断,中断号19
以上配置封装成Init函数,模块加载时初始化ADC模块使用
ADC开始采样
具体操作函数封装为ADC_Start(),包含以下工作:
- 判断需要采样的通道和上次工作的通道是否为同一个通道(为什么要这么做,在下面内容会有说明)
- Disable中断,停止ADC,清空所有通道中断,清空通道使能,使能需要采样的通道,备份该通道等下次采样判断
- 如果1中的判断是同一个通道,就忽略2中操作
- 开始ADC采样,使能ADC中断
- 备份本次采样的通道号,以备下次采样时在1中进行判断
中断处理函数的工作
- 判断使能的是哪个通道
- 判断该使能的通道的中断标志是否置位(即该通道转换是否完成,一般都会完成)
- 获取该通道转换后的值
- 如果注册了其他对该数据操作的函数,就执行
- 清空该通道的中断标志位(此处需要小心操作,不然会引起不可知现象,详细见下文说明)
注:
需要在中断处理函数中设置ADC转换状态,在调用开始ADC转换的地方,判断ADC采样是否正在进行,如果ADC正在使用(即ADC转换已经开始,转换完成中断还未发生),就延时等待,直到该中断完成之后再开启ADC转换。
ADC采样具体实现:
通过配置ADC模块的相关配置寄存器使ADC正常工作。
ADC时钟:
打开ADC时钟:
ADC时钟配置在PERI_CRG31寄存器(参考下图),要打开ADC的时钟,需要将[1]置1。
ADC软复位:
这里的ADC软复位是指SAR_ADC的软复位请求,在PERI_CRG31寄存将[2]置1表示复位,置0表示撤销复位。
ADC参数配置:
ADC参数配置部分需要设置LSADC_CTRL0配置寄存器。
在初始化ADC时需要将ADC复位(为何要先复位,不太清楚,感觉这样做对设备来说更安全),设置ADC进入复位状态需要设置配置寄存器,把[15]置1即可。
ADC时钟撤销复位:将时钟寄存器PERI_CRG3的[2]置0,通上述打开ADC时钟。
ADC退出复位状态:将LSADC_CTRL0配置寄存器的[15]置0。
ADC通道使能,选择需要使用的ADC通道使能,将相应的位置1相应通道有效,置0则相应通道无效。
0通道 [8]置1
1通道 [9]置1
2通道 [10]置1
3通道 [11]置1
ADC转换精度设置:
[31:24] 设为0xFF 表示8bit精度,即采样范围:0~255
ADC扫描模式选择:
[13] 0 单次扫描模式
ADC的PowerDown支持选择:
[14] 0 不支持
到这里,ADC的复位和初始化工作完成,具体的初始化操作ADC单次采样流程可以参考下图流程。每次复位都需要重新设置初始化参数。
ADC中断设置
需要注册ADC中断,在ADC采样完成时发出中断,开始记录采样值。中断流程和别的中断处理类似(比如按键中断),ADC的中断号是19。具体中断细节此处省略。
开始ADC采样:
开始ADC采样的一些操作步骤:
- 先要判断ADC当前的采样通道和要采样的通道是否相同,如果ADC当前的采样通道和要采样的通道不相同,需要进行一些操作使ADC通道切换到需要采样的通道。(这一步不是必须,如果要多路采样,建议加上该部分,具体原因下文介绍)
- 将ADC的中断使能关闭,即将中断使能寄存器LSADC_CTRL4的[0]置0
- 停止ADC采样,即将Stop配置寄存器LSADC_CTRL8的[31:0]写入任意值就可以实现停止ADC采样,比如写入1
- 将ADC要采样的通道的中断清除,设置中断清除寄存器LSADC_CTRL6的[3:0]位,将通道号相对应的位置1
- 关闭ADC各通道使能,在配置寄存器LSADC_CTRL0的[11:8]位全部清零
- 单独使能要进行采样的通道,设置配置寄存器LSADC_CTRL0的[11:8]位将相应通道使能,如将[8]置1使能A通道
- 备份本次采样通道号,用来在开始工作时判断通道是否相同时(第1步)使用
- 如果ADC当前的采样通道号和要采样的通道相同,就可以跳过第2.3.4.5.6.7直接启动ADC采样
- 启动ADC采样,设置Start配置寄存器LSADC_CTRL7的[31:0]位,写入任意值就可以启动ADC采样,比如写入1
- 最后要使能ADC采样中断,采样完成后发出中断,将中断使能寄存器LSADC_CTRL4的[0]位置1
以上的ADC采样操作可以用简单的方法,只需第2.3.4.5.6.9.10步即可,如果只使用单通道采样,只需要将这几步操作放到ADC初始化操作中执行一次就可以,不用每次开始ADC采样都设置。至于为什么比较麻烦,是为了应对多路采样时,有的通道采样时间间隔比较小,有的通道采样时间间隔比较大,造成的重复无意义的操作。
举例说明:ADC要采样的是光照、温度数据,在采样时间间隔不多的时候,比如光敏一秒一次,温度三秒一次,这样的情况是没有什么差别的,但是如果时间间隔差的很多,比如光敏一秒一次,温度30秒一次,这样的情况,在两次温度采样间隔内的30秒,光敏要采样30次,就要初始化30次,这是没有必要的。所以就需要加上第1步的判断逻辑,如果需要采样的通道和上次采样的通道是同一个通道,就免去了重复初始化同一个通道的操作,减轻处理负担。
ADC中断处理函数:
在中断发生时需要做的工作:
- 逐个判断各通道是否有效,也可以获取配置寄存器LSADC_CTRL0的[11:8]位来确定当前采样通道。
因为使用的是单个通道逐个采样的方法,所以同一时刻只有一个通道在工作,通过在中断函数中检测哪个通道被使能可以得到是由哪个通道采样发生的中断。 - 检查中断状态寄存器,判断相应通道的扫描值是否有效
检查中断状态寄存器LSADC_CTRL5的[3:0]位是否被置1,置1则相应通道的扫描值有效,否则无效。 - 如果中断状态有效,就可以读取ADC采样值
直接读取数据保持寄存器LSADC_CTRL3:
[7:0] 通道A扫描值
[15:8] 通道B扫描值
[23:16] 通道C扫描值
[31:24] 通道D扫描值 - 清除中断状态标志
设置中断清除寄存器LSADC_CTRL6的[3:0]位,将相应的位置1,清除相应通道的中断 - 需要添加保险机制,在中断发生后即第1步之后,如果2、3步判断失败,就没法进行4步的清中断,这将导致ADC采样卡死(不采样也不运行中断)
此时的解决方法就是复位ADC,但是这样做有点粗暴,比较好的方法还是避免出现这种卡死现象,比如添加第5步的保险机制,即判断中断都没有执行时就清除4步寄存器中的对应通道中断,或者清除所有通道中断。
之后就是对获取到的ADC采样值进行处理了,略。
总结
至此,ADC通过单次采样的方式对多通道采样的方法介绍完毕,通过这种方法就能通过单次采样的方式对多个通道的数据进行轮流采样了,采样获取到的数据是在前边设置的采样精度范围内,根据实际需要进行处理。有必要提醒下,实时采样得到的数据会存在一些漂移,可以通过硬件滤波使数据稳定,或者在软件中添加滤波算法,对采样得到的数据进行滤波处理。如果朋友们有更好的实现方法,还请指教一二,欢迎相互交流心得。
附:数据手册上的ADC相关配置寄存器截图
附:ADC采样支持连续扫描处理
连续扫描处理过程在验证时没有得到想要的效果,在这里不便多说,下面仅列出文档中连续扫描处理流程参考。
Over!
Hi3518EV200平台ADC多通道采样的更多相关文章
- 【STM32H7教程】第46章 STM32H7的ADC应用之DMA方式多通道采样
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第46章 STM32H7的ADC应用之DMA方式多 ...
- STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项
keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发,L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库).0.起初,可以参考官方库 ...
- STM32 ADC多通道规则采样和注入采样
layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...
- DSP基础学习-ADC同步采样
DSP基础学习-ADC同步采样 彭会锋 2015-04-28 20:31:06 在DSP28027 LauchPad学习过程中,关于ADC同步采样和顺序采样的区别稍加研究了一下,发现里面还真有些门道, ...
- STM32F0 中 ADC 多通道转换结果相同的问题
前言 前段时间调试 STM32F030 的 ADC,在多通道转换时遇到了奇怪的问题,使用官方的例程和库函数连续转换多个 ADC 通道,得到的几个通道的结果是一样的,解决办法参考了 关于STM32F0系 ...
- (九)经典_STM32_ADC多通道采样的例子
STM32 ADC多通道转换描述:用ADC连续采集11路模拟信号,并由DMA传输到内存.ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ.在每次转换结束后,由DMA循环将转换的数据传输到 ...
- STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)
一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/arti ...
- STM32 ADC基础与多通道采样
12位ADC是一种逐次逼近型模拟数字数字转换器.它有多达18个通道,可测量16个外部和2个内部信号源.ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生.如果被ADC转换的模拟电压低于低阀 ...
- STM32定时器触发ADC多通道连续采样,DMA缓存结果
STM32的ADC使用非常灵活,采样触发方面:既支持软件触发,定时器或其他硬件电路自动触发,也支持转换完成后自动触发下一通道/轮转换.转换结果存储方面:既支持软件读取和转存,也支持DMA自动存储转换结 ...
随机推荐
- sql 时间格式
在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...
- Xp下麦克风设备及音量检测
从Vista开始,windows底层的音频架构发生了改变:原本是底层API的waveXXX.mixerXXX等都在Core Audio APIs的基础上进行了重构,上升为了高层API:底层API变为C ...
- ASP.NET Core 处理 404 Not Found
问题 在没有修改任何配置的情况下,这是用户使用 Chrome 访问不存在的URL时会看到的内容: 幸运的是,处理错误状态代码非常简单,我们将在下面介绍三种技术. 解决方案 在以前的ASP.NET MV ...
- Django 模型中自定义Manager和模型方法
1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager. 每个Django模型至少有一个m ...
- 【学习】如何用jQuery获取iframe中的元素
(我的博客网站中的原文:http://www.xiaoxianworld.com/archives/292,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 说实在的,以前真的很少 ...
- java集合相关问题
1.Map/Set 的 key 为自定义对象时,必须重写 hashCode 和 equals: 2.ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassC ...
- 原生javascript跨浏览器常用事件处理
var eventUntil = { getEvent: function (event) {//获取事件 return event ? eve ...
- 我的第一个python web开发框架(13)——工具函数包说明(四)
string_helper.py是字符串操作包,主要对字符串进行检查.过滤和截取等处理. #!/usr/bin/evn python # coding=utf-8 import re def chec ...
- 启动报错 Unsupported major.minor version 51.0
Unsupported major.minor version 51.0错误, 是使用jdk6启动jdk7编译的项目,更换jdk7就好了,或者用jdk6重新打包项目. 解决起来也很方便:打开excli ...
- LeetCode 624. Maximum Distance in Arrays (在数组中的最大距离)$
Given m arrays, and each array is sorted in ascending order. Now you can pick up two integers from t ...