ADC采集 ======= 作者:陈之敏 时间:2020年08月15日 关键字:csdk、RDA8910、二次开发、模拟量信号采集 ## 目录 `点击这里查看所有博文 `__   最近听说有的小伙伴看了我的教程后,有一些问题都跑到官方的gitee上面去问去了。导致官方的人没搞懂问的是啥,小伙伴们也没能知道自己想要的答案。给大家造成了困扰,这里我说声抱歉。   既然出现了这个问题,我这里就声明一下,本系列教程所涉及的内容(demo)不是官方的作品。我个人觉得官方的demo内容太多太全,往往都是把一个模块内所有的东西全部放在一起。这样的话对新手不是很友好,阅读起来也比较费劲。我就把官方的部分demo进行相关的简化,并推出教程这样的话可能会对新手朋友们有一定的帮助。   有时候周末闲暇时间我也会加上一些我觉得好玩的模块在里面,这些可能在官方的demo都没有,比如cJSON、PAHO-MQTT、http-client。   这就是官方的代码仓库。 .. code:: c git clone --recursive https://gitee.com/openLuat/Luat_CSDK_Air724U.git   当然各位小伙伴在看本教程时,我建议还是使用我下面提供的仓库比较好,看完之后在迁移到官方的仓库⇧。 .. code:: c git clone --recursive https://gitee.com/chenxiahuaxu/RDA8910_CSDK.git   再看本教程过程中如果遇到了问题,可以在本人的代码仓库下面评论。也可以在本人的\ `博客 `__\ 下面评论。我要是看到的话,并且这个问题在我的能力范围的话我会尽力解答的(非官方,不要对我要求太多哦,要求太多我可能就不管啦)。 一、前言 --------   在很长的一个时间内。我的rda8910二次开发系列的的文章中第四小节是处于\ ``暂时没有``\ 的情况。有的人可能会很纳闷,没有就没有,你别写呗。没事把位置占着干嘛。搞得大家都很好奇,这里到底会是个什么东西呢,竟然搞了几个月都没有搞出来。 .. figure:: https://img-blog.csdnimg.cn/2020081319302954.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述   本来这一篇文章应该要在5月份发布的,当时准备写一篇adc的教程。查了下硬件手册。看到模组只有adc2和adc3,分别引出到了63和64引脚。知道adc的编号后就可以开始写测试程序了。 .. figure:: https://img-blog.csdnimg.cn/20200813195854320.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述   写完测试程序后编译一看发现ADC例程编译不过,提示找不到函数。这我暂时也就没办法了,就一直没写放在那里没有发。后来大概在7月初的时候我又试了一下adc可以编译通过了。当我准备再次尝试一波的时候,我找了半天都没有找到adc2和adc3的插针,后来拿到原理图一看,发现这两个引脚,只是在外围焊了几个电阻。没有引出到插针上。 .. figure:: https://img-blog.csdnimg.cn/20200813193936491.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述   我们如果想在开发板上测试一波adc,那就只能自己飞线了。我一看,乖乖这线不好焊啊,焊不好的话开发板就报废了。当时就怂了,果断收起开发板,于是这事又被搁置了一个月。   看到前一段时间合宙新出的开发板自带mic和sd卡,正好想买个新的开发板玩玩。想着坏就坏了吧,旧的不去新的不来,今天下定决心。拿起我的电烙铁,上来就干。(别学下图妹子拿烙铁,否则ʘᴗʘ) .. figure:: https://img-blog.csdnimg.cn/2020081319472949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述   下午废了九牛二虎之力,终于把这两个线焊上去了。焊的过程中,差点把焊盘都给怼掉。这玩意实在不好焊。靠的太紧了,容易连锡。最重要的是这锡哪里都沾(旁边的焊盘沾一堆),就是不沾线,怎么搞都焊不上,当时给我气的(我承认是我菜)。这玩意确实有点不好焊,没弄过的热建议不要轻易去尝试!!! .. figure:: https://img-blog.csdnimg.cn/20200813195257445.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述   硬件准备好后,我们可以一起来看看测试程序怎么写。 二、相关的库函数 ----------------   官方提供的adc库函数有两个。分别是初始化adc通道和读取adc通道的数据。只要传入需要操作的adc通道就可以得到相应的运行结果。 /**ADC初始化 *@param channel: adc通道*\ @param mode: adc模式 \*@return TRUE: 成功     FALSE: 失败 \**/ - BOOL ``iot_adc_init``\ (channel,mode); .. /**读取ADC数据 *@note ADC值,可以为空, 电压值,可以为空*\ @param channel: adc通道 *@param adcValue: ADC值,可以为空*\ @param voltage: 电压值,可以为空 \*@return TRUE: 成功     FALSE: 失败 \**/ - BOOL ``iot_adc_read``\ (channel,adcValue,voltage); 三、编写程序 ------------ 3.1、编写adc2测试程序 ---------------------   测试程序的逻辑很简单。我们在主函数创建了一个测试任务,任务开始时首先初始化adc的通道。   如果初始化返回false(也就是说初始化失败)。那我们就没必要继续执行下去了。这时候可以直接删除任务。但是!这里是测试,如果直接删除了,我们自己可能什么都看不到,所以我选择循环打印初始化失败的消息。   如果初始化成功就进入另一个死循环,每隔1s读取一下adc2的数值。读取成功就打印读取到的adc数据,读取失败就打印失败信息。 .. code:: c static void ADC2(void *param) { BOOL err = iot_adc_init(OPENAT_ADC_2, OPENAT_ADC_MODE_MAX); while (!err) { iot_debug_print("ADC2 Init FALSE"); osiThreadSleep(1000); } UINT32 adcValue = 0, voltage = 0; while (1) { err = iot_adc_read(OPENAT_ADC_2, &adcValue, &voltage); while (!err) { iot_debug_print("ADC2 read FALSE"); osiThreadSleep(1000); } iot_debug_print("ADC2 read adcValue:%d,voltage:%d", adcValue, voltage); //线程休眠500ms osiThreadSleep(1000); } } 3.2、编写adc3测试程序 ---------------------   模组上一共有两个adc的引脚,那么干脆我们就把两个引脚一起都测试了。反正测试程序的逻辑是一样的,也就改个编号的事情。没有什么太大的区别。 .. code:: c static void ADC3(void *param) { BOOL err = iot_adc_init(OPENAT_ADC_3, OPENAT_ADC_MODE_MAX); while (!err) { iot_debug_print("ADC3 Init FALSE"); osiThreadSleep(1000); } UINT32 adcValue = 0, voltage = 0; while (1) { err = iot_adc_read(OPENAT_ADC_3, &adcValue, &voltage); while (!err) { iot_debug_print("ADC3 read FALSE"); osiThreadSleep(1000); } iot_debug_print("ADC3 read adcValue:%d,voltage:%d", adcValue, voltage); //线程休眠500ms osiThreadSleep(1000); } osiThreadExit(); } 3.2、完整程序 -------------   完整的demo在这里,可以复制直接用。 .. code:: c /* * @Author: your name * @Date: 2020-05-19 14:05:32 * @LastEditTime: 2020-05-20 15:38:37 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \RDA8910_CSDK\USER\user_main.c */ #include "string.h" #include "cs_types.h" #include "osi_log.h" #include "osi_api.h" #include "iot_debug.h" #include "iot_uart.h" #include "iot_os.h" #include "iot_gpio.h" #include "iot_pmd.h" #include "iot_adc.h" static void ADC2(void *param) { BOOL err = iot_adc_init(OPENAT_ADC_2, OPENAT_ADC_MODE_MAX); while (!err) { iot_debug_print("ADC2 Init FALSE"); osiThreadSleep(1000); } UINT32 adcValue = 0, voltage = 0; while (1) { err = iot_adc_read(OPENAT_ADC_2, &adcValue, &voltage); while (!err) { iot_debug_print("ADC2 read FALSE"); osiThreadSleep(1000); } iot_debug_print("ADC2 read adcValue:%d,voltage:%d", adcValue, voltage); //线程休眠500ms osiThreadSleep(1000); } } static void ADC3(void *param) { BOOL err = iot_adc_init(OPENAT_ADC_3, OPENAT_ADC_MODE_MAX); while (!err) { iot_debug_print("ADC3 Init FALSE"); osiThreadSleep(1000); } UINT32 adcValue = 0, voltage = 0; while (1) { err = iot_adc_read(OPENAT_ADC_3, &adcValue, &voltage); while (!err) { iot_debug_print("ADC3 read FALSE"); osiThreadSleep(1000); } iot_debug_print("ADC3 read adcValue:%d,voltage:%d", adcValue, voltage); //线程休眠500ms osiThreadSleep(1000); } osiThreadExit(); } //main函数 int appimg_enter(void *param) { osiThreadCreate("ADC2", ADC2, NULL, OSI_PRIORITY_NORMAL, 2048, 0); osiThreadCreate("ADC3", ADC3, NULL, OSI_PRIORITY_NORMAL, 2048, 0); return 0; } //退出提示 void appimg_exit(void) { OSI_LOGI(0, "application image exit"); } 四、下载测试 ------------   分别把adc2和adc3的飞线,接到0v、1.8v和VBAT(3.8v)。查看打印结果。数据走向是正确的,逐渐递增。 .. figure:: https://img-blog.csdnimg.cn/20200813203343658.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述 .. figure:: https://img-blog.csdnimg.cn/20200813202916897.png#pic_center :alt: 在这里插入图片描述 在这里插入图片描述   这一看好像就1.8v误差大了点。但是我的直觉告诉我,不应该误差这么大,都干到了2.2V了。于是拿来了万用表测试了一下,好像输出的就是2.2V。那说明模块测试的结果还是挺准的。 .. figure:: https://img-blog.csdnimg.cn/20200813203935213.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述   就是这里测试adc2的时候要\ ``注意下``\ ,之前我测试的时候没有仔细看原理图。发现adc2无论接什么电压,它量出来的都是3.8V。接0v的话就直接断电了。后来看了下原理图,发现adc2的引脚通过了一个\ ``0``\ 欧的电阻直接拉到了\ ``VBAT(3.8V)``\ 。这样的话adc2那就不能被比3.8V低的电平有效的拉低。 .. figure:: https://img-blog.csdnimg.cn/20200813204310343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述   我不太清楚这个电阻有什么其他的作用。为了测试,我就直接把它卸掉了。让adc2浮空,这样测试就正常了,电阻就在这。我这里还是建议大家最好不要卸掉这个电阻,别到时候板子出问题了,跑过来找我。我没钱赔ʘᴗʘ。 .. figure:: https://img-blog.csdnimg.cn/20200813204815887.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MDA4Mw==,size_16,color_FFFFFF,t_70#pic_center :alt: 在这里插入图片描述 在这里插入图片描述 .. 不会下载的\ `点击这里 `__\ ,进去查看我的\ ``RDA8910 CSDK二次开发入门教程``\ 专题第一篇博文\ ``1、RDA8910CSDK二次开发:环境搭建``\ 里面讲了怎么下载 这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束