主要内容

生活原则估计使用ThingSpeak伺服齿轮火车

这个例子展示了如何估算剩余寿命(原则)伺服电机齿轮系通过伺服电机的实时流数据的样子ThingSpeak数据采集系统,从ThingSpeak原则评估引擎运行在MATLAB。

电机电流特征分析(MCSA)的电流信号驱动一个爱好伺服电机用于提取频域(光谱)特性从几个感兴趣的频率区域表明电动机和齿轮火车的缺点。使用的组合特性构建一个健康指示器(嗨)随后的荷重软化估计。

MCSA故障的诊断是一个有用的方法,引起转矩和速度波动的伺服齿轮火车,进而导致相关电机电流的变化。MCSA已被证明是理想的电动机故障分析只需要电机电流信号进行分析,而不需要额外的硬件和昂贵的感应。齿轮故障检测使用传统振动传感器是具有挑战性的,尤其是在这种情况下,齿轮火车不方便的仪器或其他振动的加速度传感器。

这个例子演示了如何构建一个实时数据流,特征提取,和荷重软化评估系统使用简单,现成的组件适合教育实验室练习或工业应用的原型。没有硬件中运行这个例子,使用sendSyntheticFeaturesToThingSpeak函数来生成合成数据。

简化工作流构建数据流系统和荷重软化估计发动机包括以下步骤:

  1. 开发的硬件使用现成的组件和数据采集系统。

  2. 从单片机实时数据流像一个Arduino UNO MATLAB。

  3. 在MATLAB处理实时数据提取特征并使用ThingSpeak流到云的特性。

  4. 云数据流的荷重软化估计,在MATLAB可视化引擎。

硬件设置和数据采集

硬件概述

对于这个示例,电流数据收集从一个标准的双叶S3003爱好伺服,这是修改后的连续旋转。伺服系统的高速转换内部直流电机的高转矩输出轴。为了达到这个目标,伺服系统由直流电机,一套尼龙或金属齿轮配对,和控制电路。控制电路被能够施加一个恒定的5 v电压的直流电机直接并允许当前通过要监视的直流电机电流感应电阻。

第二,反对伺服直流电机终端通过低值电阻分流的一起被用来生成一个高扭矩反对负载的驱动伺服加速齿轮系的退化和诱导大MCSA分析电机电流信号的变化。

伺服电机和齿轮火车

叶S3003伺服由四对啮合尼龙齿轮如下图所示。直流电机轴上的小齿轮P1与塔齿轮G1网格。小齿轮P2是塑造了齿轮的一部分G1和网格加强齿轮G2。小齿轮P3,齿轮G2的模制品,与塔齿轮G3网格。齿轮P4,塑造G3,网格的最后附加到输出轴齿轮G4。阶式齿轮组G1和P2, G3 G2和P3和P4旋转的齿轮都是免费的 - - - - - - 也就是说,他们不是固定在各自的轴。齿轮的集合提供了一个减少278:1从电动机转速为6117 rpm时约22在输出轴转速5伏特的直流电机驱动。

下表概述了牙数和理论价值的输出速度,齿轮啮合频率,和累积在每个齿轮啮合齿轮减速。

的输出轴的旋转速度伺服用红外线测量photointerrupter连同一个直径40毫米,3 d印刷转速器轮16插槽。车轮上的16插槽是等距的,红外photointerrupter被这样有十六个脉冲每轮的旋转。伺服系统和photointerrupter举行在3 d印刷坐骑。

驱动直流电机驱动以恒定5伏,和四双提供278:1减速齿轮,输出轴转速平均22 rpm的价值。输出的波动速度和相应的电机电流的变化由于齿轮啮合,齿轮牙恶化随着时间的推移,在MATLAB被传感器进行进一步分析。

过滤和放大电路

通过直流电机绕组电流消耗使用欧姆定律计算通过测量的电压降0.5欧姆,0.5 W电阻器。因为当前测量值的变化太小了高质量检测、电流信号放大20倍使用单电源放大器(模拟设备AD22050N)传感器接口。放大电流信号然后过滤使用反锯齿基于椭圆低通滤波器(箴言MAX7408)平滑,消除噪声,然后再把它传递给一个模拟-数字转换器(ADC) Arduino UNO销。抗混叠滤波器的转角频率放置在470赫兹提供足够的衰减在奈奎斯特频率的模拟-数字转换器(750赫兹)。

电子电路实现了一个原型印刷电路板(PCB)使用少量的额外被动组件,如下图所示。

如下流程图所示,Arduino UNO采样电流信号通过ADC输入采样频率在1500赫兹和流到电脑,随着转速计脉冲,通过一个串行通信通道达到250000个基点的波特率。

的数据在这个例子中,串行信号编码的Arduino UNO每数据样本三个8位二进制值(当前+转速器)来提高计算机的串行通信效率。

实时数据流

流数据从Arduino UNO MATLAB

Arduino UNO电动机电流和转速计脉冲值编码成二进制缓冲效率和批次的数据发送到计算机组成的16384(2 ^ 14)样品每5分钟。数据被从Arduino UNO 1500 Hz的速度使用一个简单的数据协议组成的开始和结束标记的数据字节,以方便提取数据批次在MATLAB代码。

参阅附上的Arduino素描文件servo_data_producer.ino更多信息和数据流MATLAB从你的硬件设置。

在MATLAB接收实时数据流

您可以使用MATLAB脚本获取批量Arduino UNO的串行数据与相应的波特率和串行COM端口号码。

首先,打开串口通信和Arduino或同等的硬件。您可以使用serialportlist命令来找到串行COM端口。对于这个示例,Arduino UNOCOM4为。使用250000个基点的波特率。

端口=“COM4为”;波特率= 250000;

设置一个合适的超时和使用正确的数据终结者Arduino的代码包含在文件中servo_data_producer.ino。对于这个示例,使用超时6分钟。然后,清除串口缓冲区使用冲洗

s =串口(端口、波特率、“超时”,360);configureTerminator(年代,“CR / LF”);冲洗(年代);

现在,阅读和处理编码数据流从Arduino一个适当的阅读的循环次数。对于这个示例,使用10读周期。更多细节,请参见支持功能金宝appreadServoDataFromArduino提供的金宝app支持功能部分。

数= 0;countMax = 10;(数< countMax)试一试数=计数+ 1;流(“数据集\ nWaiting # % d…\ n”数);readServoDataFromArduino(年代);e%报告任何错误。清晰的年代;把(e);结束结束

现在,使用清晰的命令来关闭串口。

清晰的年代;

在MATLAB数据处理和特征提取

实时流数据处理

一旦涌入MATLAB数据,您可以使用readServoDataFromArduino脚本构建一个数据矩阵存储伺服电机的最新一批数据。更多细节,请参见支持功能金宝appreadServoDataFromArduino提供的金宝app支持功能部分。

readServoDataFromArduino (s)

合成的时间表包含时间戳,电机电流,转速计脉冲值从Arduino UNO最新的数据流。

使用processServoData函数输出一个时间表有关物理单位。

T = processServoData (X)

由此产生的时间表提供了一个方便的容器从电机数据提取的预测功能。

如果你没有必要的硬件,您可以运行这个示例使用sendSyntheticFeaturesToThingSpeak函数来生成合成数据。

特征提取

从每一个新的数据集,计算额定速度检测频率的兴趣轮系和匹配他们正确频率的功率谱。

F = extractFeaturesFromData (T);

使用采样频率1500赫兹的价值tachorpm命令,输出轴的计算额定速度。对于这个实例,RPM值是常数约22 RPM。

tP = T.TachoPulse;rpm = tachorpm (tP、Fs、“PulsesPerRev”,16岁,“FitType”,“线性”);rpm =意味着(rpm);

电动机转速以及齿轮组的物理参数,支持故障频带的建设,这是一个重要的先决条件计算光谱指标。使用驱动器的牙数齿轮轮系和名义rpm,首先计算感兴趣的频率。感兴趣的频率是赫兹的实际输出速度值,其值是接近理论值列在下表中。

接下来,构建所有的频带输出速度包括以下感兴趣的频率faultBands命令。选择的基本频率、谐波和显然将在更多的细节讨论分析轮系数据和提取光谱特性使用动态编辑任务的例子。特别是重要的故障频率监测在伺服系统中被确认如下:

  • 前六次谐波的FS1 0:1 FS2显然

  • 1日,2日和4日谐波的FS2 0:1显然FS3

  • 第3谐波FS3

%的齿轮和小齿轮的牙齿。G4 = 41;G3 = 35;G2 = 50;G1 = 62;P4 = 16;P3 = 10;P2 = 10;P1 = 10;在赫兹%轴速度。FS5 = rpm / 60;FS4 = G4 / P4 * FS5;FS3 = G3 / P3 * FS4;FS2 = G2 / P2 * FS3;FS1 = G1 / P1 * FS2;%产生感兴趣的断层带。FS2 FB_S1 = faultBands (FS1、1:6, 0:1);FB_S2 = faultBands ([1 2 4], FS2 FS3, 0:1);FB_S3 = faultBands (FS3 3);FB = [FB_S1;FB_S2;FB_S3];

使用faultBandMetrics命令与功率谱密度(pwelch命令)电机的电流信号来计算85光谱指标。

电动机的功率谱计算当前数据。

mC = T.MotorCurrent;[ps, f] = pwelch (mC,[][],长度(mC), Fs);

计算所有断层带的光谱指标。

指标= faultBandMetrics (ps, f, FB);指标=指标{:[4 13 85]};%选择重要的指标。

选择特征跟踪的指标计算。选择一些重要的如光谱的峰值振幅的第一次和第二次谐波轴1速度(FS1)。

特点=(指标,意味着(mC), rpm);

注意,rpm的平均电机电流和平均速度的运动也记录为附加功能。

实时数据流和荷重软化评估

在云存储特性数据

一旦各种特性计算实时数据的批次每5分钟,送到ThingSpeak作为云存储相同的MATLAB脚本的一部分和剩余使用寿命分析。

特征值发送到ThingSpeak通道作为单独的领域使用sendFeaturesToThingSpeak函数。

sendFeaturesToThingSpeak(特性)

这里的一个例子ThingSpeak通道配置的字段来存储特性值。频道作为一个方便的数据存储库和可视化平台。

ThingSpeak通道提供了一个实时特性监视仪表板跟踪特性的变化值。它还充当数据源等功能处理剩余寿命估计。

如果你没有硬件设置生成特性的伺服电机,可以生成合成特性值说明后续的计算原则估计使用以下代码示例。你可以有单独的MATLAB的实例运行在不同的机器上ThingSpeak读写数据。

hasArduino = false;%使用Arduino UNO时设置为true。如果~ hasArduino%设置定时器发送新特性数据的每一分钟。tmr1 =计时器(“ExecutionMode”,“fixedSpacing”,“时间”、60);tmr1。TimerFcn = @ (~ ~) sendSyntheticFeaturesToThingSpeak ();tmr1.start ();返回;结束

从云读取特性数据

一个单独的MATLAB脚本,也可以作为编制MATLAB应用程序部署或部署Web应用程序,可以用来阅读从ThingSpeak伺服电机的特性和计算荷重软化指标的实时估计。对于这个实例,构造一个初始指数退化模型和定期更新模型作为新特性值。

%设置定时器来检查新数据和更新每一分钟荷重软化模型,mdl。tmr2 =计时器(“ExecutionMode”,“fixedSpacing”,“时间”、60);tmr2。TimerFcn = @ (~ ~) readFeaturesFromThingSpeak (mdl, channelID readKey);tmr2.start ();

每一组新的功能是用于更新指数退化模型和计算原则的实时估计。

住剩余使用寿命的评估

对于这个示例,假设训练数据不是历史数据,而是实时观察组件的状况被计算在前面的步骤的特性。一个指数退化模型(exponentialDegradationModel原则)是适合这种类型的实时估计和可视化。荷重软化模型使用一个健康指数来表示系统的系统和一个阈值来估计系统的原则。对于这个示例,上的阈值总带功率伺服电机的特性在前面的步骤中计算。总带功率捕获断层带内的频谱能量的变化频率与重要的相关频率区域的伺服电机齿轮火车。

构建指数退化模型与一个任意的先验分布数据和指定的噪声方差。

指定寿命和数据变量名的观测数据的一个子集数据表从ThingSpeak读取。然后,使用每个特性值来预测组件的荷重软化使用当前生命时间价值存储在模型中。

channelID = 1313749;%替代通道ID来写数据。readKey =“KYIDUZ1ENDT3TGG0”;%替代阅读API密匙的通道。%从ThingSpeak读取最近的退化数据。T = thingSpeakRead (channelID“ReadKey”readKey,“OutputFormat”,“时间表”);%构造指数使用总带功率作为退化模型%健康指数。mdl = exponentialDegradationModel (“θ”, 1“ThetaVariance”,100,“β”, 1“BetaVariance”,100,“NoiseVariance”,0.01,“LifeTimeVariable”,T.Properties.DimensionNames {1},“DataVariables”,T.Properties.VariableNames {3},“LifeTimeUnit”,“小时”);%设置定时器来检查新数据的每一分钟。tmr2 =计时器(“ExecutionMode”,“fixedSpacing”,“时间”、60);tmr2。TimerFcn = @ (~ ~) readFeaturesFromThingSpeak (mdl, channelID readKey);tmr2.start ();

MATLAB脚本追踪ThingSpeak通道上的特征数据和更新荷重软化模型作为新特性值,从而提供一个实时的荷重软化估计和可视化功能。

金宝app支持功能

支持函数金宝appreadServoDataFromArduino读取和处理从Arduino UNO编码数据流。

函数readServoDataFromArduino (s)%从Arduino读取和流程编码数据流。%找到编码数据流的开始。str = readline (s);N = sscanf (str,“开始:% d”);%预期数量的数据点(应该是16384年)。%获得新的数据到数据流。如果~ isempty (N) & & N > 0 X = 0 (N, 2);%读取和存储编码的二进制数据。disp (“阅读伺服电机数据……”);k = 1: N%每次读三个字节包含电动机电流和转速计脉冲值。1,x =[阅读(年代,“uint16”1)、阅读(年代,“uint8”));:X (k) =双(X);结束%找到编码数据流的结束。readline(年代);%将CR / LF从数据流。str = readline (s);如果str = =“结束”disp (“处理伺服数据…”);T = processServoData (X);disp (“提取特征…”);F = extractFeaturesFromData (T);disp (“发送功能ThingSpeak……”);sendFeaturesToThingSpeak (F);其他的错误(“错误从串口读取文件尾标志。”);结束结束结束

支持函数金宝appprocessServoData将原始数据矩阵转换为时间表以适当的变量名和物理单位。

函数T = processServoData (X)%将原始数据矩阵转换为以适当的变量名和时间表%的物理单元。Fs = 1500;%采样率。Rsens = 0.5;%在欧姆电流检测电阻的值。坎普= 20;%传感器放大器增益。count2volt = 5/1024;%比例因子之间的数字阅读模拟电压。T =时间表(“SampleRate”Fs);T。MotorCurrent = X (: 1) * count2volt /坎普/ Rsens * 1000;%转换为马。T。TachoPulse = X (:, 2);%开/关转速计脉冲值。T.Properties。VariableUnits = {“马”,“水平”};结束

支持函数金宝appextractFeaturesFromData从时域提取特征伺服电机数据表的格式。

函数特点= extractFeaturesFromData (T)%从时域提取8特性伺服数据表中提供%的格式。Fs = 1500;%采样率。%的平均运动速度。tP = T.TachoPulse;rpm = tachorpm (tP、Fs、“PulsesPerRev”,16岁,“FitType”,“线性”);rpm =意味着(rpm);%的齿轮和小齿轮的牙齿。G4 = 41;G3 = 35;G2 = 50;G1 = 62;P4 = 16;P3 = 10;P2 = 10;P1 = 10;在赫兹%轴速度。FS5 = rpm / 60;FS4 = G4 / P4 * FS5;FS3 = G3 / P3 * FS4;FS2 = G2 / P2 * FS3;FS1 = G1 / P1 * FS2;%产生感兴趣的断层带。FS2 FB_S1 = faultBands (FS1、1:6, 0:1);FB_S2 = faultBands ([1 2 4], FS2 FS3, 0:1);FB_S3 = faultBands (FS3 3);FB = [FB_S1;FB_S2;FB_S3];%计算电机当前数据的功率谱。mC = T.MotorCurrent;[ps, f] = pwelch (mC,[][],长度(mC), Fs);%计算光谱度量断层带。指标= faultBandMetrics (ps, f, FB);指标=指标{:[4 13 85]};%选择重要的指标。%选择跟踪特性。特点=(指标,意味着(mC), rpm);结束

支持函数金宝appsendFeaturesToThingSpeak将特征值发送给ThingSpeak通道作为单独的字段。

函数sendFeaturesToThingSpeak(特性)%将特征值发送给ThingSpeak通道作为单独的字段。%配置通道ID和写API键值。channelID = 1313749;%替换为您的频道ID写数据。writeKey =“X96MRW1TTZC1XNV3”;%替换为编写API密匙的通道。%写特性指定的频道“channelID”变量。字段= 1:元素个数(特性);% 8特性thingSpeakWrite (channelID特性,“字段”、字段“WriteKey”,writeKey);结束

支持函数金宝appreadFeaturesFromThingSpeak从ThingSpeak通道读取特性值随着新数据可用通过跟踪最新数据读数的时间戳。函数还更新荷重软化模型使用新特性值和情节原则预测的值。

函数readFeaturesFromThingSpeak (mdl channelID readKey)%从ThingSpeak读取特性值更新原则的评估。持续的时间戳持续的hplot如果isempty(时间戳)%开始持续十天的数据。时间戳= dateshift (datetime,“开始”,“天”,-10);结束%读最近的数据从所有字段。disp (“从ThingSpeak读取功能…”);T = thingSpeakRead (channelID“ReadKey”readKey,“OutputFormat”,“时间表”,“DateRange”,时间戳,datetime);如果~ isempty (T) T = T (T。时间戳>时间戳:);%只保留最近的数据。结束如果~ isempty (T) T = T (T。时间戳>时间戳:);%只保留最近的数据。时间戳= T.Timestamps(结束);%为最新数据更新时间戳。%设置原则退化阈值。阈值= 10;%的训练数据不是历史数据,而是实时观测%的伺服电机的特性。N =身高(T);estRUL =小时(0 (1,N));i = 1: N更新(mdl T(我,:))estRUL (i) = predictRUL (mdl阈值);结束随着时间的推移%可视化原则。如果isempty (hplot) | | ~ isvalid (hplot) hplot =情节(T.Timestamps (:)“estRUL,“r-o”);标题(“估计荷重软化时间t”)包含(“时间t”)ylabel (“估计原则”)其他的hplot。(hplot XData =。XData T.Timestamps (:));hplot。(hplot YData =。YData estRUL);结束结束结束

当伺服电机和Arduino UNO不是用于生成特征值,使用支持功能金宝appsendSyntheticFeaturesToThingSpeak提供合成特征数据来说明ThingSpeak流的特性值。

函数sendSyntheticFeaturesToThingSpeak ()%生成合成功能和发送他们ThinkSpeak。持续的bandPower如果isempty (bandPower) bandPower = 5;结束%模拟电动机特性和断层带指标。motorCurrent = 308 + 12 *兰德(1);马(308 320)%之间rpm = 20 + 3 *兰德(1);% 20[23]之间的rpmbandPower = bandPower +兰德(1)/ 2;% bandPower退化指标=[兰德(1),兰德(1)bandPower);特点=(指标、motorCurrent rpm);disp (“发送功能ThingSpeak……”);sendFeaturesToThingSpeak(特性)结束

另请参阅

||||

相关的话题