nRF52832开发日志--SAADC调试

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

52832的ADC和以前51822系列仍是有蛮大差异的:
一、支持差分输入方式,测量结果为两输入端口电压差的转换的有符号数值,这个功能对于啥桥式传感器的数据采集真是太爽了,能够省一个电平平移放大电路
二、原始分辨率最高提高到12位,14位那个过采样方式实现的,使用限制不少,不能扫描,还不如本身软件解决要多少位有多少位。
三、新增“通道”概念,每一个通道能够选定使用的+-信号源,转换是以通道为个体进行的,若是使能多个通道,则一次触发完成所有通道的扫描转换。
四、自带EasyDMA,能够直接把数据打到RAM内,但不能像STM32那样支持循环传输,复位指针只能靠手动
五、取消了外部电压参考输入,这个其实有点蛋疼,在测量端供电和MCU供电之间存在变更状况下可能会引入偏差,对于低频信号,能够用软件进行补偿,但也还有点蛋疼
六、能够自主配置采样时间,端口负载电阻之类参数
NRF52832开发日志——SAADC调试

NRF52832开发日志——SAADC调试
先上调试经过的代码,这里实现了5个通道的转换,其中两个差分通道,三个单端通道,以手动方式触发,在线程中每100mS触发一次,数据保存在m_buffer_pool数组中。
NRF52832开发日志——SAADC调试
 
这几点关注:
一、官方库挺不错了,提供了一个默认的端口配置的宏定义,很方便,然而实际上仍是蛮多东西须要修改的,但这个方法挺能够借鉴
NRF52832开发日志——SAADC调试
因而我也照着酱紫本身定义了两种我经常使用的端口配置的方式,代码能够少很多了。这里MCU我用供电是1.8V,因此1/3的增益就够完成全量程范围的数据的转换了。
NRF52832开发日志——SAADC调试

二、添加SAADC相关库文件时候,这个文件记得也要添加,在./nrf_driver/hal/路径里面
NRF52832开发日志——SAADC调试

三、配置好正式开始使用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()
这个就是正经开启一次转换的函数了。转换完成后,会自动在中断程序里面调用初始化时候配置的回调函数,而且会获得相关中断的事件的信息。
NRF52832开发日志——SAADC调试


ADC这块总的来说仍是提高蛮大,不过和我但愿的仍是有蛮大差距。最重要的,即便使用TIMER+PPI触发,结合EasyDMA来传输数据,依旧存在一个缺陷,不能循环方式缓存,致使最终仍是须要CPU的参与来维持正常的转换,必定程度上会减小CPU睡眠时间比例和持续长度。并且,使用库函数彷佛并无办法关掉ADC的中断,初始化的event_handler必须提供,且每次转换完成都会产生中断,势必唤醒CPU。这样的话,就致使使CPU在ADC连续采集一段时间以后,再批处理数据不太好实现了。
对于此,一种方案就是本身绕过库函数本身造轮子,编写相关代码,也是能够实现得了的。另外一种方式,若是采集频率高于CPU处理频率惟一目的是更好进行软件滤波减小偏差,也能够经过提升外围硬件的滤波性能,取代软件滤波,原先批处理时候才进行采样转换,在同一个时间点屡次采样减小此次时间点的偏差,而软件滤波就彻底由硬件代劳了。
相关文章
相关标签/搜索