基于纳芯微 NSM3013A 芯片设计桌搭量角器
该项目使用了纳芯微 NSM3013A,实现了桌搭量角器的设计,它的主要功能为:测量和实时显示角度信息,适用于需要精确角度控制的场合,如工程测绘、机械加工等。通过集成高精度角度传感器、微控制器以及用户友好的交互界面,我们致力于打造一款既实用又具有创新性的产品。。
标签
Arduino
lvgl
温度
WeDesign活动
气压
湿度
platformio
纳芯微电子
磁角度
鲜de芒果
更新2024-12-25
170

一、项目介绍

本项目旨在设计一款基于带屏12指神探和纳芯微传感器芯片的桌搭量角器。该桌搭量角器主要用于测量和实时显示角度信息,适用于需要精确角度控制的场合,如工程测绘、机械加工等。通过集成高精度角度传感器、微控制器以及用户友好的交互界面,我们致力于打造一款既实用又具有创新性的产品。


二、项目设计思路(含设计框图)

2.1 功能需求

  • 使用带屏12指神探作为主控设计一个桌搭应用。
  • 能够读取温度、湿度、压力数据,显示在屏幕中。
  • 测量实时角度,具备显示功能。
  • 能够显示各个参数波形图。
  • 能够上传数据至电脑


2.2 设计框图

  1. 带屏12指神探:数据处理、控制与显示核心。
  2. NST112D:温度传感器,获取温度数据。
  3. NSHT30:温湿度传感器,获取温湿度数据。
  4. NSPAS3NII5:绝压传感器,获取空气绝对气压数据。
  5. NSM3013A:角度传感器,获取角度数据。
  6. 显示输出:各传感器的数据展示。
  7. 上位机:传感器数据的采集与图形化展示。


2.3 硬件介绍

  • 带屏12指神探:12指神探是一款基于树莓派基金会推出的微控制器RP2040制作的多功能硬件调试助手,它有12根引脚,提供了5V和3.3V的电压,其中有9根GPIO,功能灵活,通过搭配不同程序可以做成各种调试器。带屏版的12指神探,它是在原板12指神探基础上,配备了一块240*240分辨率的LCD彩屏以及两个可程控按键和一个拨轮,丰富了人机交互功能,方便信息观察、界面切换等使用方式。此外还配备了白色外壳,精心设计的包装不仅使板卡日常使用时更加美观也便于板卡的站立以及使用安全。
  • NST112D-CWLR:NST112是一款低功耗高精度数字温度传感器。适用于负温度系数和正温度系数热敏电阻的替换。NST112具有可兼容I2C和SMBus的接口,具有可编程报警和SMBus重置功能,在单路总线上最多可支持4个器件。且无需校准即可在 -20℃到85℃的范围内实现高达±0.5℃的精度。NST112温度传感器是高线性度的,不需要重新组合计算或查表以导出温度。
  • NSHT30-QDNR:NSHT30是一款基于CMOS-MEMS的相对湿度(RH)和温度传感器。NSHT30在单芯片上集成了一个完整的传感器系统,包括电容式的相对湿度传感器,CMOS温度传感器和信号处理器以及I2C数字通信接口,采用2.5mm2.5mm0.9mm的DFN和LGA封装。其I2C接口的通信方式、极小的封装和低功耗特性使得NSHT30可以更广泛地集成到各种应用中。
  • NSPAS3NII5RRAI:NSPAS3系列是纳芯微针对汽车进气歧管压力传感器市场,推出的经过校准过的绝压传感器产品。该产品采用汽车级信号调理芯片对MEMS芯体输出进行校准和补偿,能将10kPa 至400kPa的压力信号转换为可自定义输出范围(0~5V)的模拟输出信号。保证产品优异可靠性的同时,将两颗芯片进行集成封装,大大减小了封装尺寸。同时,调理过的产品可在温度范围内提供精度范围内的标准输出,免去了客户对传感器进行校准的门槛,加速产品研发和量产的进程,产品符合AEC-Q100可靠性标准。
  • NSM3013A-Q1SPR:NSM301x-Q1是一种车规级非接触式旋转角度传感器,在-40°C至125°C的环境温度范围内支持360°旋转角度的精确测量。该系列基于平面霍尔阵列,将两极磁铁的角度位置信息通过内部DSP解算,转化成模拟电压,PWM,SPI等各种输出形式。


2.4 电路板设计

电路板设计使用 KiCAD 8.0 版本设计绘制,其中关键元器件封装使用 立创EDA 下载而来。PCB布局参考了 2024年寒假练  带屏12指神探的传感器扩展板,完全兼容 12指神探 的引脚,两端的引脚焊盘可同时焊接,插入左边插座则是元器件正面朝上。插入右边插座则是元器件正面朝下。

同时也是参考 2024年寒假练  带屏12指神探的传感器扩展板 的设计理念,每种传感器也支持单独使用,可焊接相应的排针排母接口,进行使用。也可以掰下来单独使用,这也极大地增加了传感器的利用率。尤其是两个带温度测量的传感器,参考其 设计指南中的布局参考,在绘制PCB时,使用环形开槽,尽可能隔绝PCB上其它器件对其温度测量的影响。引用设计指南说明截图如下:

由于 立创EDA 中也没有某些元件的 3D模型。因此,在 KiCAD 8.0 中进行3D预览时会无法显示该器件。下图为 KiCAD 8.0 中的 3D渲染效果图。


2.5 关键代码展示与说明

项目基于 VSCode  PlatformIO 插件建立工程,具体步骤不在此文详细展开,可查看PlatformIO 文档 。基于 Arduino 平台进行开发。


2.5.1 NST112温度数据

NST112D-CWLR 这颗高精度数字温度传感器在 Arduino 平台没有现成的库可供使用。而根据其 数据手册 它的 I2C 通讯地址固定为:0x4B ,只需要读取温度数据即可。因此简单地封装了一个函数使用 Wire 库进行读取温度数据。关键代码如下:

/**
* 获取NST112温度数据
*/
void getNST112Data() {
// 读取 NST112D 传感器温度与湿度
i2c.beginTransmission(NST112D_ADDR);
i2c.write(0x0);
i2c.endTransmission();
i2c.requestFrom(NST112D_ADDR, 2);
uint16_t value = i2c.read();
float tmp = (float)value;
value = i2c.read();
i2c.endTransmission();
tmp += (float)value / 256.00;
nst112Temperature = tmp;
}


2.5.2 NSHT30温湿度数据

电路板设计时,我将 NSHT30-QDNR  ADDR 引脚接地(低电平),根据其 数据手册 可知它的 I2C 通讯地址固定为:0x44 。该温湿度芯片在 Arduino 平台有很多的库可供使用读取温湿度数据,本项目中我使用 ArtronShop_SHT3x 库进行温湿度数据的读取。如下代码所示,只需要简单的初始化后,即可获取温湿度数据,十分的简单明了。

#include <ArtronShop_SHT3x.h>
arduino::MbedI2C i2c(IIC_SDA, IIC_SCL);
ArtronShop_SHT3x nsht30(NSHT30_ADDR, &i2c); // ADDR: 0 => 0x44, ADDR: 1 => 0x45

/**
* 获取NSHT30温湿度数据
*/
void getNSHT30Data() {
// 读取 NSHT30 传感器温度与湿度
if(nsht30.measure()) { // 刷新当前温度
nsht30Temperature = nsht30.temperature();
nsht30Humidity = nsht30.humidity();
}
}


2.5.3 绝压数据

NSPAS3NII5RRAI 将 10kPa 至 400kPa 的压力信号转换为可自定义输出范围(0~5V)的模拟输出信号。电路板设计时我将 NSPAS3NII5RRAI  VOUT 引脚通过两个 10KΩ 电阻分压后接到带屏12指神探的 27 脚,如下图所示:

使用带屏12指神探采集到 NSPAS3NII5RRAI VOUT 引脚的模拟输出电压后,根据其 数据手册 中的转换公式,将模拟信号值转换为以千帕为单位的气压值。数据手册中给出的是模拟信号的计算公式:

其中,   表示气压VDDHV 为芯片供电电压 取值 0.008095 取值 0.00095 通过 ADC 测量获得。因此, 我们需要解这个方程来求出  的值。根据求解得到计算公式:

最后,根据求解后得到的公式,编码实现气压值的转换。

/**
* 获取绝压数据
*/
void getPressureData() {
// 绝压ADC读取
uint16_t adcPressure = analogRead(PRESSURE);
// 根据 ADC 读数换算成千帕单位的绝对气压值
float vout = ((adcPressure * ADC_VDDA) / ADC_MAX) * 2;
pressure = ((vout / VDDHV) - B) / A;
}


2.5.4 角度测量

NSM3013A-Q1SPR 基于平面霍尔阵列,将两极磁铁的角度位置信息通过内部DSP解算,转化成模拟电压,PWM,SPI等各种输出形。本项目中我计划使用 ADC 来读取 NSM3013A-Q1SPR 输出的模拟电压值,再转换成角度数据来实现测量角度功能。因此,电路板设计时我将 NSM3013A-Q1SPR  OUT 引脚通过两个 10KΩ 电阻分压后接到带屏12指神探的 28 脚,如下图所示:

由于 NSM3013A-Q1SPR 测量输出的模拟信号对应的角度值并不是线性的,这里我使用中间一段数据来映射到 0 ~ 180° 的数据,从而实现 0 ~ 180° 的角度测量。实际测量时发现采集的数据抖动较大,导致显示出来的测量结果会有 1° ~ 2° 的数值跳动。从而引入了 卡尔曼滤波 对测量结果进行过滤,过滤后的数据在稳定后只会有 0.1° 左右的跳动,带来的后果是测量结果会有延迟才会稳定下来。以下为关键代码实现:

GKalman kalmanFilter(2, 2, 0.01);                       // 卡尔曼滤波

/**
* 获取角度数据
*/
void getAngleData() {
// 角度ADC读取
uint16_t adcAngle = analogRead(ANGLE);
// 根据 ADC 读数换算成度数
angle = kalmanFilter.filtered((((adcAngle * ADC_VDDA) / ADC_MAX) * 2 * 360.0) / VDDHV);
mappedAngle = mapValue(angle, zeroAngle, maxAngle, 0, 180);
}


2.5.5 用户交互

根据 功能需求 中描述,我使用 SquareLine Studio 设计了图形交互界面,总共分为三级页面。如下图所示:首先是启动界面,当程序加载完成后会进入首页,首页可通过拨动开关的 左键  右键 进行切换焦点,当接下拨动开关 中键 时,会进入焦点所在传感器的图表展示界面。

整个UI的交互我没有使用 LVGL 的输入回调函数来进行处理,主要是因为整个UI交互只需要用到一个拨动开关的三个按键。而 菜单键 和 选择键 我用于做量角器的   180° 的校准用,具体的方法下节 角度校准 再介绍。因此,为了编码的一致性,我使用了 OneButton 库进行按键处理,可以非常方便地进行防抖动处理。而和UI交互相关的拨动开关三个按键,则在触发了相应的按键事件后,调用 lv_obj_send_event 发出相应的事件即可。关键代码如下:

// 按键定义
#define BUTTON_MENU p5 // Menu 键
#define BUTTON_SELECT p6 // Select 键
#define BUTTON_LEFT p7 // 拔轮左键
#define BUTTON_OK p8 // 拔轮中键
#define BUTTON_RIGHT p9 // 拔轮右键
// 按键驱动
OneButton btnMenu(BUTTON_MENU, true); // Menu 键
OneButton btnSelect(BUTTON_SELECT, true); // Select 键
OneButton btnLeft(BUTTON_LEFT, true); // 拔轮左键
OneButton btnOk(BUTTON_OK, true); // 拔轮中键
OneButton btnRight(BUTTON_RIGHT, true); // 拔轮右键

/**
* 按键事件回调
*/
void key_event_callback(void *parameter) {
if(parameter == &btnMenu) {
zeroAngle = angle; // 设置零角度
} else if(parameter == &btnSelect) {
maxAngle = angle; // 设置最大角度
} else if(parameter == &btnLeft) {
if(inDetail) { // 详情页点击事件
lv_obj_send_event(ui_detail, LV_EVENT_CLICKED, NULL);
} else { // 首页模块点击事件
if(0 >= focusIndex) {
focusIndex = focusObjSize - 1;
} else {
focusIndex --;
}
showNextFocus();
}
} else if(parameter == &btnOk) {
if(inDetail) { // 详情页点击事件
lv_obj_send_event(ui_detail, LV_EVENT_CLICKED, NULL);
} else { // 首页模块点击事件
switch (focusIndex) {
case 0:
lv_obj_send_event(ui_t112d, LV_EVENT_CLICKED, NULL);
break;
case 1:
lv_obj_send_event(ui_ht30, LV_EVENT_CLICKED, NULL);
break;
case 2:
lv_obj_send_event(ui_pas3, LV_EVENT_CLICKED, NULL);
break;
case 3:
lv_obj_send_event(ui_m3013a, LV_EVENT_CLICKED, NULL);
break;
default:
break;
}
}
} else if(parameter == &btnRight) {
if(inDetail) { // 详情页点击事件
lv_obj_send_event(ui_detail, LV_EVENT_CLICKED, NULL);
} else { // 首页模块点击事件
if((focusObjSize - 1) <= focusIndex) {
focusIndex = 0;
} else {
focusIndex ++;
}
showNextFocus();
}
}
}

/**
* 初始化按键事件监听
*/
void init_key_listener() {
// 按键回调函数配置
btnMenu.attachClick(key_event_callback, &btnMenu);
btnSelect.attachClick(key_event_callback, &btnSelect);
btnLeft.attachClick(key_event_callback, &btnLeft);
btnOk.attachClick(key_event_callback, &btnOk);
btnRight.attachClick(key_event_callback, &btnRight);
}


2.5.6 角度校准

在上节 用户交互 有提到角度校准,由于 NSM3013A-Q1SPR 可以测量 0 ~ 360° 磁场变化,实际上我设计的测量装置只需要测量 0 ~ 180° 的角度即可。受限于磁铁的安装位置偏差,在实际测试过程中发现测量杆从  位置转动到 180° 位置时,直接转换的测量结果数值并没有达到 180°。而测量杆对应的  并不完全是对应着 NSM3013A-Q1SPR 数据手册 中的  位置(如下图所示)。因此,我使用了标定的方式来标定   180° 的值,而拨动测量杆时测量到的角度,通过标定的   180° 值映射到   180° 这个区间,从而获得稳定的角度数据测量结果。


三、搜集素材的思路

为了确保项目的顺利进行,我采取了以下策略来搜集素材:

  1. 活动介绍:活动介绍页面提供了全部芯片的数据手册及功能详情。
  2. 官方渠道:访问制造商的官方网站(如纳芯微、Raspberry Pi等),通常可以直接下载芯片手册、数据手册、应用笔记等。这是最可靠的获取源。若芯片有开发套件或评估板,需要查看相关文档以获得更深入的使用细节。
  3. 在线资源:专业的工程技术论坛不仅可能有手册,还有其他工程师分享的使用经验。另外,开源社区平台可能会有相关项目或讨论,帮助理解芯片的实际应用。
  4. 关联文档:在搜集芯片手册的同时,搜集目标芯片周边器件(例如电源管理芯片、通信模块)的手册,这有助于全面理解芯片工作环境及接口要求。
  5. 供应商沟通:与传感器、微控制器等关键元器件的供应商建立联系,获取详细的产品规格书和应用案例。
  6. 技术交流:参加行业展会和技术研讨会,与同行专家交流经验,获取最新的技术信息和解决方案。


四、成果展示

4.1 实物照片

为了便于使用测量角度,我为传感器扩展板设计了一个简单的3D外壳和拨动指针结构,拨动指针中放置了一块磁铁,将拨动指针安装好磁铁后,安装至外壳上即正好将磁铁靠近 NSM3013A-Q1SPR 中心的正上方,从而拨动测量指针时可以实时获取角度数据。注:安装磁铁时需要注意极性,装反后会导致测量的结果在 0 ~ 180° 这个范围内有跳变,使得数据处理起来较为复杂。

我拍摄了量角器的实物照片以展示其外观和结构。从照片中可以看出该量角器具有着简洁的外观设计以及便于使用的结构特点。使得用户在使用过程中能够简单方便地操作测量角度。


4.2 用户界面

我对量角器的测量精度和稳定性进行了全面测试。测试结果显示该量角器能够准确测量出桌面装饰物的角度误差范围控制在 ±0.1° 以内。同时在不同的环境条件下(如温度变化、湿度变化等)该量角器均能保持稳定的性能表现没有出现明显的漂移或误差增大现象。

经过一系列的设计与优化工作,我成功完成了桌搭量角器的原型制作。以下是实现结果的主界面展示:

上图中主界面分为四个模块,分别对应扩展板上的4个传感器,通过拔动开关的 左键  右键 可切换焦点。点击拔轮 中键 可进入获得焦点传感器的图表界面,通过折线图来展示该传感器的数据折线图。如下图所示:


4.3 上位机数据展示

除了注重用户体验的设计提供了清晰易懂的用户界面和便捷的交互方式。用户可以通过简单的按键操作即可完成角度测量、数据图表的查看等功能。同时我们还提供了数据上传至串口功能以增强用户的使用感受和便捷性。用户通过串口接收数据即可在电脑或其它上位机上展示传感器数据,下图为PC端使用 VOFA+ 展示传感器数据曲线图:


五、总结

遇到的问题

  1. 封装问题,全部的封装库都是使用 立创EDA 中的封装库下载后导入 KiCAD 中使用,四个传感器芯片在 立创EDA 中也没有相应的封装,故而使用相同封装的其它型号进行代替绘制。好在打板后焊接验证没有问题。
  2. 异形板框的绘制过程中出现很多的问题,例如圆角绘制时没有对齐导致的板框不闭合错误,板框线条重合等。
  3. 到了焊接环节,真的需要吐槽一下 NST112D-CWLR 这颗芯片,本身封装很小没问题,关键丝印很容易被污染而导致无法分清 1 号引脚。这对手工焊接非常不友好,建议官方在 1 号引脚对着的角进行小小的倒角处理,这样即不影响贴片机操作,也方便人工更好的分辨 1 号引脚。
  4. NSHT30 nRESET 引脚问题,在焊接好PCB后,插到带屏12指神探接口。打开代码编辑窗口,熟练的让人心疼地 CCCV I2C 地址扫码代码。一顿操作猛如虎,结果只扫到一个 0x4B 的地址,顿时觉得眼前一黑。冷静下来后,通过各种骚操作最终确认为 NSHT30 的 nRESET 引脚默认低电平,导致 NSHT30 复位而读取不到 0x44 的 I2C 地址。
  5. UI的展示使用了 LVGL 图形库进行渲染。在开机时有一段动画操作有果冻效应。尝试了双缓存也没有明显改善,有小道消息说需要使用 DMA 显示效果才好,由于本人能力有限,目前还不知道如何使用故只能先将就。


心得体会

该项目成功地结合了带屏12指神探纳芯微传感器芯片实现了一款精准的桌搭量角器。设计充分考虑低功耗和信号完整性等因素,展示出良好的测量精度和实时性能。进一步优化可以考虑外壳设计和更多高级功能的实现,如数据记录和无线传输。项目过程中,通过查阅资料和技术交流,解决了多个设计和实现阶段的问题,提高了整个系统的稳定性和准确性。


通过本项目的实施我们积累了丰富的实践经验并掌握了多项关键技术为未来的产品开发奠定了坚实的基础。同时我们也认识到在项目中还存在一些不足之处如可以进一步优化系统的功耗性能、提高测量精度的稳定性等。


最后,感谢硬禾学堂推出的《WeDesign》活动!此次活动带给我许多宝贵实践经验和机会,我们下期活动再见!


六、参考资料

物料清单
KiCad文件
使用说明
全屏
附件下载
基于带屏12指神探与纳芯微传感器的桌搭量角器-2024-12-05_084220.zip
KiCAD8.0 工程压缩包
12 finger with screen demo.zip
PlatformIO工程源码
团队介绍
业余电子爱好者
团队成员
鲜de芒果
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号