Generátor signálov s mikroprocesorom: Rozdiel medzi revíziami
Zo stránky SensorWiki
| 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: | [[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; | |||
} | |||
// 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); | |||
} | |||
} | |||
</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.

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

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.