N32L40XCL-STB开发板模块评测:ADC实践之虚拟示波器实现

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 之间。
可以外部触发注入转换和规则转换。
其框图如下
其他相关信息可以参考手册不再赘述。
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.06-软件开发套件(software development kit)nationstech.n32l40x_dfp.1.0.0.pack
打开
n32l40xxx_v2.1.06-软件开发套件(software development kit)nationstech.n32l40x_library.1.2.1projectsn32l40x_evalexamplesrt_threadrt_thread12_adc_device_registermdk-armadc_device_register.uvprojx
选择device
如果提示找不到文件context_rvds.s是因为工程路径中文的原因,工程路径放在英文路径即可。
选择仿真器烧录算法
下载程序可以看到,串口打印如下(串口参数115200-8-n-1)
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 %drn, 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 %drn, 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 %drn, 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 %drn, adc_converted_value);
//rt_thread_delay(50); //delay 500ms
rt_kprintf(/ %d,%d /rn, adc_converted_value1,adc_converted_value2);
rt_thread_delay(1); // 上报速率为约1khz(没有考虑采样和发送时间)
}
}
}
3.2 上位机配置
我们可以使用一款比较好用的开源的串口可视化工具serial studio,可以从以下地址下载安装,安装过程很简单,不再赘述。
打开serial studio软件,按照如下过程配置
点击控制台标签,先配置串口参数,点击连接,可以看到串口打印信息
点击json编辑器,创建新项目,设置如下的信息
名字为osc,分割符号为,
开始介乎是符号为/和/ ,对应我们的上报格式 “/ 数据,数据 /” 的形式
点击拯救(翻译的问题)
保存文件
3.3 测试
使用变阻器分压接到pa5和pa6模拟电压变化,进行测试。
点击仪表盘可以看到曲线显示:
改变变阻器位置,可以看到曲线的变化。
得益于adc的精度和采样率都比较高,可以实现具备使用价值的虚拟示波器。目前的代码仅作延时,实际上如果产品化更具备实用价值我们可以实用dma方式采集,保存到缓存区然后通过usb高速接口发送到pc端进行解析显示,这样就可以达到adc的最大带宽8msps。这个采样率已经可以比肩一般手持示波器了。
4.章节总结
以上完成了adc的测试,并实现了一个有一定实用价值的demo. 从以上可以看出从应用程序开发角度来说,使用rt-thread的设备框架非常方便,几行简单的代码即可完成adc采集。
另外nation的文档和例程也是做的比较好和规范的,所以使用起来也比较简单。

石墨烯涂层技术再获突破,用于飞机发动机叶片隔热保护
四川联想电脑维修网点及联系电话
生物识别技术为我国鉴别技术带来了重大意义
E开箱:三星 Galaxy S23 系列,我最终选择了S23+
全新升级的健身房智能镜子,它的全新功能有哪些
N32L40XCL-STB开发板模块评测:ADC实践之虚拟示波器实现
2020年中国的5G连接数全球领先,占比全球5G连接数超过85%
城市该如何安全又高效的管理
骨传导耳机,游戏党必备
电动车走向共享时代能否取得成功
通过Wi-Fi技术推动汽车转型
开关电源(Buck电路)的小信号模型及环路设计
ROS机器人如何使用Navigation导航包实现实时定位
高精度降压LED恒流驱动芯片世微AP5192产品描述
移民在美国半导体发展历史中的重要作用
面对MLED电视虎视眈眈,OLED或将出师未捷身先死?
云计算的服务模式及技术结构
到底该如何学习嵌入式?
启动电容和运行电容的接线方法
荣耀9什么时候上市?荣耀9预热视频来袭!嘲讽小米6七年力作只为撞脸荣耀8