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


<tab name="AVR C-code"><syntaxhighlight lang="c++" style="background: LightYellow;">

  1. define F_CPU 16000000UL
  1. include <avr/io.h>
  2. 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);
   }

}

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.