„Matlab függvény: Bode-diagram mérő” változatai közötti eltérés

A Fizipedia wikiből
(Új oldal, tartalma: „A méréshez használja a BODE_meas2 függvényt, melyet megtalál a PC-n!”)
 
 
(egy szerkesztő 4 közbeeső változata nincs mutatva)
1. sor: 1. sor:
A méréshez használja a BODE_meas2 függvényt, melyet megtalál a PC-n!
+
==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 [[Matlab függvény: szinuszjelek illesztése harmonikus rezgésekhez|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

A lap jelenlegi, 2022. november 2., 12:02-kori változata

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