基于纳芯微NSSinePad的多传感器注射推注控制(带报警)系统
该项目使用了NSSinePad,实现了推注控制系统的设计,它的主要功能为:注射器的推拉操作以及运行过程报警功能。
标签
纳芯微
NSSinePad
推注控制系统
孤独的单行者
更新2025-12-02
80
KiCad文件
全屏

一、任务介绍与项目描述

我们本次活动选择了所有器件,包括m7核的开发板NSSinePad-NS800RT5039,以及多种传感器涵盖了温度压力磁场多方位的数据采集。本次我们搭建的项目为基开发板的多传感器注射推注控制系统,带有多种报警功能。主要为了将芯片与多种传感器联合使用起来能够最多的体验相应的器件,让我们本次活动获得最大的一个收获。为此,我们搭建了本次测试用的一个系统。

本次测试的系统主要使用NSSinePad-NS800RT5039评估板作为主控平台,这是一个M7核的单片机,相对来说主频也不低,可以达到260M。通过不同的接口获取传感器的数据,包括IIC数字接口对压力传感器温度传感器进行数据采集,Adc模拟接口进行磁传感器数据的采集,我们在传感器融合应用的基础上也加入了显示屏进行状态显示,并引入了按键进行实际的操作控制。主要的控制对象是一个步进电机驱动的滑轨,步进电机需要脉冲进行单步的操作,实际上其精度还是挺高的。我们本次主要进行推拉操作的控制与状态采集,正好符合两个按键的操作习惯。通过单片机实时的采集与控制可以有效的实现注射器的推注。

二、硬件介绍

本次所使用的硬件相对比较多,除了涵盖本次活动包括的评估版和四个传感器外,我们还加入了数字接口的显示屏,按键等器件。同时,操作对象是一个滑轨,实际上也就是一个步进电机我们需要步进电机驱动器,不进电梯的供电和我们整个系统的运行供电是不同的,所以我们的电源是分开的,下面我们对各硬件部分进行详细的介绍。

首先看一下硬件结构的设计,为了实现更好的数据采集,我们设计的第一个结构时步进电机基座,主要用于包裹固定步进电机以及传感器采集板,同时预留了可扩展接口:


0

接下来是注射器固定结构,包括尾端固定核本体固定部分,注意中轴统一:


0

实物如下:


0

电气部分主要包括评估板、电机驱动板、多功能传感器板等等,其中多功能传感器板中涵盖了本次活动的四个传感器分别如下:

image.png

磁性传感器MT6521:MT652x是新一代基于水平霍尔及聚磁片(IMC)技术原理的磁性角度和位置检测传感器芯片。该芯片内部包含了两对互成90°放置的水平霍尔阵列及聚磁片,能够根据不同的型号配置来实现对XY,XZ以及YZ平面的磁场变化检测,并输出正弦、余弦两路电压信号,再经后续专用电路的放大、补偿和计算后得到角度值(α) 。MT652x的OUT输出管脚提供可编程选择的模拟输出、PWM和SENT输出。

image.png

温度传感器NST461-DQNR:NST461是一款远程温度传感器监视器,内置本地温度传感器。其远程温度传感器连接的晶体管通常是低成本的NPN或PNP类型晶体管或衬底热晶体管及二极管,这些器件是微控制器、微处理器或FPGA必不可少的组成部分。片上12bit的模数转换可以为本地和远程温度传感器提供高达0.0625℃的分辨率。NST461可兼容 I2C 和 SMBus的接口,最多支持9个设备的可编程引脚地址,并具有可编程警报和SMBus重置功能。

image.png

表压传感器NSPGD1M006DT04:-10kPa~10kPa带气嘴DIP8封装集成表压传感器,NSPGD1M 是纳芯微针对家电医疗等市场推出的经过校准的表压传感器系列产品。该系列产品采用高性能信号调理芯片对MEMS 压阻芯体输出进行温度和压力的校准和补偿,保证性能和可靠性的同时对封装进行了集成,易于使用。

image.png

绝压传感器NSPAD1N200DR04:NSPAD1N 是纳芯微推出的一款经过标定的绝对压力传感器系列产品,该产品采用汽车级ASIC对MEMS传感器元件进行标定和补偿。其压力信号范围为10kPa至400kPa,可以转换为SPI/I2C输出信号或模拟输出信号(0~5V),并支持定制输出范围。

还有我们的调试设备:十二指神探化身的逻辑分析仪


0

三、方案设计

当时活动初期的时候,为了更多的体验器件,本次活动下单了,所有的器件,但是拿到手之后还是有一定的迷茫,不知道是融合到一起进行测试还是分器件,分任务进行,因为本次也提供了多样的任务体验,可以根据任务要要求进行实际的设计。要是那样的话,实际的工作量会非常的繁重所以最后还是决定融合到一起。本次的项目的想法的起点就是从磁传感器开始的,毕竟对于他来说,设计的要求和使用场景是相对固定的,所以引入了步进电机,正好手里边有一个滑轨,滑轨是将旋转转为直线运动的一个操作,所以进行注射器的推注非常的适合。进而我们把压力,温度等传感器加进来,比如绝对压力,就是对大气环境的一个显现,温度传感器可以靠近步进电机进而步进电机的升温情况,相对压力正好可以和注射器的堵塞情况相关联。

为此我们设计了如下功能:


0

整体的系统连接示意图如下:


0

四、原理图、PCB设计

原理图设计方面,我们是参考的数据手册中的推荐电路进行的数据手册中,对于多接口的推荐电路都有,我们根据其中我们使用的接口推荐电路进行设计,注意一些内容:

第一个就是其供电是否统一,其中我们本次使用的磁传感器采用的是5V供电,而其他传感器都采用的3.3V供电;

第二个就是接口是否统一,本次的两个压力传感器虽然都支持IIC接口,但是这两个不同类型的传感器采用的设备地址是一样的所以他们不能共用接口。

原理图:


0

PCB图:


0

PCB的设计需要参考结构设计内容,磁传感器的位置需要和步进电机匹配这来,这样采集的更加准确,其他接口位置就可以根据方便进行放置了。

实物图如下:

image.png
0

五、软件设计

这里我们主要介绍一下实现的软件功能和基本的传感器驱动等方面。基本软件流程图如下:


0

传感器驱动主要包括的是数字接口驱动和模拟接口驱动,其中数字接口驱动有三个传感器,分别对应的是温度和两个压力传感器,其中温度传感器驱动如下包括接口的适配和温度数据的读取:

void NST461_Send_Data(uint8_t REG,uint8_t data)
{
i2c_Senddate(hi2c1,(NST461_I2C_ADDR << 1),REG,&data,1);
}

void NST461_Read_Data(uint8_t REG,uint8_t *data)
{
i2c_Readdate(hi2c1,(NST461_I2C_ADDR << 1),REG,data,1);
}


void NST461_Init(void)
{
NST461_Read_Data(NST461_REG_ID,&NST461_ID);
NST461_Read_Data(NST461_REG_CONVER_R,&NST461_ConRate);


}

void NST461_Read_TempData(void)
{
uint8_t TempH = 0;
uint8_t TempL = 0;

uint16_t data = 0;

NST461_Read_Data(NST461_REG_LOCAlTEMP_H,&TempH);
NST461_Read_Data(NST461_REG_LOCAlTEMP_L,&TempL);

data = TempH;
data = (data<<4) | (TempL>>4);


Data_LocalTEMP = (float)data/16;


}

压力传感器其实是可以共用的,只不过对应的接口和数据的处理不同,我们看一下绝压传感器的整个驱动函数:

void NSPAD1N200DR04_Write_Byte(uint8_t REG,uint8_t data)
{
i2c_Senddate(hi2c1,(NSPAD1N_I2C_ADDR << 1),REG,&data,1);
}

void NSPAD1N200DR04_Read_Byte(uint8_t REG,uint8_t *data)
{
i2c_Readdate(hi2c1,(NSPAD1N_I2C_ADDR << 1),REG,data,1);
}

void NSPAD1N200DR04_Read_3Byte(uint8_t REG,uint8_t *data)
{
i2c_Readdate(hi2c1,(NSPAD1N_I2C_ADDR << 1),REG,data,3);
}


void NSPAD1N_Read_PData(void)
{
uint8_t number = 50;
uint8_t Reg30[3] = {0};
uint8_t Pdata[3] = {0};
uint32_t PCode = 0;
uint32_t data = 0;
Data_NSPAD1N = 0;
NSPAD1N200DR04_Write_Byte(NSPAD1N_REG_CONFIG,0x0A);
for(uint8_t i = 0;i<number;i++)
{
NST_Delay_ms(1);
NSPAD1N200DR04_Read_Byte(NSPAD1N_REG_CONFIG,Reg30);
if(Reg30[0] == 0x02)
{
NSPAD1N200DR04_Read_3Byte(NSPAD1NPada_REG_PDATA,Pdata);
PCode=(Pdata[0]*65536+Pdata[1]*256+Pdata[2]); //PCode = Data0x06*2^16+ Data0x07*2^8+ Data0x08
if (PCode >8388607)
data= PCode-16777216; //Symbol processing
else
data= PCode;
Data_NSPAD1N = ((float)data/8388607*231.250)+(-8.125);
break;
}
}
}

相对压力传感器的驱动函数如下:

void NSPGD1M_Write_Byte(uint8_t REG,uint8_t data)
{
i2c_Senddate(hi2c2,(NSPAD1N_I2C_ADDR << 1),REG,&data,1);
}

void NSPGD1M_Read_Byte(uint8_t REG,uint8_t *data)
{
i2c_Readdate(hi2c2,(NSPAD1N_I2C_ADDR << 1),REG,data,1);
}

void NSPGD1M_Read_3Byte(uint8_t REG,uint8_t *data)
{
i2c_Readdate(hi2c2,(NSPAD1N_I2C_ADDR << 1),REG,data,3);
}

void NSPGD1M_Read_PData(void)
{
uint8_t number = 50;
uint8_t Reg30[3] = {0};
uint8_t Pdata[3] = {0};
uint32_t PCode = 0;
uint32_t data = 0;
Data_NSPAD1M = 0;
NSPGD1M_Write_Byte(NSPAD1N_REG_CONFIG,0x0A);
for(uint8_t i = 0;i<number;i++)
{
NST_Delay_ms(1);
NSPGD1M_Read_Byte(NSPAD1N_REG_CONFIG,Reg30);
if(Reg30[0] == 0x02)
{
NSPGD1M_Read_3Byte(NSPAD1NPada_REG_PDATA,Pdata);
PCode=(Pdata[0]*65536+Pdata[1]*256+Pdata[2]); //PCode = Data0x06*2^16+ Data0x07*2^8+ Data0x08
if (PCode >8388607)
data= PCode-16777216; //Symbol processing
else
data= PCode;
Data_NSPAD1M = ((float)data/8388607-0.1)/0.13333;
break;
}
}
}

我们有一些案件的采集和处理程序,包括我们的报警信息的处理与处置的联动:

void HAL_Motor_Stop(void)
{
motor_run_pin_Stop;
Motor_flag = 0;
GreenLED_Off;
}

void HAL_Motor_Set(uint8_t dir)
{
if(dir == MANUAL_tui)
motor_dir_pin_tui;
else if(dir == MANUAL_la)
motor_dir_pin_la;

motor_run_pin_Start;
Motor_flag = 1;
GreenLED_On;
Err_flag = 0;
RedLED_Off;


}
void control_judge(void)
{
if(Motor_flag == 1)
{
if(abs(Last_Age-Age)<5)
{
Err_flag = 1;
RedLED_On;
motor_run_pin_Stop;
}
Last_Age = Age;
if(Data_NSPAD1M > 3 && Data_NSPAD1M < 6)
{
Err_flag = 2;
RedLED_On;
motor_run_pin_Stop;
}
}
}

void control_key(void) {
if ((g_ms - last) < CTRL_LOOP_DT_MS) return;
last = g_ms;

Get_Age();

if(key_pressed_edge(&Bluekey)== true) {
if(Err_flag == 0)
g_state = MANUAL_tui;
}
if (key_released_edge(&Bluekey) && g_state == MANUAL_tui) {
g_state = IDLE;
}

if (key_pressed_edge(&Redkey)) {
if(Err_flag == 0)
g_state = MANUAL_la;
}
if (key_released_edge(&Redkey) && g_state == MANUAL_la) {
g_state = IDLE;
}

// 状态动作
switch (g_state) {
case IDLE:
if(Motor_flag == 1)
{
HAL_Motor_Stop();
}
Err_flag = 0;
break;

case MANUAL_tui:
if(Motor_flag == 0)
{
HAL_Motor_Set(MANUAL_tui);
}
break;

case MANUAL_la:
if(Motor_flag == 0)
{
HAL_Motor_Set(MANUAL_la);
}
break;
default:
g_state = IDLE;
HAL_Motor_Stop();
break;
}

// 显示更新

switch (g_state) {
case IDLE: state_txt = "STOP"; break;
case MANUAL_tui: state_txt = "TUI "; break;
case MANUAL_la: state_txt = "LA "; break;
default: break;
}

}
void Display_init(void)
{
OLED_ShowString(10,0,"Tem:",12, 0);
OLED_ShowString(10,1,"pre:",12, 0);
OLED_ShowString(10,2,"Age:",12, 0);
OLED_ShowString(10,3,"Err:",12, 0);
OLED_ShowString(10,4,"Sta:",12, 0);
Get_Age();
g_init_angle_deg = Age;
Last_Age = Age;
}

void Display_Update(void)
{
if(Show_LocalTEMP != Data_LocalTEMP)
{
OLED_Showdecimal(40,0,Data_LocalTEMP,2,1,12, 0);
Show_LocalTEMP = Data_LocalTEMP;
}
if(Show_Pre != Data_NSPAD1N)
{
OLED_Showdecimal(40,1,Data_NSPAD1N,3,1,12, 0);
Show_Pre = Data_NSPAD1N;
}
if(Show_Age != Age)
{
OLED_Showdecimal(40,2,Age,3,1,12, 0);
Show_Age = Age;
}
if(Show_Err_flag != Err_flag)
{
OLED_ShowNum(40,3,Err_flag,1,12, 0);
Show_Err_flag = Err_flag;
}
if(Show_atate != g_state)
{
OLED_ShowString(40,4,state_txt,12, 0);
Show_atate = g_state;
}

}

我们简单看一下数字接口驱动的波形效果,这个在我们进行驱动的时候可以使用一下驱动成功之后就是我们的逻辑判断了驱动设计,这里我们使用的是逻辑分析仪进行的查看还是非常的方便的:


0

上图是我们采集到的一个温度传感器的数据,是符合我们基本驱动的流程的通信

下面是单次压力检测的波形:


0

读出24位压力数据:


0

这样的逻辑分析仪,相当的小巧,而且实用开源的软件和固件我们也可以进行进一步的优化,当然,软件也会存在一些未知的bug,比如卡死,固件找不到等等这些情况,我们可以通过重启的方式进行重新设计逻辑分析仪,会在规定时间内的一个采集状态不是实时的进行采集,毕竟信号发送还是比较频繁的

六、实物演示及说明

磁传感器采集步进电机的的角度,需要保证磁铁和传感器的中心度:

image.png

温度传感器和压力传感器用于环境状态展示:

image.png

相对压力用于管路阻塞报警,与前端连接:

image.png

最后的连接效果如下:


0

整个系统的组成可以看到还是挺多的,我们也是将各种功能的器件联系到了一起,通过开发版进行全面的控制,整个效果看起来还是不错的。不过由于驱动板不是这个步进电机的专用驱动板,在运行方面还是有一定噪音。

界面显示效果如下:

image.png

七、心得体会

这次的活动对纳芯微的器件用了个遍,实际上纳芯微的器件使用起来还是非常方便的,其内部寄存器也不是很复杂,主要需要考虑一些使用上的要求注意事项等等。我们从器件出发进行实际项目的构思,再到具体的设计,从结构设计进行基础的铺垫,然后通过电气连接实现器件的驱动,最后通过逻辑搭建实际的控制功能,实现了这个相对全面的控制系统,在学习的同时也是对编程能力的锤炼。

软硬件
电路图
附件下载
MotorControl.zip
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号