Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

5. Nucleo generátor

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.

Kompletní kód je ke stažení v git repozitáři nebo ve formě balíčku: ppc-sol05.zip

Třída Generator

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().

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;
}

Hlavní program

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());
    }
}

Možná vylepšení

Tabulka vzorků

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.

Více generátorů

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.

courses/b2b99ppc/solutions/05.txt · Last modified: 2020/05/16 15:45 by viteks