Search
Cílem programu je posílat po sériové lince v pravidelných intervalech vzorky harmonického signálu. Vzorky jsou hodnoty datového typu unsigned char (tj. byty), nule odpovídá hodnota 127.
unsigned char
Kompletní kód je ke stažení v git repozitáři nebo ve formě balíčku: ppc-sol05.zip
Samotný generátor je popsán třídou. Třída má atribut count, reprezentující vnitřní čítač, který je inkrementován v určených časových intervalech. Hodnota vnitřního čítače třídy se pak použije pro výpočet hodnoty harmonické funkce, ke kterému dochází při volání metody Generator::status().
count
Generator::status()
class Generator { Ticker t; void inc() {count++;} volatile int count; int freq; public: Generator (float cas, int f = 1) : count(0), freq(f) { t.attach(callback(this, &Generator::inc), cas); } unsigned char status() { return 127+(127*sin(freq*6.28*(count/180.0))); } };
Pro případnou manipulaci s frekvencí mohou posloužit následující metody
void Generator::setf(int f) { freq = f; } int Generator::getf() { return f; }
V hlavním programu je nekonečná smyčka, která posílá data. V každém okamžiku volání funkce se vypočítá vzorek harmonického signálu pro aktuální stav vnitřního čítače. Datový tok sériového komunikačního kanálu je tak určen dobou výpočtu vzorku. Zde je třeba si promyslet, zda je použitá komunikační rychlost dostatečná.
Serial pc(USBTX, USBRX); int main() { pc.baud(19200); Generator x(.005); while(1) { pc.printf("%d;", x.status()); } }
Na první pohled to nemusí být zřejmé, ale výpočet vzorku harmonické funkce může být výpočetně relativně náročný. Vzhledem k tomu, že velkosti vzorků jsou omezeny rozsahem datového typu unsigned char, mohlo by být při rozumném počtu vzorků na periodu z hlediska efektivity programu zajímavé v první periodě vypočítat hodnoty vzorků, uložit je do pole a v dalších periodách pouze vybírat z pole vzorky podle hodnoty vnitřního časovače.
Existence třídy popisující generátor umožňuje jednoduše vytvořit další instance, které mohou generovat vzorky harmonického signálu za jiných podmínek. Pro výstup hodnot po sériové linkce je pak třeba uvážit vhodný způsob prezentace, např. x1,y1;x2,y3;…;xN,YN.
x1,y1;x2,y3;…;xN,YN