Operácie

Generátor harmonického signálu: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
d quote fix
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
Riadok 3: Riadok 3:
== Zadanie ==
== Zadanie ==


Úlohou bolo generovať '''harmonický signál''' bez použitia funkcií '''sin()''' alebo """cos()""".   
Úlohou bolo generovať '''harmonický signál''' bez použitia funkcií '''sin()''' alebo '''cos()'''.   
Na tento účel bol použitý oscilátor realizovaný ako prenosová funkcia:
Na tento účel bol použitý oscilátor realizovaný ako prenosová funkcia:


Riadok 10: Riadok 10:
</syntaxhighlight>
</syntaxhighlight>


Zároveň bolo potrebné zmerať jeden bod """frekvenčnej charakteristiky""" systému:
Zároveň bolo potrebné zmerať jeden bod '''frekvenčnej charakteristiky''' systému:


<syntaxhighlight lang="">
<syntaxhighlight lang="">
Riadok 35: Riadok 35:
== Analýza a opis riešenia ==
== Analýza a opis riešenia ==


Cieľom riešenia je vytvoriť """sínusový signál""" bez použitia matematických funkcií """sin()""" alebo """cos()""".   
Cieľom riešenia je vytvoriť '''sínusový signál''' bez použitia matematických funkcií '''sin()''' alebo '''cos()'''.   
Tento problém sa rieši pomocou """diskrétneho oscilátora""", ktorý vychádza z diferenciálnej rovnice harmonického kmitania.
Tento problém sa rieši pomocou '''diskrétneho oscilátora''', ktorý vychádza z diferenciálnej rovnice harmonického kmitania.


Základom je rovnica:
Základom je rovnica:
Riadok 44: Riadok 44:
</syntaxhighlight>
</syntaxhighlight>


Táto rovnica popisuje """harmonické kmity""" a jej riešením sú funkcie <code>sin()</code> a <code>cos()</code>.
Táto rovnica popisuje '''harmonické kmity''' a jej riešením sú funkcie <code>sin()</code> a <code>cos()</code>.


=== Teoretický základ a odvodenia ===
=== Teoretický základ a odvodenia ===
Riadok 50: Riadok 50:
==== Laplaceova transformacia ====
==== Laplaceova transformacia ====


Vychádzajme z """prenosovej funkcie""" systému:
Vychádzajme z '''prenosovej funkcie''' systému:


<syntaxhighlight lang="">
<syntaxhighlight lang="">
Riadok 63: Riadok 63:
</syntaxhighlight>
</syntaxhighlight>


Použitím """inverznej Laplaceovej transformácie""" dostaneme:
Použitím '''inverznej Laplaceovej transformácie''' dostaneme:


<syntaxhighlight lang="">
<syntaxhighlight lang="">
Riadok 71: Riadok 71:
==== Diskretizácia ====
==== Diskretizácia ====


Mikrokontrolér pracuje v """diskrétnom čase""".
Mikrokontrolér pracuje v '''diskrétnom čase'''.


Pre druhú deriváciu:
Pre druhú deriváciu:
Riadok 220: Riadok 220:


Použité časti:
Použité časti:
- """diskrétny oscilátor"""
- '''diskrétny oscilátor'''
- """numerický model systému"""
- '''numerický model systému'''


Frekvencia prerušenia:
Frekvencia prerušenia:

Verzia z 13:27, 18. apríl 2026

Záverečný projekt predmetu MIPS / LS2026 - Oleksandr Mykyta

Zadanie

Úlohou bolo generovať harmonický signál bez použitia funkcií sin() alebo cos(). Na tento účel bol použitý oscilátor realizovaný ako prenosová funkcia:

H(s) = 1 / ((s · T)^2 + 1)

Zároveň bolo potrebné zmerať jeden bod frekvenčnej charakteristiky systému:

H(s) = 1 / (s · T + 1)

pre frekvenciu: ω = 1 / T, kde T = 0.5 s.

Výstupný signál má mať tvar:

A₀ + A₁ · sin(ωt + φ)

kde: A₀ = 128, A₁ = 100.

Analýza a opis riešenia

Cieľom riešenia je vytvoriť sínusový signál bez použitia matematických funkcií sin() alebo cos(). Tento problém sa rieši pomocou diskrétneho oscilátora, ktorý vychádza z diferenciálnej rovnice harmonického kmitania.

Základom je rovnica:

y'' + ω²y = 0

Táto rovnica popisuje harmonické kmity a jej riešením sú funkcie sin() a cos().

Teoretický základ a odvodenia

Laplaceova transformacia

Vychádzajme z prenosovej funkcie systému:

H(s) = Y(s) / X(s) = 1 / (T · s + 1)

Po úprave:

Y(s) · (T · s + 1) = X(s)
T · s · Y(s) + Y(s) = X(s)

Použitím inverznej Laplaceovej transformácie dostaneme:

T · dy(t)/dt + y(t) = x(t)

Diskretizácia

Mikrokontrolér pracuje v diskrétnom čase.

Pre druhú deriváciu:

y'' ≈ (y[n] − 2y[n−1] + y[n−2]) / T_s²

Dosadenie:

y'' + ω²y = 0

Výsledok:

y[n] = (2 / (1 + ω²T_s²)) · y[n−1] − (1 / (1 + ω²T_s²)) · y[n−2]

Diskrétny oscilátor (presný model)

Trigonometrické identity:

sin(A + B) = sin(A)cos(B) + cos(A)sin(B)
sin(A − B) = sin(A)cos(B) − cos(A)sin(B)

Po sčítaní:

sin(A + B) + sin(A − B) = 2 · sin(A) · cos(B)

Dosadenie:

A = (n−1)θ B = θ

Výsledok:

sin(nθ) + sin((n−2)θ) = 2 · cos(θ) · sin((n−1)θ)

Definícia:

y[n] = sin(nθ)

Rekurentný vzťah:

y[n] = 2 · cos(θ) · y[n−1] − y[n−2]

Výpočet parametrov

Vzťah:

θ = ω · T_s

Konštanty:

T = 0.5 s ω = 1 / T = 2 rad/s SAMPLE_RATE = 1000 Hz T_s = 0.001 s

Výsledok:

θ = 0.002

Aproximácia cos()

Taylorov rozvoj:

cos(θ) ≈ 1 − θ²/2

Úprava:

2cos(θ) ≈ 2 · (1 − θ²/2)

Inicializácia oscilátora

Počiatočné hodnoty:

y1 = 1 y2 = 1 − θ²/2

Generovanie signálu

Rozsah:

⟨−1, 1⟩

Výstup:

x = A0 + A1 · y

Konštanty:

A0 = 128 A1 = 100

Diskretizácia systému 1 / (sT + 1)

Spojitá rovnica:

T · dy/dt + y = x

Eulerova metóda:

dy/dt ≈ (y[n] − y[n−1]) / T_s

Úpravy:

y[n] = x − (T / T_s) · y[n] − (T / T_s) · y[n−1]
y[n] · (1 + (T / T_s)) = x − (T / T_s) · y[n−1]
y[n] = (T_s / (T + T_s)) · x + (T / (T + T_s)) · y[n−1]

Definícia parametra:

α = T_s / (T + T_s)

Finálny tvar:

y[n] = α · x + (1 − α) · y[n−1]
y[n] = y[n−1] + α · (x − y[n−1])

Algoritmus a program

Použité časti: - diskrétny oscilátor - numerický model systému

Frekvencia prerušenia:

1 kHz

Kroky: - výpočet oscilátora - generovanie x - výpočet systému - PWM výstup - UART komunikácia

Overenie

Výpis:

x, y_sys

Pozorované javy: - zmena amplitúdy - fázový posun

Čo by som urobil inak

- použiť bilineárnu transformáciu - presnejší výpočet cos(θ) - merať amplitúdu a fázu priamo v MCU