Generátor harmonického signálu
Zo stránky SensorWiki
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 = 0Tá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 = 0Vý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_sKonš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 · yKonštanty:
A0 = 128
A1 = 100
Diskretizácia systému 1 / (sT + 1)
Spojitá rovnica:
T · dy/dt + y = xEulerova 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