nRF52832开发日志--SAADC调试

今天各种事情比较多.......技术活时间略少,就搞了这一项~

52832的ADC和之前51822系列还是有蛮大差别的:

1、支持差分输入方式,测量结果为两输入端口电压差的转换的有符号数值,这个功能对于啥桥式传感器的数据采集真是太爽了,可以省一个电平平移放大电路

2、原始分辨率最高提升到12位,14位那个过采样方式实现的,使用限制很多,不能扫描,还不如自己软件解决要多少位有多少位。

3、新增“通道”概念,每个通道可以选定使用的+-信号源,转换是以通道为个体进行的,如果使能多个通道,则一次触发完成全部通道的扫描转换。

4、自带EasyDMA,可以直接把数据打到RAM内,但不能像STM32那样支持循环传输,复位指针只能靠手动

5、取消了外部电压参考输入,这个其实有点蛋疼,在测量端供电和MCU供电之间存在变动情况下可能会引入误差,对于低频信号,可以用软件进行补偿,但也还有点蛋疼

6、可以自主配置采样时间,端口负载电阻之类参数

先上调试通过的代码,这里实现了5个通道的转换,其中两个差分通道,三个单端通道,以手动方式触发,在线程中每100mS触发一次,数据保存在m_buffer_pool数组中。

这几点关注:

1、官方库挺不错了,提供了一个默认的端口配置的宏定义,很方便,然而实际上还是蛮多东西需要修改的,但这个方法挺可以借鉴

于是我也照着酱紫自己定义了两种我常用的端口配置的方式,代码可以少不少了。这里MCU我用供电是1.8V,所以1/3的增益就够完成全量程范围的数据的转换了。

2、添加SAADC相关库文件时候,这个文件记得也要添加,在./nrf_driver/hal/路径里面

3、配置好正式开始使用ADC模块时候这里需要注意下:

nrf_drv_saadc_buffer_convert()

这个函数实际是用来配置EasyDMA用的,也就是指定打到内存的位置和限制,但并不会开启转换。并且EasyDMA的指针是双buffer形式的,可以在前一个在使用的情况下直接更新。

不过这里的size这个参量的说明,Buffer size in words,看的有点晕吖,以字为单位的大小??每次转换结果都是半字大小,以字为单位,扫描通道数目必须是偶数啦?而且也不能代表转换次数的单位啊。如果是以字方式存放,那就是个废话,这里填的就应该是项数的2倍,但是例程里面填的又是5........懒得看源码了,反正我就直接填了个数组项数,每次传输完都会复位指针,也不至于溢出了。先就酱紫吧。

nrf_drv_saadc_sample_convert()

这个函数嘛,block方式的转换,反正我是不会用的,浪费CPU时间浪费电

nrf_drv_saadc_sample()

这个就是正经开启一次转换的函数了。转换完成后,会自动在中断程序里面调用初始化时候配置的回调函数,并且会得到相关中断的事件的信息。

ADC这块总的来讲还是提升蛮大,不过和我希望的还是有蛮大差距。最重要的,即使使用TIMER+PPI触发,结合EasyDMA来传输数据,依旧存在一个缺陷,不能循环方式缓存,导致最终还是需要CPU的参与来维持正常的转换,一定程度上会减少CPU睡眠时间比例和持续长度。而且,使用库函数似乎并没有办法关掉ADC的中断,初始化的event_handler必须提供,且每次转换完成都会产生中断,势必唤醒CPU。这样的话,就导致使CPU在ADC连续采集一段时间之后,再批处理数据不太好实现了。

对于此,一种方案就是自己绕过库函数自己造轮子,编写相关代码,也是可以实现得了的。另一种方式,如果采集频率高于CPU处理频率唯一目的是更好进行软件滤波减少误差,也可以通过提高外围硬件的滤波性能,取代软件滤波,原先批处理时候才进行采样转换,在同一个时间点多次采样减少这次时间点的误差,而软件滤波就完全由硬件代劳了。

时间: 2024-10-10 07:21:29

nRF52832开发日志--SAADC调试的相关文章

iOS 开发常用的调试命令

XCode4.0以后,编译器是LLVM,控制台调试命令前缀是lldb 第一.LLVM简介 LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time).链接时间(link-time).运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本. 第二. 对关注编译技术的开发人员,LLVM提供了很多优点: 现代化的设计 LLVM的设计是高度模块化的,使得其代码更为清晰和便于排查问题

JAVA card 应用开发 JCOP的调试方法

本文讲述如何在仿真环境下,调试JAVA card 的APPLET. 通过JCOP在Eclipse进行仿真调试,启动JCOP调试器,我们可以看到如下图: 要仿真调试,就是在命令输入框里面输入JCOP相关的指令,通过阅读JCOP的帮助文档,我们看到JCOP提供的命令不算繁多,大约40个. 下面我挑选常用的几个来说明: 1.      复位卡片:"/atr",如果不加任何参数,表示立即复位. 2.      发送指令:"/send",这是最直观的调试指令.可以逐个指令发送

[课程设计]任务进度条&开发日志目录

[课程设计]任务进度条&开发日志目录 任务进度条&开发日志目录         周    期          时     间       任       务   Sprint One    11.14     ●  Scrum团队分工及明确任务1.0    Sprint One     11.15      ● Sprint One    11.16     ● Sprint One    11.17     ●

微信开发的本地调试环境搭建

微信开发的本地调试只支持80号端口,实验了很多办法,总结一下: 办法一: 公司使用的是联通ADSL, 在路由器上做完端口映射后发现电信/联通封了80端口,所以这个办法走不通了. 办法二: 搜可以下,可以用ngrok,飞快的下载,设置好了.把ngrok的URL填入微信设置时,微信提示这种网址存在安全风险,已经不支持了. 办法三: 最后一招,端口转发(当你有一台外网linux服务器时) (1)首先:把该linux服务器占用80号端口的服务关闭: (2)打开服务器的远程转发功能,执行以下命令: sud

独立开发日志转移说明

为了加强与其他独立游戏开发者的沟通和交流,以后独立开发日志将发在专注独立游戏的indienova,其他通用性的技术文章将继续发在博客园,让不同内容的文章各归其位. 独立开发日志新地址:http://indienova.com/u/guigui/blog

《Invert》开发日志05:终止

今天终于看了久闻大名的<独立游戏大电影>,然后我就做了一个坑爹的决定:终止“Invert”项目的开发.没错,在还没正式开工之前,我就决定停掉这个项目,而且是永久终止.做这个决定并不是因为觉得凭一己之力开发一个游戏不可能,而是因为我突然发现自己正在做的并不是自己想要的游戏.几乎照抄别人的创意,在动工之前就想好如何盈利,只想着如何吸引玩家如何增加留存,这不全是商业游戏的思维和模式吗?这样的游戏又有什么独立开发的意义? 不管是“大电影”还是IndieACE上的讨论都明白无误地告诉我们,真正好的独立游

[转载]在iTOP-4412开发板上调试helloworld应用

本文转自迅为论坛:http://www.topeetboard.com 1.安装ADB驱动 在开发板上调试 Android 应用,首先要安装 ADB 驱动. 通过“SDK Manager.exe”来安装.如下图所示.另外需要注意的是,如果要使用 SDK Manager 安装软件,需要将 Eclipse 关闭. 安装完成后,打开文件夹中“USB_fastboot_tool\platform-tools”的命令行 cmd.exe, 如下图所示,输入命令“#adb”,然后回车.这里集成了 adb 命令

常规功能和模块自定义系统 (cfcmms)—029开发日志(创建ManyToMany的column4)

029开发日志(创建ManyToMany的column4) 根据以上几节的准备,在这一节中可以加入ManyToManyColumn.js了.先来看看做好的样子如下图: 单击文字链接可以显示该条记录的情况.按下删除按钮则会显示一个提示窗口,询问是否删除此项. 下面即为ManyToManyColumn.js的代码. /** * * ManyToMany记录的管理,将根据权限设置来显示修改或删除按钮 * * 蒋锋 2015.12.31 * */ Ext .define( 'app.module.wid

开发日志-14-07-30

Anaconda == Build == 获取源码:git clone git://git.fedorahosted.org/git/anaconda.git 安装依赖包: sudo yum install libtool $(grep ^BuildRequires: anaconda.spec.in | awk '{print $2}') 安装.配置transifex:sudo yum install transifex-client:tx init /tmp ./autogen.sh &&am