Generátor tónov: Rozdiel medzi revíziami
Zo stránky SensorWiki
| (18 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
| Riadok 23: | Riadok 23: | ||
Potenciometer slúži ako analógový ovládací prvok. Zmenou polohy potenciometra sa mení napätie privádzané na vstup A4, ktoré je následne prevádzané A/D prevodníkom na digitálnu hodnotu v rozsahu 0 až 1023. | Potenciometer slúži ako analógový ovládací prvok. Zmenou polohy potenciometra sa mení napätie privádzané na vstup A4, ktoré je následne prevádzané A/D prevodníkom na digitálnu hodnotu v rozsahu 0 až 1023. | ||
Bzučiak je pripojený na digitálny výstup D6 (PD6). Program podľa nameranej hodnoty z potenciometra vypočíta frekvenciu tónu v rozsahu približne 100 Hz až 2000 Hz. | Bzučiak je pripojený na digitálny výstup D6 (PD6). | ||
Program podľa nameranej hodnoty z potenciometra vypočíta frekvenciu tónu v rozsahu približne 100 Hz až 2000 Hz. | |||
[[Súbor:zariadenie_suciastky.jpeg|500px|thumb|center|Celkový pohľad na zariadenie.]] | [[Súbor:zariadenie_suciastky.jpeg|500px|thumb|center|Celkový pohľad na zariadenie.]] | ||
=== Schéma zapojenia === | |||
Schéma zapojenia generátora tónov využíva mikrokontrolér ATmega328P, potenciometer a bzučiak. | |||
Potenciometer je pripojený na analógový vstup A4 (PC4) a slúži na nastavovanie frekvencie generovaného tónu. | |||
Mikrokontrolér priebežne meria hodnotu potenciometra pomocou A/D prevodníka a podľa nej generuje zvukový signál na výstupe D6 (PD6), ku ktorému je pripojený bzučiak. | |||
Napájanie obvodu je zabezpečené napätím +5 V. | |||
[[Súbor:SchemaZapojeniaGeneratorTonov.png|500px|thumb|center|Schéma zapojenia.]] | |||
=== Algoritmus a program === | === Algoritmus a program === | ||
Program najprv nastaví pin D6 ako výstup pre bzučiak. Následne v nekonečnej slučke vykonáva meranie hodnoty potenciometra pomocou A/D prevodníka na vstupe A4. | Program najprv nastaví pin D6 ako výstup pre bzučiak. | ||
Nameraná hodnota ADC sa lineárne prepočíta na frekvenciu v rozsahu približne 100 Hz až 2000 Hz. Ak je hodnota potenciometra veľmi nízka, bzučiak zostáva vypnutý. V opačnom prípade sa na výstupe D6 generuje tón zodpovedajúcej frekvencie. | |||
Následne v nekonečnej slučke vykonáva meranie hodnoty potenciometra pomocou A/D prevodníka na vstupe A4. | |||
Nameraná hodnota ADC sa lineárne prepočíta na frekvenciu v rozsahu približne 100 Hz až 2000 Hz. | |||
Ak je hodnota potenciometra veľmi nízka, bzučiak zostáva vypnutý. V opačnom prípade sa na výstupe D6 generuje tón zodpovedajúcej frekvencie. | |||
Zdrojový kód obsahuje dve hlavné funkcie: | Zdrojový kód obsahuje dve hlavné funkcie: | ||
* read_adc() – zabezpečuje meranie analógovej hodnoty z potenciometra. | |||
* tone_sw() – generuje tón softvérovým prepínaním výstupu D6. | |||
<tabs> | <tabs> | ||
| Riadok 127: | Riadok 141: | ||
} | } | ||
} | } | ||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
</tabs> | </tabs> | ||
Zdrojový kód: [[Médiá: | Zdrojový kód: [[Médiá:SzaboOliver_GeneratorTonov.zip|SzaboOliver_GeneratorTonov.zip]] | ||
=== Overenie === | === Overenie === | ||
Funkčnosť projektu bola overená testovaním. Po pripojení sa otáčaním potenciometra plynule menila frekvencia tónu generovaného bzučiakom. | |||
[[Súbor:ZapojenieSzabo. | Pri minimálnej polohe potenciometra bol tón vypnutý alebo mal veľmi nízku frekvenciu. Pri zvyšovaní hodnoty potenciometra sa frekvencia tónu plynule zvyšovala až približne na 2000 Hz. | ||
Počas testovania bola potvrdená správna funkcia A/D prevodníka aj generovania zvukového signálu. | |||
[[Súbor:ZapojenieSzabo.jpeg|600px|thumb|center|Aplikácia.]] | |||
'''Video:''' | '''Video:''' | ||
<center><youtube> | <center><youtube>RnX3t-8It2o</youtube></center> | ||
== Čo by som urobil inak == | == Čo by som urobil inak == | ||
V budúcnosti by som namiesto softvérového generovania tónu využil hardvérový časovač mikrokontroléra, čím by sa dosiahla presnejšia generácia frekvencie a menšie zaťaženie procesora. | |||
Taktiež by bolo možné rozšíriť projekt o displej zobrazujúci aktuálnu frekvenciu generovaného tónu. | |||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] | ||
Aktuálna revízia z 20:19, 6. jún 2026
Záverečný projekt predmetu MIPS / LS2026 - Oliver Szabo
Zadanie
Cieľom projektu bolo vytvoriť generátor tónov, ktorého frekvencia je riadená potenciometrom. Hodnota získaná z analógového vstupu mikrokontroléra pomocou A/D prevodníka sa spracuje programom a následne sa použije na generovanie zvukového signálu na bzučiaku.
Používateľ môže otáčaním potenciometra plynule meniť frekvenciu generovaného tónu.

Literatúra:
Analýza a opis riešenia
Pri realizácii projektu bola použitá vývojová doska ACROB s mikrokontrolérom ATmega328P, potenciometer a piezo bzučiak.
Potenciometer slúži ako analógový ovládací prvok. Zmenou polohy potenciometra sa mení napätie privádzané na vstup A4, ktoré je následne prevádzané A/D prevodníkom na digitálnu hodnotu v rozsahu 0 až 1023.
Bzučiak je pripojený na digitálny výstup D6 (PD6).
Program podľa nameranej hodnoty z potenciometra vypočíta frekvenciu tónu v rozsahu približne 100 Hz až 2000 Hz.

Schéma zapojenia
Schéma zapojenia generátora tónov využíva mikrokontrolér ATmega328P, potenciometer a bzučiak.
Potenciometer je pripojený na analógový vstup A4 (PC4) a slúži na nastavovanie frekvencie generovaného tónu.
Mikrokontrolér priebežne meria hodnotu potenciometra pomocou A/D prevodníka a podľa nej generuje zvukový signál na výstupe D6 (PD6), ku ktorému je pripojený bzučiak.
Napájanie obvodu je zabezpečené napätím +5 V.

Algoritmus a program
Program najprv nastaví pin D6 ako výstup pre bzučiak.
Následne v nekonečnej slučke vykonáva meranie hodnoty potenciometra pomocou A/D prevodníka na vstupe A4.
Nameraná hodnota ADC sa lineárne prepočíta na frekvenciu v rozsahu približne 100 Hz až 2000 Hz.
Ak je hodnota potenciometra veľmi nízka, bzučiak zostáva vypnutý. V opačnom prípade sa na výstupe D6 generuje tón zodpovedajúcej frekvencie.
Zdrojový kód obsahuje dve hlavné funkcie:
- read_adc() – zabezpečuje meranie analógovej hodnoty z potenciometra.
- tone_sw() – generuje tón softvérovým prepínaním výstupu D6.
/*
* projekt.c
*
* Created: 5. 6. 2026 10:56:31
* Author: Oliver Szabo
*/
#include <avr/io.h>
#include <util/delay.h>
// Bzuciak na D6 = PD6, breadboard
#define BUZZER_DDR DDRD
#define BUZZER_PORT PORTD
#define BUZZER_PIN PD6
// freq_hz = frekvencia, duration_ms = ako dlho bzuci (napr. 50)
void tone_sw(uint16_t freq_hz, uint16_t duration_ms) {
if (freq_hz == 0) {
BUZZER_PORT &= ~(1 << BUZZER_PIN); // Ticho
_delay_ms(50);
return;
}
// Polovicna perioda v mikrosekundach
// T = 1/f, polovica = 500000/f [us]
uint16_t half_period_us = 500000UL / freq_hz;
// Pocet toggleov za duration_ms
// Jeden toggle = half_period_us mikrosekund
// Celkovy cas = duration_ms * 1000 us
uint16_t toggles = (uint32_t)duration_ms * 1000 / half_period_us;
for (uint16_t i = 0; i < toggles; i++) {
BUZZER_PORT ^= (1 << BUZZER_PIN); // Toggle pin
// Cakaj half_period_us mikrosekund
uint16_t t = half_period_us;
while (t--) {
__asm__("nop"); // 1 nop = 1 cyklus = 62.5ns pri 16MHz
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop"); // 16 nop = ~1 mikrosekunda pri 16MHz
}
}
}
// Precita ADC hodnotu z kanala, vracia 0..1023
uint16_t read_adc(uint8_t channel) {
ADMUX = (1 << REFS0) | (channel & 0x07);
ADCSRA = (1 << ADEN) | (1 << ADSC)
| (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
while (ADCSRA & (1 << ADSC));
return ADC;
}
int main(void) {
BUZZER_DDR |= (1 << BUZZER_PIN); // D6 ako vystup
while (1) {
uint16_t adc = read_adc(4); // Citaj A4 - potenciometer
if (adc < 10) {
tone_sw(0, 50); // Ticho
} else {
// ADC 0..1023 -> 100..2000 Hz
uint16_t freq = 100 + (uint32_t)adc * 1900 / 1023;
tone_sw(freq, 50); // Bzuci 50ms na danej frekvencii
}
}
}
Zdrojový kód: SzaboOliver_GeneratorTonov.zip
Overenie
Funkčnosť projektu bola overená testovaním. Po pripojení sa otáčaním potenciometra plynule menila frekvencia tónu generovaného bzučiakom.
Pri minimálnej polohe potenciometra bol tón vypnutý alebo mal veľmi nízku frekvenciu. Pri zvyšovaní hodnoty potenciometra sa frekvencia tónu plynule zvyšovala až približne na 2000 Hz.
Počas testovania bola potvrdená správna funkcia A/D prevodníka aj generovania zvukového signálu.

Video:
Čo by som urobil inak
V budúcnosti by som namiesto softvérového generovania tónu využil hardvérový časovač mikrokontroléra, čím by sa dosiahla presnejšia generácia frekvencie a menšie zaťaženie procesora.
Taktiež by bolo možné rozšíriť projekt o displej zobrazujúci aktuálnu frekvenciu generovaného tónu.