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.

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. Výstup D9 je impedančne oddelený pomocou operačného zosilňovača zapojeného v režime napäťového sledovača. Generovanie trojuholníkového aj sínusového priebehu je založené na základných zapojeniach s operačným zosilňovačom. Trojuholníkový signál je vytvorený pomocou integračného článku, ktorý spracováva obdĺžnikový signál generovaný mikrokontrolérom.
Na generovanie sínusového signálu sa používa trojčlánkový dolnopriepustný filter (DP filter), ktorý odstraňuje vyššie harmonické zložky obsiahnuté v obdĺžnikovom PWM signáli generovanom časovačom Timer1 s nastavenou striedou 50 %. Po filtrácii zostáva prevažne základná harmonická zložka, ktorá má tvar sínusového priebehu. Výstup filtra je následne impedančne oddelený operačným zosilňovačom zapojeným ako napäťový sledovač, čím sa zabezpečí stabilný výstupný signál nezávislý od pripojenej záťaže.
Frekvencia PWM signálu:
fPWM = fCPU / (ICR1 + 1)
kde:
fPWM je frekvencia PWM signálu,
fCPU = 16 MHz,
ICR1 je hodnota registra určujúca periódu PWM.
Strieda PWM signálu:
D = (tON / T) × 100 %
alebo pri použití registra OCR1A:
D = (OCR1A / ICR1) × 100 %
Integrátor s operačným zosilňovačom vytvára z obdĺžnikového signálu trojuholníkový priebeh podľa vzťahu:
uOUT(t) = -(1 / RC) × ∫uIN(t)dt
Medzná frekvencia jedného RC článku dolnopriepustného filtra je:
fc = 1 / (2πRC)
kde:
R je odpor,
C je kapacita.
Operačný zosilňovač zapojený ako sledovač má zosilnenie:
uOUT = uIN
takže nemení amplitúdu signálu, ale zabezpečuje impedančné oddelenie výstupu od filtra.
Návrh a výpočet hodnôt súčiastok pre generátor sínusového signálu (trojstupňový pasívny filter)
Pre trojčlánkový RC dolnopriepustný filter sa používa rovnaká časová konštanta pre každý článok:
Časová konštanta
RC= 1/(2πf)
Pre f=100Hz:
RC=1/(2π⋅100)
RC≈1.59×10^−3s
RC ≈ 1.59 ms na jeden článok.
Zvolíme kondenzátor s kapacitou 220 nF a rezistor s odporom 10 kΩ. Táto kombinácia určuje medznu frekvenciu približne 72 Hz. Každý článok RC dolnopriepustného filtra postupne tlmí vysokofrekvenčné zložky PWM signálu a zmenšuje jeho zvlnienie. S každým ďalším stupňom sa signál viac vyhladzuje, až sa na výstupe trojčlánkového filtra výrazne priblíži sínusovému priebehu.
Trojuholníkový priebeh je generovaný pomocou aktívneho integrátora s operačným zosilňovačom. Integrátor prevádza obdĺžnikový vstupný signál na lineárne rastúce a klesajúce napätie. Rýchlosť zmeny výstupného napätia je určená hodnotami rezistora a kondenzátora v integračnom článku podľa vzťahu:
duOUT/dt = -uIN / (R × C) kde:
uIN je vstupné napätie, uOUT je výstupné napätie, R je vstupný rezistor, C je integračný kondenzátor.
Pri konštantnej hodnote vstupného napätia sa výstupné napätie mení lineárne v čase, čím vzniká trojuholníkový priebeh. Smer nárastu alebo poklesu závisí od polarity vstupného signálu.
Výpočet hodnôt súčiastok pre generátor trojuholníkového priebehu (aktívny integrátor)
Pre f=100Hz:
RC=1/(2π⋅100)
RC≈1.59×10^−3s
teda:
RC ≈ 0.00159 s ≈ 1.59 ms
Zvolíme kondenzátor s kapacitou 100 nF a rezistor s odporom 10 kΩ. Táto kombinácia určuje medznu frekvenciu približne 159 Hz.
Paralelne ku kondenzátoru zapojíme rezistor 47 kΩ, aby operačný zosilňovač nepracoval v nasýtení.

Operačný zosilňovač 4.3 zabezpečuje nastavenie offsetu signálu posunom referenčnej úrovne v rozsahu −15 V až +15 V(zavisi od napajania) pomocou 25 kΩ potenciometra. Zosilnenie a amplitúda výstupného signálu sa regulujú dvoma samostatnými potenciometrami.
Pre zosilnenie plati : Au=-(0<->20kΩ)/R10, Au.max=>-20
Napájanie ±15 V je zabezpečené z vývojovej dosky Freescale.
Subor:PBMCUSLKUG.pdf Freescale PBMCUSLK datashet

Algoritmus a program
Program realizuje generovanie PWM signálu pomocou časovača Timer1 mikrokontroléra ATmega328P. Parametre PWM signálu sú nastavované pomocou dvoch potenciometrov pripojených na analógové vstupy mikrokontroléra.
Po spustení programu sa inicializuje ADC prevodník funkciou ADC_init() a PWM modul funkciou PWM_init(). ADC prevodník slúži na snímanie hodnôt z potenciometrov, zatiaľ čo Timer1 je nakonfigurovaný v režime Fast PWM s nastaviteľnou hodnotou TOP pomocou registra ICR1.
V nekonečnej slučke programu sa pravidelne vykonávajú nasledujúce kroky:
- načítanie hodnoty potenciometra na vstupe A4 pomocou funkcie
ADC_read(4), ktorá určuje frekvenciu PWM signálu, - načítanie hodnoty potenciometra na vstupe A1 pomocou funkcie
ADC_read(1), ktorá určuje striedu PWM signálu, - prepočet ADC hodnoty na frekvenciu v rozsahu približne 100 Hz až 10 kHz,
- výpočet hodnoty registra ICR1, ktorá určuje periódu PWM signálu,
- prepočet ADC hodnoty na striedu v rozsahu 0 až 100 %,
- nastavenie registra OCR1A, ktorý určuje šírku impulzu PWM signálu.
Výstupný PWM signál je generovaný na pine OC1A (PB1, Arduino D9). Program priebežne aktualizuje frekvenciu aj striedu podľa aktuálnej polohy potenciometrov.
#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.