
Niniejszy projekt opisuje sposób realizacji sprzętowej i programowej detekcji pojedynczej częstotliwości z wykorzystaniem niewielkiego, 8-bitowego mikroprocesora z rodziny PIC. Taki układ może być wykorzystywany do wykrywania obecności konkretnej częstotliwości w sygnale analogowym, na przykład w sygnale audio. Znajdzie on zastosowanie w urządzeniach zdalnego sterowania, do wykrywania dźwięków muzycznych i w każdej innej sytuacji, gdzie zachodzi potrzeba wykrycia w sygnale konkretnej częstotliwości, niezależnie od występujących innych pasm czy zakłóceń.
Projekt oparto o procesor PIC12F683 z 8-ma wyprowadzeniami. Jedynie garść dodatkowych elementów – rezystorów i kondensatorów – wystarczy, by układ był w stanie analizować sygnały analogowe i wysterować odpowiednie swoje wyjście w przypadku wykrycia pożądanej częstotliwości. Układ może być równie dobrze wykorzystany jako część większego projektu.
W poniższych akapitach opisano dokładne działanie układu jak i programu mikroprocesora. Autor zawarł także dokładny opis algorytmu cyfrowego przetwarzania sygnału, zaimplementowanego w programie dla procesora. Udostępnione zostały zarówno skompilowane wsady, jak i program źródłowy napisany w assemblerze.
Sam układ został zaprojektowany w oparciu o tanie i szeroko dostępne elementy i może zostać skonstruowany nawet na płytce stykowej. Do testów autor radzi wykorzystać darmowe oprogramowanie do generowania plików WAV zawierających konkretne tony czy przejścia między nimi.
Schemat układu można zobaczyć poniżej.

Układ zasilany jest napięciem 5V, które można uzyskiwać np. z typowego stabilizatora 7805. Wbudowany w procesor przetwornik analogowo-cyfrowy jest zdolny mierzyć napięcia z zakresu od 0V do napięcia zasilania (zwykle 5V). Ponieważ sygnał analogowy może wahać się od napięć ujemnych do dodatnich, musi zostać przesunięty w domenie napięć przed podaniem na przetwornik A/D. Służy temu dzielnik rezystorowy R1/R2, którego napięcie ustalono na połowę wartości napięcia zasilania. Kondensator C1 służy sprzęganiu wejścia sygnałów zmiennych z wejściem przetwornika A/D. Przesunięcie jest realizowane jak pokazano na poniższych wykresach.


Rezystory R3/R4 pracują jako dzielnik napięcia służący wyborowi szukanej częstotliwości. Procesor odczytuje to napięcie i odpowiednio dobiera współczynniki algorytmu, aby określić, czy szukana częstotliwość jest obecna w podawanym sygnale.
Rezystory R5/R6 pracują jako kolejny dzielnik napięcia, tym razem służący wyborowi wartości progowych częstotliwości. Pozwala to na ustalanie przez użytkownika histerezy stosowanej przez algorytm i wybranie zakresu szukanej częstotliwości.
Kondensator C2 służy jako filtr napięcia zasilającego procesor.
Każde wyprowadzenie mikroprocesora posiada konkretną funkcję, jak opisano poniżej:
1. VDD – zasilanie układu, +5V.
2. Wyjście szeregowe – na tym wyjściu dostępne są dane zawierające rezultat pracy algorytmu. Aby podłączyć urządzenie do komputera, potrzebny jest dodatkowy układ konwertujący sygnał do poziomów standardu RS-232.
3. Ustawienie wartości progowej częstotliwości – napięcie podawane na to wejście odpowiada za wybór histerezy częstotliwościowej algorytmu wykrywającego.
4. Wybór szukanej częstotliwości – podanie stanu niskiego na to wyprowadzenie powoduje zmianę wartości szukanej częstotliwości w trakcie pracy programu procesora; stan wysoki nie ma wpływu na zmianę częstotliwości po uruchomieniu procesora.
5. Wykrycie częstotliwości – na tym wyjściu pojawia się stan wysoki, jeśli na wejściu, biorąc pod uwagę ustaloną histerezę, pojawia się szukana częstotliwość. Stan wysoki trwa tak długo, jak sygnał wejściowy zawiera szukaną częstotliwość.
6. Ustalenie szukanej częstotliwości – napięcie na tym wejściu służy ustaleniu wartości szukanej częstotliwości.
7. Wejście sygnału.
8. Masa zasilania.

Wartość szukanej częstotliwości zależy od wartości napięcia na wyprowadzeniu 6. procesora. Zakres wykrywanych częstotliwości zawiera się w przedziale od 100 do 2148 Hz. Program procesora sprawdza wartość napięcia na tym wyprowadzeniu zaraz po podłączeniu zasilania; następnie stan wejścia jest ignorowany, chyba że zostanie zmieniony na niski stan wejścia 4. Aby zaprogramować nową częstotliwość, należy podać wybrane napięcie na wyprowadzenie 6., a następnie stan niski na wyprowadzenie 4. na co najmniej 100 ms. Napięcie na wejściu 6. można wyliczyć na podstawie zależności:
V(ustalające szukaną częstotliwość) = VDD * (szukana częstotliwość – 100)/2048
W ustaleniu napięcia może pomóc też powyższy wykres. W przypadku stosowania rezystorowych dzielników napięcia do ustalenia napięcia na wejściu 6. należy pamiętać, że krytyczne nie są wartości pojedynczych rezystorów, ale stosunek ich oporności. Autor zaleca stosowanie rezystorów o wartościach poniżej 100 Ω. Możliwe jest także zastosowanie potencjometru do płynnej zmiany wartości szukanej częstotliwości.


Histereza ustalana jest za pomocą napięcia podawanego na wyprowadzenie 3. Dzięki temu niewielkie odchyły wejściowej częstotliwości od zadanej wartości nie będą miały wpływu na odpowiedź układu. Układ nie pozwala na zastosowanie zerowej histerezy, ponieważ wtedy obecność szumu w sygnale wejściowym powodowałaby fałszywe odpowiedzi. Wartość napięcia ustalającego histerezę można wyliczyć ze wzoru:
V = VDD * [342 * V(ustalające szukaną częstotliwość) – 27] / 1024
Także powyższy wykres będzie pomocny w wyborze odpowiedniego napięcia, a graf – w zrozumieniu działania histerezy.
Układ został wyposażony także w wyjście szeregowe, na którym wystawiane są dane stanowiące rezultat działania algorytmu. Wyprowadzenie może pozostać niewykorzystane lub posłużyć do dokładniejszej analizy odpowiednich wartości. Dane na wyjściu szeregowym mają format CSV (wartości oddzielonych przecinkami) i podawane są w kolejności: szukana częstotliwość w Hz, górny próg histerezy, dolny próg histerezy, chwilowa wartość progowa, wskaźnik detekcji, wartość wyjściowa algorytmu odpowiadająca danej częstotliwości. Przykładowe dane wyglądają więc następująco:
01002,08394,06528,06506,X1,11063
Oznacza to, że zadana częstotliwość wynosi 1002 Hz, górna wartość histerezy 8394, dolna – 6528, chwilowa wartość progowa – 6506, X1 wskazuje, że wykryto szukaną częstotliwość, ponieważ odpowiedź algorytmu (11063) jest większa niż górna wartość histerezy. Jeśli częstotliwość nie zostałaby wykryta, w miejscu „X1” układ przesłałby wartość „X0”.
Na stronie projektu zostało także szeroko opisane działanie samego algorytmu, m.in. sposób implementacji algorytmu przetwarzania sygnału Goertzela, wywiedzionego z transformaty fourierowskiej (algorytm zachowuje się jak bardzo wąski filtr pasmowy), czynników wpływających na szybkość działania algorytmu, problemów związanych z aliasingiem sygnału, wydajności działania w obecności szumu białego czy problemami związanymi z przesterowaniem wejścia urządzenia.
Autor udostępnia również kod źródłowy procesora, napisany w języku assembler, dla przypadku taktowania procesora wewnętrznym oscylatorem 8 MHz. Użycie innej częstotliwości taktowania wymaga zmian w oprogramowaniu. W obecnej wersji oprogramowania częstotliwość próbkowania została ustalona na 4400 Hz, a ilość próbek używanych w algorytmie na 200. Oprogramowanie można łatwo przenieść na jakikolwiek 8-bitowy procesor z rodziny PIC.
Źródło