Operácie

Generátor harmonického signálu

Zo stránky SensorWiki

Verzia z 13:26, 18. apríl 2026, ktorú vytvoril StudentMIPS (diskusia | príspevky) (quote fix)

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