Operácie

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

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
Riadok 74: Riadok 74:


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.
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.
Pre f=100Hz:
RC=1/2π⋅100​
Výpočet:
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.


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]
[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]

Verzia z 21:44, 31. máj 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. Výstup D9 je impedančne oddelený pomocou operačného zosilňovača zapojeného v režime napäťového sledovača. Generovanie trojuholníkového aj sínusového priebehu je založené na základných zapojeniach s operačným zosilňovačom. Trojuholníkový signál je vytvorený pomocou integračného článku, ktorý spracováva obdĺžnikový signál generovaný mikrokontrolérom.

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 %

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.

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.


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 podľa vzťahu:

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.

Pre f=100Hz:

RC=1/2π⋅100​

Výpočet:

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.

Celkový pohľad na zariadenie.

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.

[[Súbor:]]



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);
    }
}

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: zdrojaky.zip

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. Na konci uvádzame fotku hotového zariadenia.

Aplikácia.

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.