【技术支持案例】使用S32K144+NSD8381驱动电子膨胀阀
文章目录
- 1. 前言
- 2. 问题描述
- 3. 理论分析
- 3.1 NSD8381如何连接电机
- 3.2 S32K144和NSD8381的软件配置
- 4.测试验证
- 4.1 测试环境
- 4.2 测试效果
- 4.3 测试记录
1. 前言
最近有客户在使用S32K144+NSD8381驱动电子膨胀阀时,遇到无法正常驱动电子膨胀阀的情况。因为笔者也是刚开始使用NSD8381,无法线上支持这类实际应用问题,所以让客户提供了一个电子阀,自己搭建环境进行测试。
2. 问题描述
客户电子膨胀阀的阀针安装位置比较隐蔽,需要通过注水观察水的流动情况,判断阀门是否打开关闭。之前也给客户提供了NSD8381的驱动代码,以及相关的文档说明,如下所示,
- 基于S32K144驱动NSD8381
但是客户反馈,按照文档的步骤配置NSD8381之后,无论给CTRL1引脚发送多少脉冲,阀门始终无法关闭,即注水都会流出。
3. 理论分析
关于S32K144+NSD8381无法驱动电机的场景,主要有两种可能,一个是NSD8381的寄存器配置有误,或者NSD8381和电机的接线有问题。
针对NSD8381配置有误的可能性,客户有测试更改过NSD8381的步进电机模式(1/16细分改为1/2),运行电流(576mA更改1.3A)等参数,现象仍然一致,并且读了SPI的返回值,最高字节为0x80,说明寄存器配置有正确写入。
针对NSD8381和电机的连线,发现和NSD8381的时序不一致,详细情况如下描述。
3.1 NSD8381如何连接电机
客户的电子膨胀阀的运行时序如下左图,当前的NSD8381的输出引脚和电机的连线如下有图。

- 从横轴看左上图,1到8为阀门关闭的相序,8到1为阀门打开的相序;
- 从纵轴看左上图,1,2,3,4分别为电机四根引线的输入电平要求;
- 右上图显示NSD8381和电机的连线情况为:OUTA1、OUTA2连接电机的1、3号引线,OUTB1、OUTB2连接电机的2、4号引线。
按照上图的连线方式,对应的NSD8381输出引脚需要的相序如下表格最右列。

翻看NSD8381数据手册,1/2微步模式下的芯片的相序如下:

为了让电机相序和NSD8381的相序一致,需要NSD8381和电机的接线方式修改,修改后的接线方式为:
- OUTB1、OUTB2连接电机的1、3号引线,OUTA1、OUTA2连接电机的2、4号引线
按如上描述修改接线方式后,对应的NSD8381输出引脚需要的相序如下表格:

另外,客户提供的电机参数表中,和驱动电路相关的参数如下红框所示:

对应的驱动NSD8381配置为:
- 供电电压为12系统;
- 1/2微步模式下,CTRL1引脚的PWM频率在80-200Hz;
- 1/2微步模式下,阀门从完全关闭到完全打开的PWM脉冲数为576,从完全关闭到打开阀门,需要38±15个PWM脉冲。
针对这些需求,需要基于前文《基于S32K144驱动NSD8381》分享的代码做一些修改。详细情况如下描述。
3.2 S32K144和NSD8381的软件配置
- 因为需要计算PWM的脉冲数,所以需要增加PWM计数功能。代码修改如下。
- 增加FTM2通道5的中断使能;
FTM_DRV_EnableInterrupts(INST_FLEXTIMER_PWM1, FTM_CHANNEL5_INT_ENABLE);
- 增加对应的中断处理函数,在里面增加PWM计数功能;
volatile uint16_t PWM_Count = 0;void FTM2_Ch4_Ch5_IRQHandler(void)
{PWM_Count++;FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_PWM1,FTM_CHANNEL5_FLAG);
}
- 需要将PWM的频率修改为200Hz,修改下图形化配置即可。

- NSD8381的初始化函数中,需要修改步进电机模式为1/2微步,修改如下红框,即对CONFIG3寄存器赋值0x9B00。

- 在while(1)循环中,增加如下功能:
-
增加PWM计数处理逻辑,以及和PH[5:0]寄存器值的获取,用于判断NSD8381是否处于1/2微步模式,以及达到预定的PWM脉冲后,停止CTRL1引脚的脉冲输入。
-
增加按键按下处理逻辑,按下SW2,将CTRL2引脚拉低(DIR为0),输入PWM波到CTRL1引脚;按下SW3,将CTRL2引脚拉高(DIR为1),输入PWM波到CTRL1引脚。
-
如果希望电机整体功耗降低,可以增加Hold模式,当电机停止转动,开启Hold模式,此时消耗的电流远远小于RUN模式的电流。
对应的代码如下:
while(1){Phase_Count = NSD8381drv_GetPH();/* 励磁速度,80-200pps(每秒钟的脉冲数)* 开阀脉冲数38±15PS,全开脉冲576* *//* 测试步进电机模式是否正确配置,1/2微步的时候,PWM计数4,PH[5:0]计数0b100000,即32*/if(PWM_Count == 4){printf("PWM Count is %d\r\n", PWM_Count);printf("Phase Count is %d\r\n", Phase_Count);}if(PWM_Count == 576){NSD8381drv_HOLDM_En(ENABLE);FTM_DRV_DeinitPwm(INST_FLEXTIMER_PWM1);printf("PWM Count is %d\r\n", PWM_Count);printf("Phase Count is %d\r\n", Phase_Count);PWM_Count = 0;}/* SW2 press */if(SW2_Press_Flag){SW2_Press_Flag = false;printf("SW2 press!\r\n");/* Increment phase counter, clockwise */NSD8381drv_CTRL2_Dir(clockwise);/* Hold mode -> Run mode */NSD8381drv_HOLDM_En(DISABLE);/* FTM2 CH5 use PWM mode,freq:200Hz */FTM_DRV_InitPwm(INST_FLEXTIMER_PWM1, &flexTimer_pwm1_PwmConfig);}/* SW3 press */if(SW3_Press_Flag){SW3_Press_Flag = 0;printf("SW3 press!\r\n");/* decrement phase counter, counter-clockwise */NSD8381drv_CTRL2_Dir(counter_clockwise);/* Hold mode -> Run mode */NSD8381drv_HOLDM_En(DISABLE);/* FTM2 CH5 use PWM mode,freq:200Hz */FTM_DRV_InitPwm(INST_FLEXTIMER_PWM1, &flexTimer_pwm1_PwmConfig);}}
关于其中几个函数的实现,如下所示:
/* read phase counter */
uint32_t NSD8381drv_GetPH(void)
{uint32_t Rsult;CONFIG3Reg[0] = (uint8_t)(0x85U);Parity_check(CONFIG3Reg);SPI_Send(CONFIG3Reg, StatReg_Result);StatReg_Result[2] &= 0x7F;Result = (uint32_t)(StatReg_Result[2] >> 1);return Result;
}/*set NSD8381 CONFIG_3 HOLD_EN bits*/
void NSD8381drv_HOLDM_En(FunctionalState_TypeDef EN)
{if(EN==ENABLE){CONFIG3Reg[1]|=NSD8381_HOLDM; //0x40}else{CONFIG3Reg[1]&=(uint8_t)(~NSD8381_HOLDM);}CONFIG3Reg[0] = (uint8_t)(0x05U);CONFIG3Reg[2]&=(uint8_t)(0xFE);Parity_check(CONFIG3Reg);SPI_Send(CONFIG3Reg, CtrlReg_Result);
}/* set NSD8381 CTRL2 pin level when used for dir status* 0: Increment phase counter, clockwise* 1: decrement phase counter, counter-clockwise* */
void NSD8381drv_CTRL2_Dir(DirStatus_TypeDef EN)
{PINS_DRV_WritePin(NSD8381_CTRL2_PORT, NSD8381_CTRL2_PIN, EN);
}
4.测试验证
4.1 测试环境
整个测试的环境如下图:

4.2 测试效果
实际的测试效果如下视频,
- 当按下SW2时,阀门完全关闭,此时注入水不会流出;
- 接着按下SW3,阀门完全打开,注入水会加速流出。
NSD8381驱动电子膨胀阀
4.3 测试记录
实际测试时串口打印的数据如下图,
- 第一个操作的寄存器的高8bit返回值为0x40,因为有reset事件;如果第一个操作的寄存器高8bit返回值为0x00,可能是NSD8381还没初始化完成,建议在EN引脚拉高后,延迟200us再发送SPI命令给NSD8381。
- 当PWM计数为4时,对应的PH[5:0]为0x32,即0b100000,和相序表一致,说明处于1/2微步模式。
- 使用250Hz的PWM波,也可以正常驱动该电磁阀,说明该电机兼容性比参数表更好。
- 使用HOLD模式时的电流远小于RUN模式,有助于降低NSD8381的功耗。

相关文章:
【技术支持案例】使用S32K144+NSD8381驱动电子膨胀阀
文章目录 1. 前言2. 问题描述3. 理论分析3.1 NSD8381如何连接电机3.2 S32K144和NSD8381的软件配置 4.测试验证4.1 测试环境4.2 测试效果4.3 测试记录 1. 前言 最近有客户在使用S32K144NSD8381驱动电子膨胀阀时,遇到无法正常驱动电子膨胀阀的情况。因为笔者也是刚开…...
第二期:集成电路(IC)——智能世界的微观建筑大师
嘿,小伙伴们!👋 我是你们的老朋友小竹笋,一名热爱创作和技术的工程师。上一期我们聊了聊AI芯片,这次我们要深入到更微观的层面,来探究集成电路(IC)的世界。准备好一起探索了吗&#…...
基于物联网的区块链算力网络,IGP/BGP协议
目录 基于物联网的区块链算力网络 IGP/BGP协议 IGP(内部网关协议) BGP(边界网关协议) 内部使用ISP的外部使用BGP的原因 一、网络规模和复杂性 二、路由协议的特性 三、满足业务需求 四、结论 基于物联网的区块链算力网络 通 过 多个物联网传感器将本地计算…...
每日一题~960 div2 A+B+C(简单奇偶博弈,构造,观察性质算贡献)
A题意: N 长的数组。 一次操作: 最开始的mx 为零。 选出一个数(使得这个数>mx) ,之后将mx 更新为这个数,将这个数置为零。 不能做这个操作的,输。 问是否有先手赢的策略。有的话,输出yes 否则no 当时一…...
音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程
音视频入门基础:H.264专题系列文章: 音视频入门基础:H.264专题(1)——H.264官方文档下载 音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...
Aboboo一些操作
常用快捷键⌨ 快捷键/操作方式 功能 鼠标中键/Esc 进入/退出全屏 空格/Tab 暂停/恢复播放 左/右箭头 快退/快进 Ctrl-左/右箭头 30秒快退/快进 Alt-左/右箭头 60秒快退/快进 Ctrl-Alt-左/右箭头 播放速率调节 PageUp/PageDown 上一句/下一句 上下箭头/滚轮 …...
获取行号LineNumberReader
(每日持续更新)jdk api之LineNumberReader基础、应用、实战-CSDN博客...
python数据结构与算法
0.时间复杂度和空间复杂度 快速判断算法时间复杂度:算法运行时间 1.确定问题规模n 2.循环减半 logn 3.k层关于n的循环 n^k 空间复杂度:评估算法内存占用大小 使用几个变量 O(1) 使用长度为n的一维列表 O(n)…...
大数据学习之Flink基础(补充)
Flink基础 1、系统时间与事件时间 系统时间(处理时间) 在Sparksreaming的任务计算时,使用的是系统时间。 假设所用窗口为滚动窗口,大小为5分钟。那么每五分钟,都会对接收的数据进行提交任务. 但是,这里有…...
C++基础语法:友元
前言 "打牢基础,万事不愁" .C的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结. 以<C Prime Plus> 6th Edition(以下称"本书")的内容开展学习 引入 友元提供了一种特别的方式,访问对象私有数据. 友元有三…...
【大模型系列】Video-LaVIT(2024.06)
Paper:https://arxiv.org/abs/2402.03161Github:https://video-lavit.github.io/Title:Video-LaVIT: Unified Video-Language Pre-training with Decoupled Visual-Motional TokenizationAuthor:Yang Jin, 北大&#x…...
【总结】nacos作为注册中心-应用启动失败:NacosDiscoveryProperties{serverAddr=‘127.0.0.1:8848‘……
问题现象 启动springboot应用时报错,能够读取到nacos配置,但是使用nacos作为注册中心,应用注册到nacos失败。 应用配置bootstrap.properties如下: # 应用编码,安装时替换变量 spring.application.namedata-center #…...
C语言——数组和排序
C语言——数组和排序 数组数组的概念数组的初始化数组的特点 排序选择排序冒泡排序插入排序 二分查找 数组 数组的概念 数组是一组数据 ; 数组是一组相同类型的数据或变量的集合 ; 应用场景: 用于批量的处理多个数据 ; 语法&…...
QEMU 新增QMPHMP指令【原文阅读】
文章目录 0x0 QEMU原文0x10x11 How to write monitor commands0x12 Overview0x13 Testing 0x20x21 Writing a simple command: hello-world0x22 Arguments 0x30x31 Implementing the HMP command 0x40x41 Writing more complex commands0x42 Modelling data in QAPI0x43 User D…...
【Linux】全志Tina配置屏幕时钟的方法
一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\device\config\chips\c200s\configs\F1C200s\sys_config.fex 二、文件内容 三、介绍 在此处可以修改屏幕的频率,当前为21MHz。 四、总结 注意选择对应的屏幕的参数,sdk所支持的屏幕信息都在此文件夹中…...
探索WebKit的CSS表格布局:打造灵活的网页数据展示
探索WebKit的CSS表格布局:打造灵活的网页数据展示 CSS表格布局是一种在网页上展示数据的强大方式,它允许开发者使用CSS来创建类似于传统HTML表格的布局。WebKit作为许多流行浏览器的渲染引擎,提供了对CSS表格布局的全面支持。本文将深入探讨…...
信号的运算
信号实现运算,首先要明确,电路此时为负反馈电路,当处于深度负反馈时,可直接使用虚短虚断。负反馈相关内容可见:放大电路中的反馈_基极反馈-CSDN博客https://blog.csdn.net/qq_63796876/article/details/140438759 一、…...
Vue3知识点汇总
创建项目 npm init vuelatest // npm create vitelatestVue文件结构 <!-- 开关:经过语法糖的封装,容许在script中书写组合式API --> <!-- setup在beforeCreate钩子之前自动执行 --> <script setup><!-- 不再要求唯一根元素 -->…...
C++设计模式--单例模式
单例模式的学习笔记 单例模式是为了:在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性 参见链接1,链接2 #include <iostream> #include <mutex>using namespace std;/*懒汉模式:只有在…...
数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命
1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台,旨在为电商平台提供深度的数据洞察和业务分析。技术层面,项目涵盖了从基础架构搭建到大数据技术组件的集成,采用了湖仓一体的设计理念,实现了数据仓库与数据湖的有…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)
经过前面几期的内容我们学习了很多网络安全的知识,而这期内容就涉及到了前面的第六期-RCE模块,第七期-File inclusion模块,第八期-Unsafe Filedownload模块。 什么是"遍历"呢:对学过一些开发语言的朋友来说应该知道&…...
