Generátor signálov s mikroprocesorom: Rozdiel medzi revíziami
Zo stránky SensorWiki
| Riadok 96: | Riadok 96: | ||
} | } | ||
} | } | ||
< | </syntaxhighlight> | ||
</tab> | |||
</tabs> | </tabs> | ||
Verzia z 20:35, 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.

Literatúra:
- Dokumentácia k doske Acrob
- Podstata generovania sínusového priebehu – referenčné riešenie
- Podstata generovania trojuholníkového priebehu – referenčné riešenie
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.

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.

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.