Generátor: Generovaní sinusového a trojúhelníkového průběhu

Nejlépe je nejprve zjistit maximální počet vzorků za periodu který program zvládne.
U sinusového průběhu 41,67 kHz trvá jedna perioda 1000000/41670 = 24 mikrosec.

Zkusil jsem zápis jednoho vzorku v přerušení.

uint8_t sin_tab[16]={1,2,3,4,5,6,7,8}; ISR (TIMER0_OVF_vect) { static uint8_t i=0; PORTB = sin_tab(i & 0x00001111)]; i++; }
Provedení tohoto kódu trvá asi 2,5 us. (včetně skoku do a z přerušení)
Do jedné periody bychom takto mohli zapsat max. 24/2,5 = 9 vzorků.
Pro zjednodušení bychom zvolili přerušení každé 3 us tj. 8 vzorků na periodu.

Ale 8 vzorků na periodu je málo (4 na půlperiodu!).
Nemám s tím praktické zkušenosti, ale myslím že by bylo potřeba aspoň 16, lépe 32 vzorků na periodu aby signál trochu vypadal.
Zrychlit kód můžeme napsáním obsluhy přerušení v asembleru. (nezkoušel jsem)
Nebo můžeme napsat kód do hlavní smyčky (nepoužít přerušení)

[code] int main(void)
{
uint8_t i=0;

while(1)
{
PORTB = sin_tab*;
i++;
if (i==16) i=0;
}[/code]
Tady mi vyšel jeden běh smyčky za 0,7 us.
(Tato doba ale může záviset na překladači. Je třeba zkontrolovat a doladit v simulátoru.)
Po doplnění na 0,8 us (aby perioda 24 us byla tímto číslem dělitelná) dostaneme 30 vzorků na periodu.

Je vidět, že kmitočet 41 kHz už přináší určité problémy.

Berte prosím všechny časy s rezervou, dělal jsem jenom rychlé zkoušky v simulátoru Avrstudia.*