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 24: Riadok 24:
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.
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:https://www.communica.co.za/products/lm324n-ti?srsltid=AfmBOooCz2xlYC3RG4l4_-GrKY4yMSMUWSoxIAT94g4uPHNSPyQhbDbF]]
[[Súbor:]]




Riadok 35: Riadok 35:
<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>
// 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;
}


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


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


  return(0);
    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;
        // prepo?et na OCR1A
        OCR1A = (ICR1 * duty) / 100UL;
        _delay_ms(10);
    }
}
</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">

Verzia z 20:28, 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.

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;

        // prepo?et na OCR1A
        OCR1A = (ICR1 * duty) / 100UL;

        _delay_ms(10);
    }
}
#include <avr/io.h>

void adc_init(void);                                   // A/D converter initialization

unsigned int adc_read(char a_pin);

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.