Operácie

Generátor signálov s mikroprocesorom

Zo stránky SensorWiki

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.

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

Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... Výpis kódu je nižšie...


#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.