Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ADC
nuc980
RT-Thread Studio
【NK-980IoT评测】RT-Thread ADC应用实践
发布于 2022-04-03 09:41:13 浏览:1294
订阅该版
[tocm] # 0. 前言 ## 0.1 开发板简介 > NK-980IoT是一块基于NUC980DK61Y微处理器(内核为ARM® ARM926EJ-S)的开发板, > 它具有非常丰富的外设,可以帮助用户轻松设计他们的产品或应用系统。 开发板的正面美图如下所示。 ![图片1.png](https://oss-club.rt-thread.org/uploads/20220403/f08dadffa36f87254dbf06c4af513e88.png.webp) 关于开发板的板载资源,Nuvoton官方提供了一份开发板配套的“User Manual”,详细地介绍了板载硬件及其连接的GPIO引脚。见下方共享的腾讯文档链接: 【腾讯文档】User_Manual_NK-980IoT_EN_Rev1.00 https://docs.qq.com/pdf/DWmhEZW1rbXVoVnBm ## 0.2 实验环境介绍 本篇博文主要基于RT-Thread测试 NK-980 IoT开发板的 ADC 外设性能,现将相关实验环境介绍如下: ### 0.2.1 硬件环境 - 开发板:Nuvoton NK-980 IoT - USB线:Micro-USB 连接线 2 根 - ADC外设资源:ADC_AIN[2] - Channel 2 - 传感器:MQ-2 烟雾传感器 ![ee617b08941579499c7e613c88dcd685.jpg.webp](https://oss-club.rt-thread.org/uploads/20220403/ee617b08941579499c7e613c88dcd685.jpg.webp) ### 0.2.2 软件环境 - IDE:RT-Thread Studio - BSP:Nuvoton NK-980IoT for RT-Thread - Programmer:Nuvoton NuWriter V1.16 BootLoader:uboot for NUC980DK61Y(位于 - BootLoader:uboot for NUC980DK61Y(位于rt-thread\bsp\nuvoton\nk-980iot\uboot) - UART Console:MobaXterm # 1. ADC简介 ## 1.1 定义 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。 模数转换器可以实现这个功能,在各种不同的产品中都可以找到它的身影。与之相对应的 DAC(Digital-to-Analog Converter),它是 ADC 模数转换的逆向过程。ADC 最早用于对无线信号向数字信号转换。如电视信号,长短播电台发接收等。 ## 1.2 转换过程 模数转换一般要经过以下几个步骤: - 采样:将时间上连续变化的模拟信号转换为时间上离散的模拟信号。 - 保持与量化:按照某种近似方式将模拟量归化到与之相应的离散电平上。 - 编码:量化后的数值最后需要编码,即A/D转换器输出数字量。 ## 1.3 重要术语 - 分辨率:用于表示模数转换器对输入信号的分辨能力,一般以二进制(或10进制)数的位数来表示,如:8位、10位、12位、16位等; - 精度:表示ADC器件在所有的数值点上对应的【模拟值】与【真实值】之间的【最大误差值】,即:输出数值偏离线性最大的距离。 - 转换速率:表示A/D转换器完成一次从模拟到数字的AD转换所需的时间的倒数。如:某转换器的转换速率为1MHz,表示完成一次AD转换的时间为1微秒。 # 2.RT-Thread ADC设备管理接口 RT-Thread 提供了下列ADC设备管理接口。 | **接口函数** | **描述** | | ---------------- | ------------------------------------- | | rt_device_find() | 根据 ADC 设备名称查找设备获取设备句柄 | | rt_adc_enable() | 使能 ADC 设备 | | rt_adc_read() | 读取 ADC 设备数据 | | rt_adc_disable() | 关闭 ADC 设备 | 上述函数的具体内容请参考官方文档,在此不赘述: [访问ADC设备 (rt-thread.org)](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/adc/adc?id=%e8%ae%bf%e9%97%ae-adc-%e8%ae%be%e5%a4%87) # 3. 测试NK-980IoT的ADC性能 ## 3.1 NUC980微控制器的ADC特性 根据NUC980系列MCU的技术参考手册,它包含一个12位逐次逼近寄存器模数转换器(SAR A/D转换器),有9个输入通道,具有以下特性: - 分辨率:12位分辨率 - DNL:+/-1.5 lsb, inl: +/-3 lsb - 数据率高达200kSPS - 模拟输入范围:VREF 至 AGND,可以是轨至轨 - 模拟电源:2.7-3.6V - 数字电源:1.2V - 9个单端模拟输入 - 自动断电 - 低功耗特性:2170uW(200k SPS时),< 1uA NK-980 IoT开发板上将 ADC 输入通道引出,本篇评测将使用ADC-AIN[0],即:ADC 输入通道0,其位于开发板上 NU3 接口上,GPIO 引脚为 PB0。引脚分配图如下所示。 ![a977af094ee2f385b107efb4b416e5ee.png](https://oss-club.rt-thread.org/uploads/20220403/a977af094ee2f385b107efb4b416e5ee.png) ## 3.2 硬件环境搭建 使用杜邦线将开发板与传感器板相连,效果如下图所示。 ![2-硬件环境搭建.png](https://oss-club.rt-thread.org/uploads/20220403/0ee85a40e2beeb8e8cb21e4a0df71e5d.png.webp) 注:三根杜邦线分别为 3.3V、GND和PB0。 ## 3.3 确保ADC使能 在编写ADC应用层代码时,应先确保 RT-Thread 的 ADC 模块被使能,查看方法如下图所示。 ![f8602320e4b692975d208983f3c6c9d7.png](https://oss-club.rt-thread.org/uploads/20220403/f8602320e4b692975d208983f3c6c9d7.png) 双击“RT-Thread Settings”,在“硬件”标签页,查看【使能ADC】选项是否被选中。 ## 3.4 查看ADC设备名 Nuvoton官方提供的BSP已移植好基于 RT-Thread 设备框架的 ADC 驱动程序,由于使用ADC的第一步需要先找到并打开 ADC 设备,因此需要先确定 ADC 驱动程序中使用的设备名。 相关源码位于“libraries\nuc980\rtt_port\drv_adc.c”文件中,如下图所示,可以看到驱动程序使用的 ADC 设备名为“adc”。 ![ADC设备名.png](https://oss-club.rt-thread.org/uploads/20220403/0b90b4c2fb2f0a38b5b6563cf14bdff4.png) ## 3.5 编写ADC转换APP程序 在工程“applications”文件夹下创建"app_adc_mq2.c"文件,键入下列程序: ```C #include
#include
#define ADC_DEV_NAME "adc" /* ADC Device Name */ #define ADC_DEV_CHANNEL 0 /* ADC Channel-0 */ #define REFER_VOLTAGE 330 /* Reference Voltage: 3.3V */ #define CONVERT_BITS (1 << 12) /* Precision 12bit */ //static int myADC_sample(int argc, char *argv[]) static int myADC_sample(void) { rt_adc_device_t adc_dev; rt_uint32_t value, vol; rt_err_t ret = RT_EOK; /* find ADC Device */ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); if (adc_dev == RT_NULL) { rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME); return -RT_ERROR; } while (1) { /* enable ADC Device */ ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL); if (ret != RT_EOK) { rt_kprintf("enable adc channel %d failed.\n", ADC_DEV_CHANNEL); return -RT_ERROR; } /* read ADC sample value */ value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); rt_kprintf("ADC Value is :%d.\n", value); /* Convert the value to voltage */ vol = value * REFER_VOLTAGE / CONVERT_BITS; rt_kprintf("The Voltage is :%d.%02d V.\n", vol / 100, vol % 100); /* disable the ADC channel */ ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL); rt_thread_mdelay(2000); } return RT_EOK; } /* 导出到 msh 命令列表中 */ //MSH_CMD_EXPORT(myADC_sample, adc voltage convert sample); INIT_APP_EXPORT(myADC_sample); ``` ## 3.6 编译并烧写固件 按下“CTRL+B”按键完成程序编写,完成“rtthread.bin”固件的烧写。 ## 3.7 程序执行结果 分别将 AI[0] 通道接入 MQ-2 烟雾传感器、GND 和 3.3 V,测试 ADC 转换的准确性。 ADC转换的结果如下图所示。 ![ADC采样执行结果.png](https://oss-club.rt-thread.org/uploads/20220403/82d23f7460364ad716038776560141bf.png.webp) 从上图可以看到: - 采样烟雾传感器的值为1477(12 bit精度时,最大值为4096),对应电压值为1.18 V; - 采样 GND 的值为 0; - 采样 3.3V 的值为 4095,对应电压值为 3.29V。 #4. 评测结论与体会 本篇应用实践对NK-980IoT开发板的 ADC 特性进行的评测,得出以下结论: - NUC980微控制器的 ADC 性能良好,测试结果准确性高; - Nuvoton官方移植的 ADC 设备驱动程序未发现 bug; - 需要注意的地方: - 一是ADC设备名要对应,否则会出现找不到 ADC设备的错误。 - 二是要确保 RT-Thread 已使能 ADC 驱动模块。 - 最重要的一点:感觉学会了RT-Thread就学会了所有的单片机(前提是:单片机生产厂商针对RT-Thread移植好相关外设驱动程序。 =========================== [RT-Thread 工程代码仓库 Gitee](https://gitee.com/mxdx-aiot/nk980iot-rtt-std)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
iotfans
满血工作中……
文章
3
回答
1
被采纳
0
关注TA
发私信
相关文章
1
请大神帮忙看下风格 还是哪里有问题 照着串口驱动写的ADC驱动
2
ADC config
3
rt_thread_delay()和ADC采样之间的冲突
4
请教在官方BSP中的STM32F40X程序中加入ADC,串口没输出。
5
给RT-Thread添加ADC驱动框架
6
求助:ADC采样被干扰
7
【内核和外设学习营】十里 ADC光敏电阻电压采集实验
8
<内核学习营>+坦然+探索者stm32f407板子的ADC测试光传感器实验
9
【内核学习营】+青春+ADC读取光敏传感器实验
10
《内核学习营》+水一方+项目中应用的ADC实现电压采集
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
7
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部