Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ADC
N32L40XCL-STB
N32L40XCL-STB 开发板模块评测任务大挑战:ADC实践之虚拟示波器实现
发布于 2023-04-20 12:21:02 浏览:409
订阅该版
[TOC] # 1. 前言说明 ## 1.1. 本章内容 本MCU带12bit 4.5Msps ADC,这在通用MCU中采样率是比较高的,适合做模拟前端。 本文先对ADC模块进行简单介绍,然后搭建基于MDK和RT-Thread的开发环境,实现ADC信号采集,最终实现虚拟示波器的Demo。 ## 1.2. 模块介绍 参考《CN_UM_N32L40x Series User Manual_V2.pdf》的《17 模拟数字转换( ADC)》 - 1 个 ADC,支持单端输入和差分输入 ,12 位逐次逼近型。 - 19 个通道,可测量 16 个外部和 3 个内部信号源 内部通道支持 TempSensor、 VREFINT(内部 1.2V BG)、 VREFBUFF(2.048V) - 每个通道的 A/D 转换有四种执行模式:单次、连续、扫描或间断 - 带内嵌数据一致性的数据对齐。 ADC 转换值存储(左对齐/右对齐)在 16 位数据寄存器中 - 可以通过模拟看门狗检测输入电压是否在用户定义的高/低阈值内 - ADC的输入时钟的最大频率为 64MHz。 - 支持 12 位、 10 位、 8 位、 6 位分辨率。 12bit 分辨率下最高采样速率 4.57MSPS。 10bit 分辨率下最高采样速率 5.33MSPS。 8bit 分辨率下最高采样速率 6.4MSPS。 6bit 分辨率下最高采样速率 8MSPS。 - 支持触发采样,包括 EXTI/TIMER。 - 各通道的采样时间间隔可编程。 - 支持自校准。 - 支持 DMA - 中断生成:转换结束,注入转换结束,模拟看门狗事件 - 支持内部参考电压(2.048V) - ADC 支持转换的电压在 VREF-和 VREF+之间。 - ADC 的工作电压在 1.8V 到 3.6V 之间。 - 可以外部触发注入转换和规则转换。 其框图如下 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/47559e905a27907f1291419c952a4cda.png.webp) 其他相关信息可以参考手册不再赘述。 ## 1.3. 开发软件 开发环境:MDK+RT-Thread 下载工具:板载NsLink # 2. 步骤说明 ## 2.1. 导入ADC测试工程 下载ftp://58.250.18.138/1-Microcontrollers/N32L40xxx_V2.1.0.zip解压 双击N32L40xxx_V2.1.0\6-软件开发套件(Software Development Kit)\Nationstech.N32L40x_DFP.1.0.0.pack ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/aadcbd8c4b456bf06aa3de7e948cb355.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/f9a9986dabd2d974dd5f97629a73b352.png.webp) 打开 N32L40xxx_V2.1.0\6-软件开发套件(Software Development Kit)\Nationstech.N32L40x_Library.1.2.1\projects\n32l40x_EVAL\examples\RT_Thread\RT_Thread12_ADC_DEVICE_REGISTER\MDK-ARM\ADC_DEVICE_REGISTER.uvprojx 选择device ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/78842f87a3a651b1273318c2c1df0ace.png.webp) 选择编译器 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/bfe89e89de1cf5be34090d8bb59c6989.png.webp) 删除选项--c99 在右边下拉框选择-c99即可 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/668d5f264afb435049a2f2bd8659a8db.png.webp) **如果提示找不到文件context_rvds.S是因为工程路径中文的原因,工程路径放在英文路径即可。** 选择仿真器烧录算法 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/4b14024fbbbd48f26984dec284c0248e.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/d0c3e07e0e1c1a8fecf9c62a3a7a243d.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/92b304604d51d3b52832e2da818d61c8.png.webp) 下载程序可以看到,串口打印如下(串口参数115200-8-n-1) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/21ea0d310e37887420d1edd583946331.png.webp) ## 2.2. ADC代码介绍 ADC驱动使用的是RT-Thread的设备框架。 我们从main.c的main函数入口,可以看到创建了两个线程 test0_thread_entry和test1_thread_entry其中test1_thread_entry线程用于进行ADC采集。 代码如下: ``` static void test1_thread_entry(void* parameter) { rt_adc_device_t adc_dev; rt_uint32_t adc_converted_value = 0; adc_dev = (rt_adc_device_t)rt_device_find("adc"); rt_adc_enable(adc_dev, ADC_CH_6_PA5); rt_adc_enable(adc_dev, ADC_CH_7_PA6); if(adc_dev) { while(1) { adc_converted_value = rt_adc_read(adc_dev, ADC_CH_6_PA5); rt_kprintf("the PA5 voltage value is %d\r\n", adc_converted_value); rt_thread_delay(50); //delay 500ms adc_converted_value = rt_adc_read(adc_dev, ADC_CH_7_PA6); rt_kprintf("the PA6 voltage value is %d\r\n", adc_converted_value); rt_thread_delay(50); //delay 500ms } } } ``` 可以看到由于使用了驱动框架代码很简单。 rt_adc_device_t adc_dev; 定义设备变量 rt_uint32_t adc_converted_value = 0; 定义变量用于获取采样值 adc_dev = (rt_adc_device_t)rt_device_find("adc");查找设备 rt_adc_enable(adc_dev, ADC_CH_6_PA5); rt_adc_enable(adc_dev, ADC_CH_7_PA6); 使能这两个通道 如果查找到了设备adc_dev则循环采样 adc_converted_value = rt_adc_read(adc_dev, ADC_CH_6_PA5); 采样 再打印延时继续ADC_CH_7_PA6通道的采样。 相关API可以参考RT-Thread官网这里不再赘述。 # 3. 基于ADC实现虚拟示波器 上一节我们实现了ADC的采集,基于此我们可以实现一些有意思的项目,比如将上述采集到的信号发送到PC端进行处理显示,那么就可以实现示波器的功能,这一篇就来实现该Demo。 ## 3.1 代码实现 先将采集到的信号按照一定的格式发送到PC端 上报格式为 “/* 数据,数据 */” 的形式 修改如下,两路采集后一起上报。 ``` static void test1_thread_entry(void* parameter) { rt_adc_device_t adc_dev; rt_uint32_t adc_converted_value1 = 0; rt_uint32_t adc_converted_value2 = 0; adc_dev = (rt_adc_device_t)rt_device_find("adc"); rt_adc_enable(adc_dev, ADC_CH_6_PA5); rt_adc_enable(adc_dev, ADC_CH_7_PA6); if(adc_dev) { while(1) { adc_converted_value1 = rt_adc_read(adc_dev, ADC_CH_6_PA5); //rt_kprintf("the PA5 voltage value is %d\r\n", adc_converted_value); //rt_thread_delay(50); //delay 500ms adc_converted_value2 = rt_adc_read(adc_dev, ADC_CH_7_PA6); //rt_kprintf("the PA6 voltage value is %d\r\n", adc_converted_value); //rt_thread_delay(50); //delay 500ms rt_kprintf("/*%d,%d*/\r\n", adc_converted_value1,adc_converted_value2); rt_thread_delay(1); // 上报速率为约1kHz(没有考虑采样和发送时间) } } } ``` ## 3.2 上位机配置 我们可以使用一款比较好用的开源的串口可视化工具Serial Studio,可以从以下地址下载安装,安装过程很简单,不再赘述。 https://serial-studio.github.io/ 打开Serial Studio软件,按照如下过程配置 点击控制台标签,先配置串口参数,点击连接,可以看到串口打印信息 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/e7e4bd16a7888558329bb9b9564ab0c3.png.webp) 点击json编辑器,创建新项目,设置如下的信息 名字为osc,分割符号为, 开始介乎是符号为/*和*/ ,对应我们的上报格式 “/* 数据,数据 */” 的形式 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/a059ef0f216e9d3608a403177133e4fa.png.webp) 点击拯救(翻译的问题) 保存文件 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/7b6fc1d0c6194dd0e2de1818d065b9dd.png.webp) 然后点添加组别 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/014821212aaaf6e4ba13a4def91fe8a1.png.webp) 设置如下 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/8576774a2f6dd58164b0b486081277ad.png.webp) 再点击添加数据集 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/7f3cc825a1dd11b2c5b73dcd0e7c633b.png.webp) 再次添加数据集点击申请 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/b9a27915e4fdb68f865f8625c174d77d.png.webp) ## 3.3 测试 使用变阻器分压接到PA5和PA6模拟电压变化,进行测试。 点击仪表盘可以看到曲线显示: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230420/964e7fd62eb603a1fbb60392e040395e.png.webp) 改变变阻器位置,可以看到曲线的变化。 得益于ADC的精度和采样率都比较高,可以实现具备使用价值的虚拟示波器。目前的代码仅作延时,实际上如果产品化更具备实用价值我们可以实用DMA方式采集,保存到缓存区然后通过USB高速接口发送到PC端进行解析显示,这样就可以达到ADC的最大带宽8MSPS。这个采样率已经可以比肩一般手持示波器了。 # 4. 章节总结 以上完成了ADC的测试,并实现了一个有一定实用价值的Demo. 从以上可以看出从应用程序开发角度来说,使用RT-Thread的设备框架非常方便,几行简单的代码即可完成ADC采集。 另外Nation的文档和例程也是做的比较好和规范的,所以使用起来也比较简单。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
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
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部