Generátor harmonického signálu: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
| Riadok 1: | Riadok 1: | ||
Záverečný projekt predmetu MIPS / LS2026 - | Záverečný projekt predmetu MIPS / LS2026 - """Oleksandr Mykyta""" | ||
== Zadanie == | == 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: | Ú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: | |||
<syntaxhighlight lang=""> | <syntaxhighlight lang=""> | ||
| Riadok 9: | 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 15: | Riadok 16: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
pre frekvenciu <code>ω = 1 / T</code>, kde <code>T = 0 | pre frekvenciu: | ||
<code>ω = 1 / T</code>, | |||
kde | |||
<code>T = 0.5 s</code>. | |||
Výstupný signál má mať tvar: | Výstupný signál má mať tvar: | ||
| Riadok 25: | Riadok 29: | ||
kde: | kde: | ||
<code>A₀ = 128</code>, | <code>A₀ = 128</code>, | ||
<code>A₁ = 100</code> | <code>A₁ = 100</code>. | ||
__TOC__ | __TOC__ | ||
== Analýza | == 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. | 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: | Základom je rovnica: | ||
| Riadok 39: | 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 45: | Riadok 50: | ||
==== Laplaceova transformacia ==== | ==== Laplaceova transformacia ==== | ||
Vychádzajme z """prenosovej funkcie""" systému: | |||
<syntaxhighlight lang=""> | |||
H(s) = Y(s) / X(s) = 1 / (T · s + 1) | H(s) = Y(s) / X(s) = 1 / (T · s + 1) | ||
</syntaxhighlight> | |||
Po úprave: | Po úprave: | ||
<syntaxhighlight lang=""> | |||
Y(s) · (T · s + 1) = X(s) | Y(s) · (T · s + 1) = X(s) | ||
T · s · Y(s) + Y(s) = X(s) | T · s · Y(s) + Y(s) = X(s) | ||
</syntaxhighlight> | |||
Použitím inverznej Laplaceovej | Použitím """inverznej Laplaceovej transformácie""" dostaneme: | ||
<syntaxhighlight lang=""> | |||
T · dy(t)/dt + y(t) = x(t) | T · dy(t)/dt + y(t) = x(t) | ||
</syntaxhighlight> | |||
==== 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: | ||
<syntaxhighlight lang=""> | |||
y'' ≈ (y[n] − 2y[n−1] + y[n−2]) / T_s² | y'' ≈ (y[n] − 2y[n−1] + y[n−2]) / T_s² | ||
</syntaxhighlight> | |||
Dosadenie: | |||
<syntaxhighlight lang=""> | |||
y'' + ω²y = 0 | |||
</syntaxhighlight> | |||
Výsledok: | |||
<syntaxhighlight lang=""> | |||
y[n] = (2 / (1 + ω²T_s²)) · y[n−1] − (1 / (1 + ω²T_s²)) · y[n−2] | y[n] = (2 / (1 + ω²T_s²)) · y[n−1] − (1 / (1 + ω²T_s²)) · y[n−2] | ||
</syntaxhighlight> | |||
==== Diskrétny oscilátor (presný model) ==== | ==== Diskrétny oscilátor (presný model) ==== | ||
Trigonometrické identity: | |||
<syntaxhighlight lang=""> | |||
sin(A + B) = sin(A)cos(B) + cos(A)sin(B) | sin(A + B) = sin(A)cos(B) + cos(A)sin(B) | ||
sin(A − B) = sin(A)cos(B) − cos(A)sin(B) | sin(A − B) = sin(A)cos(B) − cos(A)sin(B) | ||
</syntaxhighlight> | |||
Po sčítaní: | Po sčítaní: | ||
<syntaxhighlight lang=""> | |||
sin(A + B) + sin(A − B) = 2 · sin(A) · cos(B) | sin(A + B) + sin(A − B) = 2 · sin(A) · cos(B) | ||
</syntaxhighlight> | |||
Dosadenie: | |||
A = (n−1)θ | <code>A = (n−1)θ</code> | ||
B = θ | <code>B = θ</code> | ||
Výsledok: | |||
<syntaxhighlight lang=""> | |||
sin(nθ) + sin((n−2)θ) = 2 · cos(θ) · sin((n−1)θ) | sin(nθ) + sin((n−2)θ) = 2 · cos(θ) · sin((n−1)θ) | ||
</syntaxhighlight> | |||
Definícia: | |||
y[n] = sin(nθ) | <code>y[n] = sin(nθ)</code> | ||
Rekurentný vzťah: | |||
<syntaxhighlight lang=""> | |||
y[n] = 2 · cos(θ) · y[n−1] − y[n−2] | y[n] = 2 · cos(θ) · y[n−1] − y[n−2] | ||
</syntaxhighlight> | |||
==== Výpočet parametrov ==== | ==== Výpočet parametrov ==== | ||
Vzťah: | |||
<syntaxhighlight lang=""> | |||
θ = ω · T_s | θ = ω · T_s | ||
</syntaxhighlight> | |||
Konštanty: | |||
T = 0 | |||
ω = 1 / T = 2 rad/s | <code>T = 0.5 s</code> | ||
SAMPLE_RATE = 1000 Hz | <code>ω = 1 / T = 2 rad/s</code> | ||
<code>SAMPLE_RATE = 1000 Hz</code> | |||
<code>T_s = 0.001 s</code> | |||
Výsledok: | |||
θ = 0 | <code>θ = 0.002</code> | ||
==== | ==== Aproximácia cos() ==== | ||
Taylorov rozvoj: | |||
<syntaxhighlight lang=""> | |||
cos(θ) ≈ 1 − θ²/2 | cos(θ) ≈ 1 − θ²/2 | ||
</syntaxhighlight> | |||
Úprava: | |||
<syntaxhighlight lang=""> | |||
2cos(θ) ≈ 2 · (1 − θ²/2) | 2cos(θ) ≈ 2 · (1 − θ²/2) | ||
</syntaxhighlight> | |||
==== Inicializácia oscilátora ==== | ==== Inicializácia oscilátora ==== | ||
Počiatočné hodnoty: | |||
y1 = 1 | <code>y1 = 1</code> | ||
y2 = 1 − θ²/2 | <code>y2 = 1 − θ²/2</code> | ||
==== Generovanie signálu ==== | |||
Rozsah: | |||
<code>⟨−1, 1⟩</code> | |||
Výstup: | |||
<syntaxhighlight lang=""> | |||
x = A0 + A1 · y | x = A0 + A1 · y | ||
</syntaxhighlight> | |||
Konštanty: | |||
<code>A0 = 128</code> | |||
<code>A1 = 100</code> | |||
==== | ==== Diskretizácia systému 1 / (sT + 1) ==== | ||
Spojitá rovnica: | |||
<syntaxhighlight lang=""> | |||
T · dy/dt + y = x | T · dy/dt + y = x | ||
</syntaxhighlight> | |||
Eulerova metóda: | |||
<syntaxhighlight lang=""> | |||
dy/dt ≈ (y[n] − y[n−1]) / T_s | dy/dt ≈ (y[n] − y[n−1]) / T_s | ||
</syntaxhighlight> | |||
Úpravy: | |||
<syntaxhighlight lang=""> | |||
y[n] = x − (T / T_s) · y[n] − (T / T_s) · y[n−1] | 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] · (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] | y[n] = (T_s / (T + T_s)) · x + (T / (T + T_s)) · y[n−1] | ||
</syntaxhighlight> | |||
Definícia parametra: | |||
α = T_s / (T + T_s) | <code>α = T_s / (T + T_s)</code> | ||
Finálny tvar: | |||
<syntaxhighlight lang=""> | |||
y[n] = α · x + (1 − α) · y[n−1] | y[n] = α · x + (1 − α) · y[n−1] | ||
y[n] = y[n−1] + α · (x − y[n−1]) | y[n] = y[n−1] + α · (x − y[n−1]) | ||
</syntaxhighlight> | |||
=== Algoritmus a program === | === Algoritmus a program === | ||
Použité časti: | |||
- """diskrétny oscilátor""" | |||
- """numerický model systému""" | |||
Frekvencia prerušenia: | |||
<code>1 kHz</code> | |||
Kroky: | |||
- výpočet oscilátora | |||
- generovanie """x""" | |||
- výpočet systému | |||
- """PWM""" výstup | |||
- """UART""" komunikácia | |||
=== Overenie === | === Overenie === | ||
Výpis: | |||
<code>x, y_sys</code> | |||
Pozorované javy: | |||
- """zmena amplitúdy""" | |||
- """fázový posun""" | |||
== Čo by som urobil inak == | == Č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 | |||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] | ||
Verzia z 13:24, 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 = 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