使用温度传感器NST461-DQNR设计项目
NST461-DQNR硬件介绍
小尺寸高精度I2C接口远程和本地数字温度传感器
NST461是一款远程温度传感器监视器,内置本地温度传感器。其远程温度传感器连接的晶体管通常是低成本的NPN或PNP类型晶体管或衬底热晶体管及二极管,这些器件是微控制器、微处理器或FPGA必不可少的组成部分。片上12bit的模数转换可以为本地和远程温度传感器提供高达0.0625℃的分辨率。NST461可兼容 I2C 和 SMBus的接口,最多支持9个设备的可编程引脚地址,并具有可编程警报和SMBus重置功能。NST461包括了串联电阻消除、可编程非理想因子(η因子)、可编程的偏移量、可编程的温度限值、可编程数字滤波器、二极管故障检测和温度报警等功能,提高了输出精度与抗噪性,为热监测提供了可靠的解决方案。NST461的工作电压范围为2.1 V至3.6 V,温度范围为-40℃至125℃,是通信、计算、仪表和工业等众多应用中多位置、高精度温度测量的理想选择。
任务要求
基础任务(必须完成):
- 使用NST461-DQNR制作电路模块和任意单片机,读取本地温度和远程温度。(难度系数 ***)【解析请参考下方“参考答案”】
- 使用上述设计好的电路模块和任意单片机,完成串口输出对应温度数据,并在串口软件上完成温度曲线
任务思路
本次使用arduinoR4作为我们的主控板卡,之后我们可以使用其中的串口绘图工具,将我们的温湿度曲线绘制出来。
逻辑框图

实现准备
本次使用的软件:

需要绘制PCB,我们选择NST461-DQNR,根据其中的数据手册和对应的数据,我们将绘制其中的原理图和PCB,最后将打板出来。
PCB制版

原理图

PCB

焊接成品图,其中NPN的封装选错了,就直接焊接到焊盘上,来实现外部温度的读取。
硬件连接
ADDR --> GND
VCC -->3.3V
GND --> GND
SCL --> SCL
SDA -->SDA

软件编写
其中扫描到的地址是0X4E
在启动之后我们通过配置寄存器,读取本地和远程温度。
本地是0x00寄存器,远程是0x01寄存器。
#include <Wire.h>
#define NST461_ADDR 0x4E // 你扫描到的地址
#define REG_TEMP_LOCAL 0x00
#define REG_TEMP_REMOTE 0x01
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("NST461 Local + Remote Temp Test");
// 启用本地+远程测温
Wire.beginTransmission(NST461_ADDR);
Wire.write(0x0);
Wire.write(0x03); // LEN=1, REN=1
Wire.endTransmission();
delay(300); // 等待转换完成
}
float readTemperature(uint8_t reg) {
Wire.beginTransmission(NST461_ADDR);
Wire.write(reg);
if (Wire.endTransmission(false) != 0) {
Serial.println("Transmission error!");
return NAN;
}
Wire.requestFrom(NST461_ADDR, (uint8_t)2);
if (Wire.available() < 2) {
Serial.println("Read error!");
return NAN;
}
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
int16_t raw = ((int16_t)msb << 8) | lsb;
raw >>= 4; // 低4位为小数部分
return raw * 0.0625; // 每 LSB = 0.0625°C
}
void loop() {
float localTemp = readTemperature(REG_TEMP_LOCAL);
float remoteTemp = readTemperature(REG_TEMP_REMOTE);
Serial.print(localTemp, 2);
Serial.print(",");
Serial.println(remoteTemp, 2);
delay(1000);
}
最后查看一下相关数据
第一个是本地板子的温度,第二个是远程温度

可以绘制串口图来查看一下其中的变化曲线
蓝色是板卡传感器温度,红色是远程温度

板卡温度

远程温度

使用微控制器芯片NS800RT5039 / 评估板NSSinePad-NS800RT5039 设计项目
NS800RT5039硬件介绍
NS800RT5037/5039/5049/3025: 中端算力实时控制MCU
NS800RT5037/5039/5049/3025采用运行在200~260MHz的Cortex M7内核,配合自研的eMath浮点数学运算加速核,可以实现迅速的环路控制和高效的实时控制运算。高速高精度的ADC、100ps的高精度PWM、专用的PWM事件管理器跟高速比较器的快速联动可以保障每个高速环路的精准控制。
任务要求
- 使用上述芯片设计的开发板/原厂NSSinePad-NS800RT5039开发板
- 调用Uart串口,完成在串口输出 “Hello, NOVOSENSE Wedesign project.” 字符串任务。(难度系数 *)
- 【修改(明确输出波形)】调用ePWM外设,实现在对应输出端口,输出一对互补PWM波形,波形频率2MHz,占空比50%。并使用12指神探捕获对应波形截图(未购买12指神探的可以用万用表电压档测量并拍照)。(难度系数 **)
任务思路
使用官方给的demo,使用其中的串口来实现我们的打印操作。
使用这个demo版本uart_ex1_send_receive_polling来实现我们的操作。
逻辑框图

实现过程
这个代码有些地方需要修改,
发现问题,1.串口是使用串口1实现,但是代码是初始化串口2.
修改点

改成串口1的引脚

在这里定位
在main函数这里代码
{
/* Initialize device clock and peripherals */
Device_init();
/* Disable peripheral register locks */
Device_unlockPeriphReg();
/* Board Initialization
Setup LED pins, Key pins and Serial Communication Interface pins
*/
Board_init();
/* UART Initialization */
uart_init(uart);
/* Debug information printing */
printf("Hello, NOVOSENSE Wedesign project.\r\n");
我们连接电脑点击复位实现我们的串口查看
串口部分已经成功实现接下来实现我们的EPWM互补。
EPWM互补实现代码
逻辑框图

epwm_ex11_configure_signal使用这个代码,本次使用一个通道。
在代码上方其中有配置其中epwm中有相关的实现
{2000000, 0.5f, 0.5f, true, DEVICE_SYSCLK_FREQ,
EPWM_COUNTER_MODE_UP, EPWM_CLOCK_DIVIDER_2,
EPWM_HSCLOCK_DIVIDER_1};
//EPWM_SignalParams pwmSignal =
// {10000, 0.5f, 0.5f, true, DEVICE_SYSCLK_FREQ,
// EPWM_COUNTER_MODE_UP_DOWN, EPWM_CLOCK_DIVIDER_2,
// EPWM_HSCLOCK_DIVIDER_1};
本次的代码是2MHz,我们需要将其中的配置,修改50%的占空比。
{
/* Initialize device clock and peripherals */
Device_init();
/* Disable peripheral register locks */
Device_unlockPeriphReg();
/* Disable sync(Freeze clock to PWM as well) */
SYSCON_UNLOCK;
SYSCON_enableTbclkSync(SYSCON, false);
SYSCON_LOCK;
/* Board Initialization */
Board_init();
/* Peripheral Initialization */
peripheral_init();
/* Configuring ePWM module for desired frequency and duty */
EPWM_configureSignal(myEPWM1_BASE, &pwmSignal);
// EPWM_configureSignal(myEPWM2_BASE, &pwmSignal);
// EPWM_configureSignal(myEPWM3_BASE, &pwmSignal);
/* Configure phase between PWM1, PWM2 & PWM3.
PWM1 is configured as master and ePWM2 & 3
are configured as slaves. */
EPWM_disablePhaseShiftLoad(myEPWM1_BASE);
EPWM_setPhaseShift(myEPWM1_BASE, 0U);
/* Configure phase shift for EPWM2 & 3 */
// configurePhase(myEPWM2_BASE, myEPWM1_BASE, 120);
// configurePhase(myEPWM3_BASE, myEPWM1_BASE, 190);
// EPWM_enablePhaseShiftLoad(myEPWM2_BASE);
// EPWM_enablePhaseShiftLoad(myEPWM3_BASE);
/* Enable sync and clock to PWM */
SYSCON_UNLOCK;
SYSCON_enableTbclkSync(SYSCON, true);
SYSCON_LOCK;
/* Interrupt initialization. Disable global interrupts. */
Interrupt_initModule();
/* Interrupt vector table initialization. Vector table remapping. */
Interrupt_initVectorTable();
/* Loop indefinitely */
while(1)
{
}
}
配置为通道1,根据原理图我们可以知道。

然后接入我们的12指神探来实现我们的波形获取。

我们可以看到其中互补波形刚好在50%。
PCB制作
我们在实现代码的基础上实现我们的PCB绘制,用芯片和数据手册的参考,我们实现一块简单的PCB实现。

原理图

PCB

焊接完成效果图
代码实现完成
其中左下角预留下载接口和串口接口来完成任务要求。

连接串口,点击右边的复位,成功获取到串口消息。

下载PWM的程序,与十二指神探连接

其中连接之后查看的波形也是同样的出来相同的波形

使用表压传感器NSPGD1M006DT04设计项目
NSPGD1M006DT04硬件介绍
-10kPa~10kPa带气嘴DIP8封装集成表压传感器(量程可定制)
NSPGD1M 是纳芯微针对家电医疗等市场推出的经过校准的表压传感器系列产品。该系列产品采用高性能信号调理芯片对MEMS 压阻芯体输出进行温度和压力的校准和补偿,保证性能和可靠性的同时对封装进行了集成,易于使用。NSPGD1M系列集成压力传感器可选量程为-10kPa-10kPa,带气嘴的DIP8 封装形式方便客户焊接和使用,适合于压力敏感元件结构材料相兼容的非腐蚀性气体的表压检测,特别适用于非接触式液位检测等领域,同时也适用于工业及物联网等领域。该系列支持模拟输出/I2C 数字输出以及特有的频率输出功能,应用更加灵活。
基础任务(必须完成):
- 使用NSPGD1M006DT04制作电路模块和任意单片机,完成以下任务:(难度系数 ***)
- 【修改】配置成I2C输出方式
- 【修改】记录不同水压(如10cm,30cm,60cm水柱)的I2C值,并使用串口输出对应的值(压力系数即可)
任务思路
本次使用arduinoR4作为我们的主控板卡,通过I2C驱动传感器。
逻辑框图

实现准备
本次使用的软件:

需要绘制PCB,我们选择NSPGD1M006DT04,根据其中的数据手册和对应的数据,我们将绘制其中的原理图和PCB,最后将打板出来。

原理图

PCB图

焊接实物图
硬件连接
通过I2C连接到arduino,通过驱动实现
#include "NSPGD1M.h"
// 选择传感器型号
#define SENSOR_MODEL NSPGD1M_006DT04 // 或 NSPGD1M_010DT10
// 采样周期
#define SAMPLE_INTERVAL 100 // ms
NSPGD1M pressureSensor(SENSOR_MODEL);
void setup() {
Serial.begin(115200);
while (!Serial) {}
Serial.println("NSPGD1M Pressure Output");
Serial.println("========================");
// 初始化传感器
if (!pressureSensor.begin()) {
Serial.println("ERROR: Sensor init failed!");
while (1) { delay(1000); }
}
Serial.print("Sensor Model: ");
Serial.println(SENSOR_MODEL == NSPGD1M_006DT04 ? "0-6kPa" : "0-10kPa");
Serial.println("Start reading pressure...");
Serial.println("Pressure(kPa)");
Serial.println("--------------------------");
}
void loop() {
static unsigned long lastTime = 0;
if (millis() - lastTime >= SAMPLE_INTERVAL) {
lastTime = millis();
// 读取原始数据
int32_t raw = pressureSensor.readRawPressureData();
float pressure = NAN;
if (raw != 0) {
// 计算归一化
float norm = (float)raw / 8388607.0f;
// 不同型号使用不同系数
float coeff = (SENSOR_MODEL == NSPGD1M_006DT04) ? 0.13333f : 0.08000f;
// 计算压力(kPa)
pressure = (norm - 0.1f) / coeff;
}
// 输出压力
if (isnan(pressure)) {
Serial.println("ERROR");
} else {
Serial.print(pressure, 3);
Serial.println(" kPa");
}
}
}
默认状态下:压力系数

10cm的水压

30cm的水压

60cm的水压

通过测量还是发现有些不同的差别
总结
最后也是成功画板打板完成本次的任务,也学习到在此开发的过程。