Matlab függvény: Bode-diagram mé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