Применение методов цифровой обработки сигналов при диагностировании двигателей

Автор работы: Пользователь скрыл имя, 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

Работа состоит из  1 файл

Диплом.doc

— 905.50 Кб (Скачать документ)

          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]+SP2[i]*SP2[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-Mnul));

              Ex[q+1,1]:=Mmax-abs(2*(Mmax-Mnul));

              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(ArrNul[j+1]-ArrNul[j]);

          Data.Lines.Add('обороты об мин '+FloatToStr(oborot));

        end;

end; 

// Процедура обработки цифровых сигналов с датчика давления и вибрации

procedure TForm1.N9Click(Sender: TObject);

var LocalCnt,MaxP,MinP,i,j,n,range,x,q,oldn,s,d1,d2,MaxD,MinD

      :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]-ArrNul[j+1]); 

          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])/2;

          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])/2;

          point2x:=(MaxP+MinP)/2;

          b:=((point2y*point1x)-(point1y*point2x))/(point1x-point2x);

          k:=(point1y-b)/point1x;

          series5.addxy(ArrNul[j],(k*ArrNul[j])+b);

          series5.addxy(ArrNul[j+1],(k*ArrNul[j+1])+b);

          for i:=ArrNul[j] to ArrNul[j+1] do

          begin

            if ((pAm[i]-((k*i)+b))*(pAm[i+1]-((k*(i+1))+b)))<=0 then

              begin

                ArrNulP[n]:=i;

                n:=n+1;

              end;

          end;

          range:=abs(ArrNul[j+1]-ArrNul[j]) div (12*2*2*2);

          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])>=range then

                  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]-(k*(ArrP[x-1]+2)+b)));

                            if  pAm[ArrP[x-1]+range-1]-(k*(ArrP[x-1]+range-1)+b)>0 then

                              begin

                                MaxD:=ArrP[x-1]+range-1;   //-(k*(ArrP[x-1]+2)+b)

                                for s:=ArrP[x-1] to ArrP[x] do

                                  if pAm[s]>pAm[MaxD] then MaxD:=s;

                                ArrMaxD[d1]:=MaxD;

                                series4.AddXY(MaxD,pAm[MaxD]);

                                d1:=d1+1;

                              end

                            else

                              begin

                                MinD:=ArrP[x-1]+range-1;

                                for s:=ArrP[x-1] to ArrP[x] do

                                  if pAm[s]<pAm[MinD] then MinD:=s;

                                ArrMinD[d2]:=MinD;

                                series4.AddXY(MinD,pAm[MinD]);

                                d2:=d2+1;

                              end;

                        end;      

                    x:=x+1;

                  end; //if range

            end; //for q

          oldn:=n;

      end; {j} 
 
 
 
 
 
 
 
 
 
 
 
 

Информация о работе Применение методов цифровой обработки сигналов при диагностировании двигателей