Operácie

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

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
initial
StudentMIPS (diskusia | príspevky)
updated not clear enough explanations
Riadok 1: Riadok 1:
Záverečný projekt predmetu MIPS / LS2026 - Meno Priezvisko
Záverečný projekt predmetu MIPS / LS2026 - '''Oleksandr Mykyta'''
 


== Zadanie ==
== Zadanie ==


Úlohou je generovať harmonický signál bez použitia funkcií sin() alebo cos(). Namiesto toho sa má použiť oscilátor realizovaný ako prenosová funkcia:
Ulohou je generovat harmonicky signal bez pouzitia funkcii sin() alebo cos(). Namiesto toho sa ma pouzit oscilator realizovany ako prenosova funkcia:


1 / ((s·T)^2 + 1)
$$H(s) = \frac{1}{(s \cdot T)^2 + 1}$$


Zároveň je potrebné zmerať jeden bod frekvenčnej charakteristiky systému:
Zaroven je potrebne zmerat jeden bod frekvencnej charakteristiky systemu:


1 / (s·T + 1)
$$H(s) = \frac{1}{s \cdot T + 1}$$


na frekvencii ω = 1 / T, pričom T = 0,5 s.
na frekvencii ω = 1 / T, pricom T = 0,5 s.


Výstupný signál má mať tvar:
Vystupny signal ma mat tvar:


A₀ + A₁·sin(ωt + φ)
$$A_0 + A_1 \cdot \sin(\omega t + \varphi)$$


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


__TOC__
__TOC__


== 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(). Tento problém sa rieši pomocou diskrétneho oscilátora, ktorý vychádza z diferenciálnej rovnice harmonického kmitania.
Cielom riesenia je vytvorit sinusovy signal bez pouzitia matematickych funkcii sin() alebo cos(). Tento problem sa riesi pomocou diskretneho oscilatora, ktory vychadza z diferencialnej rovnice harmonickeho kmitania.
 
Základom je rovnica:
 
y'' + ω²y = 0
 
Táto rovnica popisuje harmonické kmity (napr. pružina alebo LC obvod) a jej riešením sú funkcie sin() a cos(). To znamená, že ak vieme túto rovnicu numericky riešiť, vieme generovať sínus bez použitia knižničných funkcií.
 
 
=== Diskretizácia ===
 
Mikrokontrolér pracuje v diskrétnom čase, preto je potrebné nahradiť derivácie rozdielmi medzi vzorkami (metóda konečných diferencí).
 
Použije sa aproximácia druhej derivácie:
 
y'' ≈ (y[n] − 2y[n−1] + y[n−2]) / T_s²
 
Po dosadení do diferenciálnej rovnice dostaneme:
 
y[n] = (2 / (1 + ω²T_s²))·y[n−1] − (1 / (1 + ω²T_s²))·y[n−2]
 
Táto rovnica predstavuje numerickú aproximáciu oscilátora. V praxi však nie je ideálna, pretože amplitúda signálu sa môže časom meniť.
 
 
=== Diskrétny oscilátor ===
 
Na generovanie stabilného sínusu sa použije presný diskrétny model založený na trigonometrickej identite:
 
sin(nθ) = 2cos(θ)·sin((n−1)θ) − sin((n−2)θ)
 
Po označení:
 
y[n] = sin(nθ)
 
dostaneme rekurentný vzťah:
 
y[n] = 2cos(θ)·y[n−1] − y[n−2]
 
Tento vzťah generuje stabilný sínusový signál bez zmeny amplitúdy.
 
 
=== Výpočet parametrov ===
 
Platí:
 
θ = ω·T_s
 
kde:
T = 0,5 s 
ω = 1 / T = 2 rad/s 
SAMPLE_RATE = 1000 Hz → T_s = 0,001 s 
 
θ = 2 · 0,001 = 0,002 
 
 
=== Aproximácia cos() ===


Keďže nie je dovolené použiť funkciu cos(), použije sa aproximácia (Taylorov rozvoj):
### Laplaceova transformacia a prenosova funkcia
Vychadzajme z nasej prenosovej funkcie H(s), co je v podstate len pomer vystupu k vstupu v Laplaceovej oblasti:


cos(θ) 1 − θ²/2
$$H(s) = \frac{Y(s)}{X(s)} = \frac{1}{T \cdot s + 1}$$


Z toho:
Ak chceme vediet, ako sa to sprava v case, potrebujeme to transformovat naspat. Vynasobime rovnicu krizom:


2cos(θ) ≈ 2·(1 − θ²/2)
$$Y(s) \cdot (T \cdot s + 1) = X(s)$$
$$T \cdot s \cdot Y(s) + Y(s) = X(s)$$


Tento výraz sa použije ako koeficient oscilátora v programe.
Teraz pouzijeme inverznu Laplaceovu transformaciu. Hlavne pravidlo tu je, ze premenna s sa v casovej domene sprava ako derivacia: $\mathcal{L}^{-1}\{s \cdot Y(s)\} = \frac{dy}{dt}$. Po aplikovani inverznej transformacie dostaneme diferencialnu rovnicu:


$$T \cdot \frac{dy(t)}{dt} + y(t) = x(t)$$


=== Inicializácia oscilátora ===
Tymto sme si potvrdili, ze nasa prenosova funkcia v Laplaceovi a diferencialna rovnica v case su vlastne len dva pohlady na to iste.


Pre správnu činnosť oscilátora sú potrebné počiatočné hodnoty:
### Diskretizácia
Mikrokontroler pracuje v diskretnom case, preto je potrebne nahradit derivacie rozdielmi medzi vzorkami (metoda konecnych diferencii).


y1 = 1 
Pouzie sa aproximacia druhej derivacie pre oscilator:
y2 = 1 − θ²/2 


Tieto hodnoty zabezpečia vznik sínusového priebehu.
$$y'' \approx \frac{y[n] - 2y[n-1] + y[n-2]}{T_s^2}$$


### Diskrétny oscilátor
Na generovanie stabilneho sinusu sa pouzije presny diskretny model zalozeny na trigonometrickej identite:


=== Generovanie signálu ===
$$\sin(n\theta) = 2\cos(\theta)\cdot\sin((n-1)\theta) - \sin((n-2)\theta)$$


Oscilátor generuje hodnoty v rozsahu ⟨−1, 1⟩.
Po oznaceni:


Požadovaný výstup je:
$$y[n] = \sin(n\theta)$$


A₀ + A₁·sin(...)
dostaneme rekurentny vztah:


Preto sa signál upraví:
$$y[n] = 2\cos(\theta)\cdot y[n-1] - y[n-2]$$


x = A0 + A1 · y
Tento vztah generuje stabilny sinusovy signal bez zmeny amplitudy. Pre vypocet parametrov plati $\theta = \omega \cdot T_s$.


kde:
### Aproximácia cos()
A0 = 128 
Kezde nie je dovolene pouzit funkciu cos(), pouzie sa aproximacia (Taylorov rozvoj):
A1 = 100 


Tým sa signál posunie do kladného rozsahu vhodného pre PWM.
$$\cos(\theta) \approx 1 - \frac{\theta^2}{2}$$


Tento vyraz sa pouzie ako koeficient oscilatora v programe.


=== Systém 1 / (sT + 1) ===
### Systém 1 / (sT + 1) a koeficient alpha
Aby mikrokontroler vedel vyuzit system 1 / (sT + 1), musime ho previest do diskretneho casu pomocou Eulerovej metody. Derivaciu nahradime diferenciami:


Systém je realizovaný ako filter prvého rádu:
$$\frac{dy}{dt} \approx \frac{y[n] - y[n-1]}{T_s}$$


T·dy/dt + y = x
Ked to dosadime do diferencialnej rovnice:


Po diskretizácii (dopredná Eulerova metóda) dostaneme:
$$T \cdot \frac{y[n] - y[n-1]}{T_s} + y[n] = x$$


y_sys[n] = y_sys[n−1] + α·(x − y_sys[n−1])
Po uprave dostaneme:


kde:
$$y[n] = \left(\frac{T_s}{T + T_s}\right) \cdot x + \left(\frac{T}{T + T_s}\right) \cdot y[n-1]$$


α = T_s / (T + T_s)
Ak si oznacime α = Ts / (T + Ts), tak to vyzera ovela krajsie:


Pre dané hodnoty:
$$y[n] = \alpha \cdot x + (1 - \alpha) \cdot y[n-1]$$


α ≈ 0,001996 
Co je to iste ako:


$$y[n] = y[n-1] + \alpha \cdot (x - y[n-1])$$


=== Meranie frekvenčnej charakteristiky ===
Pre dane hodnoty α ≈ 0,001996.


Na vstup systému je privádzaný sínusový signál s frekvenciou:
=== Algoritmus a program ===
 
ω = 1 / T
 
Tým sa meria odozva systému presne v tomto bode frekvenčnej charakteristiky.
 
Porovnaním vstupu x a výstupu y_sys je možné určiť zosilnenie a fázový posun.
 
 
=== Realizácia v programe ===
 
Celý výpočet prebieha v prerušení Timer1 s frekvenciou 1 kHz:
 
- výpočet oscilátora 
- generovanie vstupu x 
- výpočet výstupu systému 
- výstup cez PWM 
- odoslanie dát cez UART 


Algoritmus programu vyuziva Timer1 prerusenie, v ktorom sa vypocitava oscilator a nasledne filter. Vystup sa posiela do PWM modulu a data cez UART.


<tabs>
<tabs>
Riadok 255: Riadok 188:
</syntaxhighlight></tab>
</syntaxhighlight></tab>
</tabs>
</tabs>


=== Overenie ===
=== Overenie ===


Funkcia systému bola overená pomocou výpisu dát cez UART. Do sériového portu sa posielajú dvojice hodnôt:
Funkcia systemu bola overena pomocou vypisu dat cez UART. Do serioveho portu sa posielaju dvojice hodnot: x, y_sys. Tieto hodnoty je mozne zobrazit napriklad pomocou Serial Plotteru, kde je viditelny vstupny sinusovy signal a vystup systemu.
 
x, y_sys
 
Tieto hodnoty je možné zobraziť napríklad pomocou Serial Plotteru, kde je viditeľný vstupný sínusový signál a výstup systému.
 
Zo signálov je možné pozorovať zmenu amplitúdy a fázový posun, čo predstavuje bod frekvenčnej charakteristiky systému.


Zo signalov je mozne pozorovat zmenu amplitudy a fazovy posun, co predstavuje bod frekvencnej charakteristiky systemu. System sa chova presne tak, ako hovori teoria.


== Čo by som urobil inak ==
== Čo by som urobil inak ==


Pri riešení by bolo možné použiť presnejšiu metódu diskretizácie systému 1/(sT + 1), napríklad bilineárnu transformáciu, ktorá by zlepšila presnosť modelu.
Pri rieseni by bolo mozne pouzit presnejsiu metodu diskretizacie systemu 1/(sT + 1), napriklad bilinearnu transformaciu, ktora by zlepsila presnost modelu.
 
Taktiež by bolo možné implementovať presnejší výpočet cos(θ) bez aproximácie, napríklad pomocou lookup tabuľky.


Ďalším zlepšením by mohlo byť automatické vyhodnotenie amplitúdy a fázového posunu priamo v mikrokontroléri namiesto spracovania na PC.
Taktiez by bolo mozne implementovat presnejsi vypocet cos(θ) bez aproximacie, napriklad pomocou lookup tabulky.


Dalsim zlepsenim by mohlo byt automaticke vyhodnotenie amplitudy a fazoveho posunu priamo v mikrokontroleri namiesto spracovania na PC.


[[Category:AVR]] [[Category:MIPS]]
[[Category:AVR]] [[Category:MIPS]]

Verzia z 12:08, 18. apríl 2026

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

Zadanie

Ulohou je generovat harmonicky signal bez pouzitia funkcii sin() alebo cos(). Namiesto toho sa ma pouzit oscilator realizovany ako prenosova funkcia:

$$H(s) = \frac{1}{(s \cdot T)^2 + 1}$$

Zaroven je potrebne zmerat jeden bod frekvencnej charakteristiky systemu:

$$H(s) = \frac{1}{s \cdot T + 1}$$

na frekvencii ω = 1 / T, pricom T = 0,5 s.

Vystupny signal ma mat tvar:

$$A_0 + A_1 \cdot \sin(\omega t + \varphi)$$

kde: A₀ = 128 A₁ = 100

Analýza a opis riešenia

Cielom riesenia je vytvorit sinusovy signal bez pouzitia matematickych funkcii sin() alebo cos(). Tento problem sa riesi pomocou diskretneho oscilatora, ktory vychadza z diferencialnej rovnice harmonickeho kmitania.

      1. Laplaceova transformacia a prenosova funkcia

Vychadzajme z nasej prenosovej funkcie H(s), co je v podstate len pomer vystupu k vstupu v Laplaceovej oblasti:

$$H(s) = \frac{Y(s)}{X(s)} = \frac{1}{T \cdot s + 1}$$

Ak chceme vediet, ako sa to sprava v case, potrebujeme to transformovat naspat. Vynasobime rovnicu krizom:

$$Y(s) \cdot (T \cdot s + 1) = X(s)$$ $$T \cdot s \cdot Y(s) + Y(s) = X(s)$$

Teraz pouzijeme inverznu Laplaceovu transformaciu. Hlavne pravidlo tu je, ze premenna s sa v casovej domene sprava ako derivacia: $\mathcal{L}^{-1}\{s \cdot Y(s)\} = \frac{dy}{dt}$. Po aplikovani inverznej transformacie dostaneme diferencialnu rovnicu:

$$T \cdot \frac{dy(t)}{dt} + y(t) = x(t)$$

Tymto sme si potvrdili, ze nasa prenosova funkcia v Laplaceovi a diferencialna rovnica v case su vlastne len dva pohlady na to iste.

      1. Diskretizácia

Mikrokontroler pracuje v diskretnom case, preto je potrebne nahradit derivacie rozdielmi medzi vzorkami (metoda konecnych diferencii).

Pouzie sa aproximacia druhej derivacie pre oscilator:

$$y \approx \frac{y[n] - 2y[n-1] + y[n-2]}{T_s^2}$$

      1. Diskrétny oscilátor

Na generovanie stabilneho sinusu sa pouzije presny diskretny model zalozeny na trigonometrickej identite:

$$\sin(n\theta) = 2\cos(\theta)\cdot\sin((n-1)\theta) - \sin((n-2)\theta)$$

Po oznaceni:

$$y[n] = \sin(n\theta)$$

dostaneme rekurentny vztah:

$$y[n] = 2\cos(\theta)\cdot y[n-1] - y[n-2]$$

Tento vztah generuje stabilny sinusovy signal bez zmeny amplitudy. Pre vypocet parametrov plati $\theta = \omega \cdot T_s$.

      1. Aproximácia cos()

Kezde nie je dovolene pouzit funkciu cos(), pouzie sa aproximacia (Taylorov rozvoj):

$$\cos(\theta) \approx 1 - \frac{\theta^2}{2}$$

Tento vyraz sa pouzie ako koeficient oscilatora v programe.

      1. Systém 1 / (sT + 1) a koeficient alpha

Aby mikrokontroler vedel vyuzit system 1 / (sT + 1), musime ho previest do diskretneho casu pomocou Eulerovej metody. Derivaciu nahradime diferenciami:

$$\frac{dy}{dt} \approx \frac{y[n] - y[n-1]}{T_s}$$

Ked to dosadime do diferencialnej rovnice:

$$T \cdot \frac{y[n] - y[n-1]}{T_s} + y[n] = x$$

Po uprave dostaneme:

$$y[n] = \left(\frac{T_s}{T + T_s}\right) \cdot x + \left(\frac{T}{T + T_s}\right) \cdot y[n-1]$$

Ak si oznacime α = Ts / (T + Ts), tak to vyzera ovela krajsie:

$$y[n] = \alpha \cdot x + (1 - \alpha) \cdot y[n-1]$$

Co je to iste ako:

$$y[n] = y[n-1] + \alpha \cdot (x - y[n-1])$$

Pre dane hodnoty α ≈ 0,001996.

Algoritmus a program

Algoritmus programu vyuziva Timer1 prerusenie, v ktorom sa vypocitava oscilator a nasledne filter. Vystup sa posiela do PWM modulu a data cez UART.

#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "uart.h"

#define SAMPLE_RATE 1000.0
#define T 0.5

#define A0 128
#define A1 100

float OSC_COEFF;

volatile float y = 0;
volatile float y1 = 0;
volatile float y2 = 0;

volatile float y_sys = 0;

float alpha;

FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);

ISR(TIMER1_COMPA_vect)
{
    y = OSC_COEFF * y1 - y2;

    y2 = y1;
    y1 = y;

    float x = A0 + A1 * y;

    y_sys = y_sys + alpha * (x - y_sys);

    OCR0A = (uint8_t)(y_sys);

    printf("%d,%d\n", (int)x, (int)y_sys);
}

void timer1_init()
{
    TCCR1B |= (1 << WGM12);

    OCR1A = 15999;

    TCCR1B |= (1 << CS10);

    TIMSK1 |= (1 << OCIE1A);
}

void pwm_init()
{
    DDRD |= (1 << PD6);

    TCCR0A |= (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);
    TCCR0B |= (1 << CS01);
}

int main(void)
{
    uart_init();
    stdout = &mystdout;

    pwm_init();
    timer1_init();

    float Ts = 1.0 / SAMPLE_RATE;

    alpha = Ts / (T + Ts);

    float theta = (1.0 / T) * (1.0 / SAMPLE_RATE);

    y1 = 1.0;
    y2 = 1.0 - (theta * theta) / 2.0;

    OSC_COEFF = 2.0 * (1.0 - (theta * theta) / 2.0);

    sei();

    while (1)
    {
    }
}

Overenie

Funkcia systemu bola overena pomocou vypisu dat cez UART. Do serioveho portu sa posielaju dvojice hodnot: x, y_sys. Tieto hodnoty je mozne zobrazit napriklad pomocou Serial Plotteru, kde je viditelny vstupny sinusovy signal a vystup systemu.

Zo signalov je mozne pozorovat zmenu amplitudy a fazovy posun, co predstavuje bod frekvencnej charakteristiky systemu. System sa chova presne tak, ako hovori teoria.

Čo by som urobil inak

Pri rieseni by bolo mozne pouzit presnejsiu metodu diskretizacie systemu 1/(sT + 1), napriklad bilinearnu transformaciu, ktora by zlepsila presnost modelu.

Taktiez by bolo mozne implementovat presnejsi vypocet cos(θ) bez aproximacie, napriklad pomocou lookup tabulky.

Dalsim zlepsenim by mohlo byt automaticke vyhodnotenie amplitudy a fazoveho posunu priamo v mikrokontroleri namiesto spracovania na PC.