//================================= // PREVODNIK FREKVENCE 300Hz NA 140Hz // se zachovanim stridy signalu 5% az 95% //================================= // video: http://youtu.be/SC3zdPNKbbs // signaly na Arduinu (ATmega328) // D4 = OUT - vystupni signal (140Hz) // D5 = IN - vstupni signal (300Hz) //=================================================================================================== int high_in = 0; // doba trvani logicke "1" ve vstupnim signalu v poctech cyklu hlavni smycky int low_in = 0; // doba trvani logicke "0" ve vstupnim signalu v poctech cyklu hlavni smycky int pamet_high_out = 0; // vypoctena doba trvani logicke "1" ve vystupnim signalu (aktualizuje se po kazde sestupne hrane vstupniho signalu) int pamet_low_out = 0; // vypoctena doba trvani logicke "0" ve vystupnim signalu (aktualizuje se po kazde vzestupne hrane vstupniho signalu) int odpocet_vystupu = 0; // pri generovani vystupniho signalu se v teto promenne pocita, jak dlouho (kolik cyklu) ma jeste trvat nastavena uroven int stav_vystupu = 0; // pomocna promenna pro zapamatovani stavu vystupu byte dalsi_hrana = 0; // promenna, ktera se meni pri kazde (vzestupne i sestupne) hrane vstupniho signalu void setup(void) { pinMode(4, OUTPUT); pinMode(5, INPUT); } void loop(void) { // ============== vzorkovani vstupniho signalu ============== if (digitalRead(5) == HIGH && dalsi_hrana == 1) // prvni "1" vzorek po urovni "0" vstupniho signalu (prave nastala vzestupna hrana vstupniho signalu) { pamet_low_out = (15 * low_in) / 7; // prepocet na delku trvani vystupni logicke "0" (300Hz / 140Hz * delka trvani vstupni "0") - zaokrouhleno na INT ! low_in = 0; // vynuluje se pocitadlo delky "0" ve vstupnim signalu (vypoctena delka vystupni "0" uz je v pameti) dalsi_hrana = 0; // bude se cekat na sestupnou hranu } if (digitalRead(5)== LOW && dalsi_hrana == 0) // prvni "0" vzorek po urovni "1" vstupniho signalu (prave nastala sestupna hrana vstupniho signalu) { pamet_high_out = (15 * high_in) / 7; // prepocet na delku trvani vystupni logicke "1" (300Hz / 140Hz * delka trvani vstupni "1") - zaokrouhleno na INT ! high_in = 0; // vynuluje se pocitadlo delky "1" ve vstupnim signalu (vypoctena delka vystupni "1" uz je v pameti) dalsi_hrana = 1; // bude se cekat na vzestupnou hranu } if (digitalRead(5)== LOW) // vstupni signal je v "0" { low_in ++; // pocitadlo trvani "0" ve vstupnim signalu } else // vstupni signal je v "1" { high_in ++; // pocitadlo trvani "1" ve vstupnim signalu } // ============================================================================ // ============== generovani vystupniho signalu ============== if (odpocet_vystupu == 0 && stav_vystupu == 1) // kdyz odpocet vystupniho signalu dosahne cisla 0 a na vystupu byla nastavena "1" ... { digitalWrite(4, LOW); // ... vystupni signal se preklopi na "0" ... stav_vystupu = 0; // ... pomocna promenna, ktera si pamatuje stav vystupu se prepne do 0 odpocet_vystupu = pamet_low_out; // ... a z pameti se zjisti delka trvani nasledujici "0" } if (odpocet_vystupu == 0 && stav_vystupu == 0) // kdyz odpocet vystupniho signalu dosahne cisla 0 a na vystupu byla nastavena "0" ... { digitalWrite(4, HIGH); // ... vystupni signal se preklopi na "1" ... stav_vystupu = 1; // ... pomocna promenna, ktera si pamatuje stav vystupu se prepne do 1 odpocet_vystupu = pamet_high_out; // ... a z pameti se zjisti delka trvani nasledujici "1" } odpocet_vystupu --; // ============================================================================ }