Matlab függvény: Bode-diagram mérő

A Fizipedia wikiből
A lap korábbi változatát látod, amilyen Balogh (vitalap | szerkesztései) 2022. november 2., 11:02-kor történt szerkesztése után volt.

(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

Segítség egy egyszerű függvény elkészítéséhez

Ebben a részben szövegesen nyújtunk segítséget a függvény elkészítéséhez. Gyakorlásként célszerű saját ötlet, vagy a lenti segítség alapján elkészíteni a megfelelő függvényt. Ha ez nem kivitelezhető (túlmutat a gyakorlat idején, nincs megfelelő Matlab tapasztalat), akkor a következő fejezetben egy konkrét példát talál a függvényre, melyet használni is tud a mérés során. FIGYELEM A lenti példa függvény jelentős része az ábrázoláshoz kapcsolódik, ami így bonyolultabbnak tűnhet, mint a gyakorlat elvégzéséhez szükséges funkcionalitású függvény. A saját készítésű függvény esetén az ábrázolás lényegesen egyszerűbben is megoldható

A mérés elve:

A Bode-diagram kiméréséhez különböző frekvenciájú szinuszjelekkel való meghajtás mellett kell mérni a kimeneti (adott áramköri elemen eső) feszültséget, majd meghatározni a kimeneti és bemeneti jel amplitúdójának arányát és fáziskülönbségét.

A feladat lépései:

  • Magát a mérést a myDAQ_sin_rw(f,N) függvénnyel tudja elvégezni, mely N periódusnyi f frekvenciájú jelet ad ki az AO0 kimeneten és elvégzi az AI0 és AI1 bemenetek visszaolvasását, így ideális esetben két szinuszjelet ad vissza az időalappal együtt. (Bővebb infók a függvényről a mérési leiratban olvashatók.)
  • A mérésben kapott szinuszjelek amplitúdóját 1-1 szinusz illesztzésével célszerű meghatározni, melyhez a fit() függvényt tudja használni. További segítségként a két szinuszjel egyidejű illesztésére használhatja az előre elkészített fit_sins() függvényt is, melyről itt talál leírást.
  • Az illesztette görbék amplitúdójából (és fázisából) már ki tudja számítani az adott frekvenciához tartozó be/kimeneti amplitúdó arányt (illetve a fáziskülönbséget).
  • Ha a fentieket végrehajtotta, akkor még csak egy frekvenciához tartozó átviteli érték (és fáziskülönbség) került megmérésre, így a fenti lépéseket meg kell ismételni több frekvenciára is. Ehhez célszerű definiálni egy M hosszú vektort a kívánt M db frekvencia értékkel és ezen végiglépkedni egy for ciklussal. Ekkor az eredményeket is egy-egy M hosszúságú vektorban érdemes tárolni.
  • Ha a mérés elkészült minden frekvenciaértékre, akkor az átviteli görbét a frekvencia függvényében log-log skálán érdemes ábrázolni.
  • Fontos technikai információ, hogy az optimális méréshez érdemes 100-1000 periódusnyi szinuszjeleket mérni nagyobb frekvenciák esetén. Azonban kisebb frekvenciáknál ez már indokolatlanul hosszú mérési időt eredményezne, így 1-10Hz tartományban kevesebb periódus mérése is elég, itt érdemes betenni egy feltételt a mérés maximális idejére.

A megfelelő függvény egy lehetséges megvalósítása ábrázolással együtt

Az alábbi függvénnyel megvalósítható a Bode-diagram mérése, melyet ábrázol is a mérés közben az egyes frekvenciáknál mért és illesztett jelekkel együtt. A függvény bemenetként egyetlen vektort vár, mely a frekvenciaértékeket tartalmazza Hz-ben. A függvény végigfut a frekvenciaértékeket tartalmazó vektoron, elsőként megvizsgálja, hogy az adott frekvenciára 100 periódus idő nagyobb-e, mint 2s. Ha igen, akkor a periódusok számát úgy állítja be, hogy a egy mérés 2s körüli legyen, különben 100 periódust mér. Utána elbégzi a mérést a myDAQ_sin_rw() függvény segítségével és a kapott jelekre megcsinálja az illesztést a fit_sins() függvénnyek. Az eredményeket a 99-es ábrán ábrázolja a Bode-diagrammal együtt. A függvény a következő kimeneteket adja vissza:

  • transm - Az AI1 és AI0 bemeneteken mért jelekre illesztett szinuszjelek amplitúdójának hányadosa
  • phase_diff - Az AI1 és AI0 bemeneteken mért jelekre illesztett szinuszjelek fázisának különbsége [rad]
  • A_ch0 - Az AI0 bemeneten mért jelre illesztett szinuszjel amplitúdója [V]
  • A_ch1 - Az AI1 bemeneten mért jelre illesztett szinuszjel amplitúdója [V]
  • phi_ch0 - Az AI0 bemeneten mért jelre illesztett szinuszjel fázisa [rad]
  • phi_ch1 - Az AI1 bemeneten mért jelre illesztett szinuszjel fázisa [rad]

A függvény Matlab kódja

A függvény megtalálható a laboros notebook-okon!

   function [transm, phase_diff,A_ch0,A_ch1,phi_ch0,phi_ch1]=BODE_meas2(fq_steps)
       for i=1:length(fq_steps)
           if(100/fq_steps(i)>2)
               N=round(2*fq_steps(i));
           else
               N=100;
           end
           [t,out,ch0,ch1]=myDAQ_sin_rw(fq_steps(i),N,1);
           [A0,f0,phi0,A1,f1,phi1,A_ratio,phi_diff]=fit_sins(t,ch0,ch1);
           f99=figure(99);
           f99.Position(1:4)=[480 100 960 600];
           subplot(3,2,[1,2]);
           plot(t,ch0,'LineWidth',2)
           hold on
           plot(t,ch1,'LineWidth',2)
           xlim([t(1),t(1)+5/fq_steps(i)]);
           title(num2str(fq_steps(i))+"Hz")
           xlabel("time [s]")
           ylabel("Voltage [V]")
           legend("ch0","ch1")
           hold off
           A_ch0(i)=A0;
           A_ch1(i)=A1;
           phi_ch0(i)=phi0;
           phi_ch1(i)=phi1;
           transm(i)=A_ratio;
           phase_diff(i)=phi_diff;
           figure(99)
           subplot(3,2,3);
           plot(t,ch0(:),'LineWidth',3)
           hold on
           plot(t,A0*sin(2*pi*f0*t+phi0),'k')
           xlim([t(1),t(1)+5*(1/fq_steps(i))]);
           title("ch0 measured signal and fit")
           xlabel("time [s]")
           ylabel("Voltage [V]")
           legend("ch0","fit")
           hold off
           figure(99)
           subplot(3,2,4);
           plot(t,ch1(:),'LineWidth',3,'Color','red')
           hold on
           plot(t,A1*sin(2*pi*f1*t+phi1),'k')
           xlim([t(1),t(1)+5*(1/fq_steps(i))]);
           title("ch1 measured signal and fit")
           xlabel("time [s]")
           ylabel("Voltage [V]")
           legend("ch1","fit")
           hold off
           figure(99)
           subplot(3,2,[5,6]);
           loglog(fq_steps(1:i),transm,'LineWidth',2)
           title("Transmission vs frequency")
           xlabel("f [Hz]]")
           ylabel("V_{out}/V_{in}")
           pause(1)
       end
   end