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

Vazim si Tvoju snahu o samostatny pristup.

Tak v prvom rade, ten program fungovat nebude spravne, lebo ty jeden krat zavolas funkciu sinu() a potom sa ti uz program zasekne v nekonecnej slucke.
Skus na to ist takto:


#define TRUE 255
#define FALSE 0
#define MAX_KROK 1000 // ak bude Casova Zakladna nastavena na hodnotu 100us, potom bude perioda signalu 100ms, co zodpoveda 10Hz.
// Ak ma byt frekvencia vystupneho signalu napr 50kHz, potom napriklad pri MAX_KROK = 10 treba nastavit casovu zakladnu na hodnotu 2us

void fn_inicializacie(void);
uint8_t fn_test_cz(void); // funkcia, ktora vrati TRUE ak nastal okamih casoveho kvanta, napriklad 100us
void fn_generuj_jeden_krok_sinusu(uint16_t krok); 
fn_generuj_jeden_krok_trojuholnika(uint16_t krok);
uint8_t fn_tlacitko(void); // funkcia, ktora vracia po kazdom stlaceni na striedacku TRUE a FALSE. Funckia tiez obsahuje vsetky casove osetrenia proti zakmitom.

uint16_t krok = 0;
uint8_t tl_sinus = TRUE;

main()
{
   fn_inicializacie();
   while(1) {
      if  (fn_test_cz() == TRUE) {
         tl_sinus = fn_tlacitko();
        if (tl_sinus) fn_generuj_jeden_krok_sinusu(krok);
        else fn_generuj_jeden_krok_trojuholnika(krok);

         // ohranicenie hodnoty premennej krok
         krok = krok + 1;
         if (krok > MAX_KROK) krok = 0;
       }
   }
}

"jeden_krok_"znamena, ze v jednom casovom kvante ktore je definovane vysledkom funkcie fn_test_cz() spravis na vystupe jeden krok hodnoty z priebehu.

Oni ti v tom zadani nepisu, kolkymi krokmi ma byt ten vystupny signal aproximovany. Zpoza DA prevodnika VZDY polezie signal, ktory bude mat schody a rozdiel medzi dvoma najblizsimi schodmi nemoze byt principialne mensi, ako 1/256 UvystMAX. Ale rozdiel moze byt aj vacsi, to zavisi od zadania. V kazdom pripade, generovat trojuholnik s maximalnou jemnostou pri najrychlejsej zadanej zmene, t.j. pocas 1/4T vygenerovat 256 hodnot a to za cas 20us* 1/4 = 5us sa procesorom taktovanym 20MHz jednoducho neda. Pri 20MHz za 5us mcu spravi teoreticky maximalne 100 instrukcii, ak bude robit iba presuny v ramci registrov. To vsak na 256 zmien vystupnej hodnoty za tento cas jednoducho nestaci. Ale kludne moze byt trojuholnik generovany len 10 aproximacnymi hodnotami. Toto sa este veduceho opytaj, ci 50kHz je “frekvencia” jednej zmeny na vystupe DA alebo frekvencia vystupneho signalu. Ak plati b) potom z neho vymackni minimalny pocet tych aproximacii.