Автор работы: Пользователь скрыл имя, 24 Января 2011 в 16:58, дипломная работа
Целью дипломной работы является применение методов цифровой обработки сигналов при диагностирования двигателя. Диагностирование двигателя заключается в анализе и обработке цифровых сигналов полученных с датчиков давления, вибрации и индуктивного датчика, определяющего положение коленчатого вала.
Для достижения цели дипломной работы были поставлены следующие задачи:
o Произвести обзор литературы по цифровой обработке сигналов, принципам и устройству дизельного двигателя
o Разработать методы диагностики с использованием цифровой обработки сигналов
o Получить цифровые сигналы с датчиков, установленных на исправные и неисправные танковые дизельные двигатели В-84, В-92
o Провести анализ и поиск способа обработки полученных цифровых сигналов
o Разработать алгоритм обработки цифровых сигналов с датчиков
o Получить результат диагностирования дизельных двигателей В-84, В-92
o Сделать выводы о проделанной работе.
Введение 3
Глава 1. Цифровая обработка сигнала 5
1.1 Понятие сигнала и его виды 5
1.2 Дискретное преобразование Фурье 9
1.3 Аналогово-цифровое и цифро-аналоговое преобразование 12
1.4 Цифровые фильтры 14
Глава 2. Цифровые методы диагностирования двигателя 18
2.1 Основные принципы и особенности работы дизельных двигателей 18
2.1.1 Воздушная система запуска двигателя 20
2.2 Метод вибродиагностики 22
2.3 Метод диагностирования цилиндропоршневой группы с использованием датчика давления 24
t:=YM[n4]-YM[n3];
YR[n3]:=r*u-t*v;
YM[n3]:=t*u+r*v;
YR[n4]:=p;
YM[n4]:=q;
i:=i+n1;
end;
w:=u*c-v*s;
v:=v*c+u*s;
u:=w;
end;
end;
j:=1;
for i:=1 to nSp-1 do
begin
if i<j then
begin
p:=YR[j];
q:=YM[j];
YR[j]:=YR[i];
YM[j]:=YM[i];
YR[i]:=p;
YM[i]:=q;
end;
k:=Trunc(nSp/2);
while k<j do
begin
j:=j-k;
k:=Trunc(k/2);
end;
j:=j+k;
end;
FY[1]:=YR[1]/nSp;
SP1[1]:=GGG; SP2[1]:=0; SP[1]:=GGG;
if FFT=1 then begin
for i:=2 to nSp do
begin
SP1[i]:=YR[i]*2;
SP2[i]:=YM[i]*2;
SP[i]:=Sqrt(SP1[i]*SP1[i]+
end;
end else begin
for i:=1 to nSp do FY[i]:=YR[i]/nSp+GGG;
end;
end;
Исходный текст программы. Процедуры обработки сигналов с датчиков.
//Процедура обработки данных с датчика оборотов
procedure TForm1.N4Click(Sender: TObject);
begin
close;
end;
procedure TForm1.N7Click(Sender: TObject);
var i,j,q,k,x, tmp,
oldmin, oldmax,
delta, deltat,
lmin,lmax,
Mmax,Mmin,Mnul, fmax,
window: integer;
flag: integer;
oborot: double;
Ex: array [1..100] of ArrEx1;
begin
j:=0;
oldmin:=0;
oldmax:=0;
lmin:=rAm[1];
lmax:=rAm[1];
fmax:=0;
Ex[1,1]:=1;
Ex[1,2]:=0;
// Нахождение максимумов и нулей сигнала для определения циклов двигателя
for q:=1 to 99 do
begin
Mmax:=rAm[17];
for i:=0 to cnt-1 do
begin
flag:=1;
for k:=1 to q do
begin
if ((i>=Ex[k,1]) and (i<=Ex[k,2])) then
begin
flag:=0;
break;
end;
end;
if flag=1 then
if rAm[i]>rAm[Mmax] then
begin
Mmax:=i;
end;
end; {cnt}
if fmax=0 then fmax:=Mmax;
flag:=0;
if rAm[Mmax]<rAm[fmax]*0.4 then flag:=1;
Data.Lines.Add('------------ '+IntToStr(q));
if flag=1 then break;
//Определение области данных из диапозона
for i:=Mmax to cnt-1 do
begin
if rAm[i]*rAm[i-1]<=0 then
begin
Mnul:=i;
Ex[q+1,2]:=Mmax+abs(2*(Mmax-
Ex[q+1,1]:=Mmax-abs(2*(Mmax-
ArrNul[q+1]:=Mnul;
break;
end;
end;
end; {q}
ArrNulCnt:=q;
//Сортировка массива нулей сигнала
while (flag=1) do
begin
flag:=0;
for j:=2 to q-1 do
begin
if ArrNul[j] > ArrNul[j+1] then
begin
tmp:=ArrNul[j]; ArrNul[j]:=ArrNul[j+1]; ArrNul[j+1]:=tmp;
flag:=1;
end;
end;
end;
//
Определение количества
for j:=2 to q do
begin
Data.Lines.Add('Sorted_ArrNul '+IntToStr(ArrNul[j]));
oborot:=2*(9000*60)/abs(
Data.Lines.Add('обороты об мин '+FloatToStr(oborot));
end;
end;
// Процедура обработки цифровых сигналов с датчика давления и вибрации
procedure TForm1.N9Click(Sender: TObject);
var LocalCnt,MaxP,MinP,i,j,n,
:integer;
point1x,point1y,
point2x,point2y,b,k:double;
pointX,pointY: Array [1..2] of double;
ArrNulP: Array [1..10000] of integer;
ArrP,ArrMinD,ArrMaxD: Array [1..100] of integer;
tf:textFile;
begin
n:=1;
oldn:=2;
x:=1;
for j:=2 to ArrNulCnt-1 do
begin
LocalCnt:=abs(ArrNul[j]-
MaxP:=ArrNul[j];
MinP:=ArrNul[j];
for i:=ArrNul[j] to ArrNul[j]+(2*LocalCnt div 12) do
begin
if pAm[MaxP]<pAm[i] then MaxP:=i;
if pAm[MinP]>pAm[i] then MinP:=i;
end;
point1y:=(pAm[MaxP]+pAm[MinP])
point1x:=(MaxP+MinP)/2;
MaxP:=ArrNul[j+1];
MinP:=ArrNul[j+1];
for i:=ArrNul[j+1]-(2*LocalCnt div 12) to ArrNul[j+1] do
begin
if pAm[MaxP]<pAm[i] then MaxP:=i;
if pAm[MinP]>pAm[i] then MinP:=i;
end;
point2y:=(pAm[MaxP]+pAm[MinP])
point2x:=(MaxP+MinP)/2;
b:=((point2y*point1x)-(
k:=(point1y-b)/point1x;
series5.addxy(ArrNul[j],(k*
series5.addxy(ArrNul[j+1],(k*
for i:=ArrNul[j] to ArrNul[j+1] do
begin
if ((pAm[i]-((k*i)+b))*(pAm[i+1]-
begin
ArrNulP[n]:=i;
n:=n+1;
end;
end;
range:=abs(ArrNul[j+1]-ArrNul[
Data.Lines.Add('n= '+IntToStr(n));
d1:=1;
d2:=1;
for q:=oldn-1 to n-1 do
begin
if abs(ArrNulP[q-1]-ArrNulP[q])>=
begin
Data.Lines.Add('diapozon '+IntToStr(ArrNulP[q-1])+' '+IntToStr(ArrNulP[q]));
ArrP[x]:=ArrNulP[q]; //filtered null
if x>1 then
begin
Data.Lines.Add('znak '+FloatToStr(pAm[ArrP[x-1]+2]-
if pAm[ArrP[x-1]+range-1]-(k*(
begin
end
else
begin
end;
end;
x:=x+1;
end; //if range
end; //for q
oldn:=n;
end;
{j}
Информация о работе Применение методов цифровой обработки сигналов при диагностировании двигателей