Operácie

Generátor signálov s mikroprocesorom: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2026 - '''Meno Priezvisko''' == Zadanie == Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie 400px|thumb|center|Vývojová doska ACROB. '''Literatúra:''' * [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob] * [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]…“
 
StudentMIPS (diskusia | príspevky)
 
(47 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
Záverečný projekt predmetu MIPS / LS2026 - '''Meno Priezvisko'''
Záverečný projekt predmetu MIPS / LS2026 - '''Anton Zadorozhnii'''




== Zadanie ==
== Zadanie ==


Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
Návrh a realizácia generátora signálov (trojuholníkového, PWM a sínusového) na báze vývojovej dosky Acrob. Generované priebehy sú analyzované a monitorované pomocou osciloskopu.


[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
Riadok 10: Riadok 10:
'''Literatúra:'''  
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
*[https://circuitdigest.com/electronic-circuits/simple-square-wave-to-sine-wave-converter Podstata generovania sínusového priebehu – referenčné riešenie]
*[https://circuitdigest.com/tutorial/op-amp-integrator-circuit-working-construction-applications Podstata generovania trojuholníkového priebehu – referenčné riešenie]




Riadok 17: Riadok 18:
== Analýza  a opis riešenia ==
== Analýza  a opis riešenia ==


Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]
Základnou súčiastkou daného generátora, okrem rezistorov a kondenzátorov, je operačný zosilňovač LM324N. Generovanie trojuholníkového aj sínusového priebehu je založené na základných zapojeniach s operačným zosilňovačom, kondenzatorom a rezistormi.


Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.
Na generovanie sínusového signálu sa používa trojčlánkový dolnopriepustný filter (DP filter), ktorý odstraňuje vyššie harmonické zložky obsiahnuté v obdĺžnikovom PWM signáli generovanom časovačom Timer1 s nastavenou striedou 50 %. Po filtrácii zostáva prevažne základná harmonická zložka, ktorá má tvar sínusového priebehu. Výstup filtra je následne impedančne oddelený operačným zosilňovačom zapojeným ako napäťový sledovač, čím sa zabezpečí stabilný výstupný signál nezávislý od pripojenej záťaže.
 
Frekvencia PWM signálu:
 
fPWM = fCPU / (ICR1 + 1)
 
kde:
 
fPWM je frekvencia PWM signálu,
 
fCPU = 16 MHz,
 
ICR1 je hodnota registra určujúca periódu PWM.
 
Strieda PWM signálu:
 
D = (tON / T) × 100 %
 
alebo pri použití registra OCR1A:
 
D = (OCR1A / ICR1) × 100 %
 
 
 
Návrh a výpočet hodnôt súčiastok pre generátor sínusového signálu (trojstupňový pasívny filter)
 
Pre trojčlánkový RC dolnopriepustný filter sa používa rovnaká časová konštanta pre každý článok:
 
Časová konštanta
 
RC= 1/(2πf) ​
 
Pre f=100Hz:
 
RC=1/(2π⋅100)​
 
RC≈1.59×10^−3s
 
RC ≈ 1.59 ms na jeden článok.
 
Zvolíme kondenzátor s kapacitou 220 nF a rezistor s odporom 10 kΩ. Táto kombinácia určuje medznu frekvenciu približne 72 Hz.
Každý článok RC dolnopriepustného filtra postupne tlmí vysokofrekvenčné zložky PWM signálu a zmenšuje jeho zvlnienie. S každým ďalším stupňom sa signál viac vyhladzuje, až sa na výstupe trojčlánkového filtra výrazne priblíži sínusovému priebehu.
 
 
 
 
 
Trojuholníkový priebeh je generovaný pomocou aktívneho integrátora s operačným zosilňovačom. Integrátor prevádza obdĺžnikový vstupný signál na lineárne rastúce a klesajúce napätie. Rýchlosť zmeny výstupného napätia je určená hodnotami rezistora a kondenzátora v integračnom článku.
 
Integrátor s operačným zosilňovačom vytvára z obdĺžnikového signálu trojuholníkový priebeh podľa vzťahu:
 
uOUT(t) = -(1 / RC) × ∫uIN(t)dt
 
Medzná frekvencia jedného RC článku dolnopriepustného filtra je:
 
fc = 1 / (2πRC)
 
kde:
 
R je odpor,
 
C je kapacita.
 
duOUT/dt = -uIN / (R × C)
 
kde:
 
uIN je vstupné napätie,
 
uOUT je výstupné napätie,
 
R je vstupný rezistor,
 
C je integračný kondenzátor.
 
Pri konštantnej hodnote vstupného napätia sa výstupné napätie mení lineárne v čase, čím vzniká trojuholníkový priebeh. Smer nárastu alebo poklesu závisí od polarity vstupného signálu.
 
Výpočet hodnôt súčiastok pre generátor trojuholníkového priebehu (aktívny integrátor)
 
Pre f=100Hz:
 
RC=1/(2π⋅100​)
 
RC≈1.59×10^−3s
 
teda:
 
RC ≈ 0.00159 s ≈ 1.59 ms
 
Zvolíme kondenzátor s kapacitou 100 nF a rezistor s odporom 10 kΩ. Táto kombinácia určuje medznu frekvenciu približne 159 Hz.
 
Paralelne ku kondenzátoru zapojíme rezistor 47 kΩ, aby operačný zosilňovač nepracoval v nasýtení.
 
[[Súbor:Screenshot 2026-06-01 011209.png|1000px|thumb|center|Schema zapojenia. Na schéme je zobrazená doska Arduino Uno, ktorá disponuje analógovými vstupmi a výstupmi. Tieto vstupy a výstupy sú funkčne ekvivalentné vstupom a výstupom vývojovej dosky Acrob, schéma použitá ako východisko pri návrhu zapojenia.]]
 
Výstup D9 je impedančne oddelený pomocou operačného zosilňovača zapojeného v režime napäťového sledovača.
 
Operačný zosilňovač zapojený ako sledovač má zosilnenie:
 
uOUT = uIN
 
takže nemení amplitúdu signálu, ale zabezpečuje impedančné oddelenie výstupu od filtra.
 
Operačný zosilňovač 4.3 zabezpečuje nastavenie offsetu signálu posunom referenčnej úrovne v rozsahu −15 V až +15 V(zavisi od napajania) pomocou 25 kΩ potenciometra. Zosilnenie a amplitúda výstupného signálu sa regulujú dvoma samostatnými potenciometrami.
 
Točením potenciometra „DUTY CYCLE" meníme striedu (duty cycle) PWM signálu, točením potenciometra „FREKVENCIA" meníme frekvenciu signálu.
 
Točením potenciometra „ZOSILNENIE" meníme amplitúdu (zosilnenie) výstupného signálu.
 
Točením potenciometra „OFFSET" meníme jednosmernú zložku (DC offset), teda posun výstupného signálu po zvislej osi nahor alebo nadol.
 
Pre zosilnenie plati : Au= -(0<->20kΩ)/R10, Au.max => -20.
 
Všetky operačné zosilňovače na schéme sú napájané symetrickým napájacím napätím ±15V.
 
Napájanie ±15 V je zabezpečené z vývojovej dosky Freescale.
 
*[[Médiá:PBMCUSLKUG.pdf|Datasheet k doske Freescale PBMCUSLK.]]
 
*[https://www.alldatasheet.com/datasheet-pdf/pdf/2014725/TI/LM324N.html LM324N datasheet]
 
[[Súbor:Photo_2026-05-31_22-12-10.jpg|400px|thumb|center|Pohľad zhora na zapojenie.]]


[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]




=== Algoritmus a program ===
=== Algoritmus a program ===


Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto...  
Program realizuje generovanie PWM signálu pomocou časovača Timer1 mikrokontroléra ATmega328P. Parametre PWM signálu sú nastavované pomocou dvoch potenciometrov pripojených na analógové vstupy mikrokontroléra.
Výpis kódu je nižšie...
 
Po spustení programu sa inicializuje ADC prevodník funkciou <code>ADC_init()</code> a PWM modul funkciou <code>PWM_init()</code>. ADC prevodník slúži na snímanie hodnôt z potenciometrov, zatiaľ čo Timer1 je nakonfigurovaný v režime Fast PWM s nastaviteľnou hodnotou TOP pomocou registra ICR1.
 
V nekonečnej slučke programu sa pravidelne vykonávajú nasledujúce kroky:
 
* načítanie hodnoty potenciometra na vstupe A4 pomocou funkcie <code>ADC_read(4)</code>, ktorá určuje frekvenciu PWM signálu,
* načítanie hodnoty potenciometra na vstupe A1 pomocou funkcie <code>ADC_read(1)</code>, ktorá určuje striedu PWM signálu,
* prepočet ADC hodnoty na frekvenciu v rozsahu približne 100 Hz až 10 kHz,
* výpočet hodnoty registra ICR1, ktorá určuje periódu PWM signálu,
* prepočet ADC hodnoty na striedu v rozsahu 0 až 100 %,
* nastavenie registra OCR1A, ktorý určuje šírku impulzu PWM signálu.
 
Výstupný PWM signál je generovaný na pine OC1A (PB1, Arduino D9). Program priebežne aktualizuje frekvenciu aj striedu podľa aktuálnej polohy potenciometrov.
 
 




<tabs>
<tabs>
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>


int main(void)
// ADC init
{
void ADC_init() {
  unsigned int measuredValue;
    ADMUX = (1 << REFS0); // AVcc referencia
    ADCSRA = (1 << ADEN)
          | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // prescaler 128
}


  while (1)
// ?ítanie konkrétneho kanála
  {
uint16_t ADC_read(uint8_t ch) {
     /*  relax  */ 
     ADMUX = (ADMUX & 0xF0) | (ch & 0x0F);
  }


  return(0);
    ADCSRA |= (1 << ADSC);
    while (ADCSRA & (1 << ADSC));
 
    return ADC;
}
}


</syntaxhighlight ></tab>
// PWM init
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
void PWM_init() {
#include <avr/io.h>
    DDRB |= (1 << PB1); // OC1A (D9) ako výstup
 
    // Fast PWM, TOP = ICR1
    TCCR1A = (1 << COM1A1) | (1 << WGM11);
    TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); // prescaler = 1
 
    ICR1 = 16000;
    OCR1A = ICR1 / 2; // za?iatok 50 %
}
 
int main(void) {
    ADC_init();
    PWM_init();
 
    while (1) {
        uint16_t adc_freq = ADC_read(4); // A4 - frekvencia
        uint16_t adc_duty = ADC_read(1); // A1 - duty cycle
 
        // --- FREKVENCIA ---
        uint32_t freq = 100 + ((uint32_t)adc_freq * 10000UL) / 1023UL;
        uint32_t top = (F_CPU / freq) - 1;
 
        if (top > 65535) top = 65535;
        if (top < 100) top = 100;
 
        ICR1 = (uint16_t)top;
 
        // --- DUTY CYCLE ---
        // 0–100 %
        uint32_t duty = ((uint32_t)adc_duty * 100UL) / 1023UL;


void adc_init(void);                                   // A/D converter initialization
        // prepocet na OCR1A
        OCR1A = (ICR1 * duty) / 100UL;


unsigned int adc_read(char a_pin);
        _delay_ms(10);
</syntaxhighlight ></tab>
    }
}
</syntaxhighlight>
</tab>
</tabs>
</tabs>


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':


Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
Zdrojový kód: [[Médiá:GENERATOR.rar|GeneratorAZ]]


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


Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
Daná konfigurácia kondenzátorov a rezistorov umožňuje nastavenie frekvencie v rozsahu 50 až 1000 Hz pre sínusový signál a približne 100 až 5000–7000 Hz pre trojuholníkový signál.
Na konci uvádzame fotku hotového zariadenia.
 
[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]


'''Video:'''
'''Video:'''
<center><youtube>D0UnqGm_miA</youtube></center>
<center><youtube>1lzRr8zxZ6E</youtube></center>
 


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

Aktuálna revízia z 19:38, 1. jún 2026

Záverečný projekt predmetu MIPS / LS2026 - Anton Zadorozhnii


Zadanie

Návrh a realizácia generátora signálov (trojuholníkového, PWM a sínusového) na báze vývojovej dosky Acrob. Generované priebehy sú analyzované a monitorované pomocou osciloskopu.

Vývojová doska ACROB.

Literatúra:


Analýza a opis riešenia

Základnou súčiastkou daného generátora, okrem rezistorov a kondenzátorov, je operačný zosilňovač LM324N. Generovanie trojuholníkového aj sínusového priebehu je založené na základných zapojeniach s operačným zosilňovačom, kondenzatorom a rezistormi.

Na generovanie sínusového signálu sa používa trojčlánkový dolnopriepustný filter (DP filter), ktorý odstraňuje vyššie harmonické zložky obsiahnuté v obdĺžnikovom PWM signáli generovanom časovačom Timer1 s nastavenou striedou 50 %. Po filtrácii zostáva prevažne základná harmonická zložka, ktorá má tvar sínusového priebehu. Výstup filtra je následne impedančne oddelený operačným zosilňovačom zapojeným ako napäťový sledovač, čím sa zabezpečí stabilný výstupný signál nezávislý od pripojenej záťaže.

Frekvencia PWM signálu:

fPWM = fCPU / (ICR1 + 1)

kde:

fPWM je frekvencia PWM signálu,

fCPU = 16 MHz,

ICR1 je hodnota registra určujúca periódu PWM.

Strieda PWM signálu:

D = (tON / T) × 100 %

alebo pri použití registra OCR1A:

D = (OCR1A / ICR1) × 100 %


Návrh a výpočet hodnôt súčiastok pre generátor sínusového signálu (trojstupňový pasívny filter)

Pre trojčlánkový RC dolnopriepustný filter sa používa rovnaká časová konštanta pre každý článok:

Časová konštanta

RC= 1/(2πf) ​

Pre f=100Hz:

RC=1/(2π⋅100)​

RC≈1.59×10^−3s

RC ≈ 1.59 ms na jeden článok.

Zvolíme kondenzátor s kapacitou 220 nF a rezistor s odporom 10 kΩ. Táto kombinácia určuje medznu frekvenciu približne 72 Hz. Každý článok RC dolnopriepustného filtra postupne tlmí vysokofrekvenčné zložky PWM signálu a zmenšuje jeho zvlnienie. S každým ďalším stupňom sa signál viac vyhladzuje, až sa na výstupe trojčlánkového filtra výrazne priblíži sínusovému priebehu.



Trojuholníkový priebeh je generovaný pomocou aktívneho integrátora s operačným zosilňovačom. Integrátor prevádza obdĺžnikový vstupný signál na lineárne rastúce a klesajúce napätie. Rýchlosť zmeny výstupného napätia je určená hodnotami rezistora a kondenzátora v integračnom článku.

Integrátor s operačným zosilňovačom vytvára z obdĺžnikového signálu trojuholníkový priebeh podľa vzťahu:

uOUT(t) = -(1 / RC) × ∫uIN(t)dt

Medzná frekvencia jedného RC článku dolnopriepustného filtra je:

fc = 1 / (2πRC)

kde:

R je odpor,

C je kapacita.

duOUT/dt = -uIN / (R × C)

kde:

uIN je vstupné napätie,

uOUT je výstupné napätie,

R je vstupný rezistor,

C je integračný kondenzátor.

Pri konštantnej hodnote vstupného napätia sa výstupné napätie mení lineárne v čase, čím vzniká trojuholníkový priebeh. Smer nárastu alebo poklesu závisí od polarity vstupného signálu.

Výpočet hodnôt súčiastok pre generátor trojuholníkového priebehu (aktívny integrátor)

Pre f=100Hz:

RC=1/(2π⋅100​)

RC≈1.59×10^−3s

teda:

RC ≈ 0.00159 s ≈ 1.59 ms

Zvolíme kondenzátor s kapacitou 100 nF a rezistor s odporom 10 kΩ. Táto kombinácia určuje medznu frekvenciu približne 159 Hz.

Paralelne ku kondenzátoru zapojíme rezistor 47 kΩ, aby operačný zosilňovač nepracoval v nasýtení.

Schema zapojenia. Na schéme je zobrazená doska Arduino Uno, ktorá disponuje analógovými vstupmi a výstupmi. Tieto vstupy a výstupy sú funkčne ekvivalentné vstupom a výstupom vývojovej dosky Acrob, schéma použitá ako východisko pri návrhu zapojenia.

Výstup D9 je impedančne oddelený pomocou operačného zosilňovača zapojeného v režime napäťového sledovača.

Operačný zosilňovač zapojený ako sledovač má zosilnenie:

uOUT = uIN

takže nemení amplitúdu signálu, ale zabezpečuje impedančné oddelenie výstupu od filtra.

Operačný zosilňovač 4.3 zabezpečuje nastavenie offsetu signálu posunom referenčnej úrovne v rozsahu −15 V až +15 V(zavisi od napajania) pomocou 25 kΩ potenciometra. Zosilnenie a amplitúda výstupného signálu sa regulujú dvoma samostatnými potenciometrami.

Točením potenciometra „DUTY CYCLE" meníme striedu (duty cycle) PWM signálu, točením potenciometra „FREKVENCIA" meníme frekvenciu signálu.

Točením potenciometra „ZOSILNENIE" meníme amplitúdu (zosilnenie) výstupného signálu.

Točením potenciometra „OFFSET" meníme jednosmernú zložku (DC offset), teda posun výstupného signálu po zvislej osi nahor alebo nadol.

Pre zosilnenie plati : Au= -(0<->20kΩ)/R10, Au.max => -20.

Všetky operačné zosilňovače na schéme sú napájané symetrickým napájacím napätím ±15V.

Napájanie ±15 V je zabezpečené z vývojovej dosky Freescale.

Pohľad zhora na zapojenie.


Algoritmus a program

Program realizuje generovanie PWM signálu pomocou časovača Timer1 mikrokontroléra ATmega328P. Parametre PWM signálu sú nastavované pomocou dvoch potenciometrov pripojených na analógové vstupy mikrokontroléra.

Po spustení programu sa inicializuje ADC prevodník funkciou ADC_init() a PWM modul funkciou PWM_init(). ADC prevodník slúži na snímanie hodnôt z potenciometrov, zatiaľ čo Timer1 je nakonfigurovaný v režime Fast PWM s nastaviteľnou hodnotou TOP pomocou registra ICR1.

V nekonečnej slučke programu sa pravidelne vykonávajú nasledujúce kroky:

  • načítanie hodnoty potenciometra na vstupe A4 pomocou funkcie ADC_read(4), ktorá určuje frekvenciu PWM signálu,
  • načítanie hodnoty potenciometra na vstupe A1 pomocou funkcie ADC_read(1), ktorá určuje striedu PWM signálu,
  • prepočet ADC hodnoty na frekvenciu v rozsahu približne 100 Hz až 10 kHz,
  • výpočet hodnoty registra ICR1, ktorá určuje periódu PWM signálu,
  • prepočet ADC hodnoty na striedu v rozsahu 0 až 100 %,
  • nastavenie registra OCR1A, ktorý určuje šírku impulzu PWM signálu.

Výstupný PWM signál je generovaný na pine OC1A (PB1, Arduino D9). Program priebežne aktualizuje frekvenciu aj striedu podľa aktuálnej polohy potenciometrov.



#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

// ADC init
void ADC_init() {
    ADMUX = (1 << REFS0); // AVcc referencia
    ADCSRA = (1 << ADEN)
           | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // prescaler 128
}

// ?ítanie konkrétneho kanála
uint16_t ADC_read(uint8_t ch) {
    ADMUX = (ADMUX & 0xF0) | (ch & 0x0F);

    ADCSRA |= (1 << ADSC);
    while (ADCSRA & (1 << ADSC));

    return ADC;
}

// PWM init
void PWM_init() {
    DDRB |= (1 << PB1); // OC1A (D9) ako výstup

    // Fast PWM, TOP = ICR1
    TCCR1A = (1 << COM1A1) | (1 << WGM11);
    TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); // prescaler = 1

    ICR1 = 16000;
    OCR1A = ICR1 / 2; // za?iatok 50 %
}

int main(void) {
    ADC_init();
    PWM_init();

    while (1) {
        uint16_t adc_freq = ADC_read(4); // A4 - frekvencia
        uint16_t adc_duty = ADC_read(1); // A1 - duty cycle

        // --- FREKVENCIA ---
        uint32_t freq = 100 + ((uint32_t)adc_freq * 10000UL) / 1023UL;
        uint32_t top = (F_CPU / freq) - 1;

        if (top > 65535) top = 65535;
        if (top < 100) top = 100;

        ICR1 = (uint16_t)top;

        // --- DUTY CYCLE ---
        // 0–100 %
        uint32_t duty = ((uint32_t)adc_duty * 100UL) / 1023UL;

        // prepocet na OCR1A
        OCR1A = (ICR1 * duty) / 100UL;

        _delay_ms(10);
    }
}


Zdrojový kód: GeneratorAZ

Overenie

Daná konfigurácia kondenzátorov a rezistorov umožňuje nastavenie frekvencie v rozsahu 50 až 1000 Hz pre sínusový signál a približne 100 až 5000–7000 Hz pre trojuholníkový signál.

Video:

Čo by som urobil inak

Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.