Analizator Widma Akustycznego

Przedstawiam projekt analizatora widma na ATmega8. Wyświetlanie odbywa się na LCD alfanumercznym – 16*2 lub 24*2 pól (HD44780). Wejście – sygnał audio. Płytka zawiera niezbędny filtr dolnoprzepustowy (chebysheva), stabilizator.

Autorem programu jest Hunterhouse (dziękuje z tego miejsca za bezcenną pomoc w przerabianiu programu). Ja wykonałem schemat, filtr, i płytkę drukowaną. Poniżej kilka fotek, można pobrać też filmy. Tutaj znajduje się rozmowa o przerabianiu programu, polecam lekturę przed wykonaniem urządzenia…

UWAGA – jest nowa lepsza wersja analizatora (V2) – TUTAJ!

Kilka uwag co do montażu.

Zamiast kondensatorów C4 i C5 można wlutować zwory – uC jest to obojętne, i z tego co zauważyłem nie ma różnicy w wyświetlaniu widma. Płytka ma kształt wyświetlacza LCD 16*2, została zaprojektowana w ten sposób aby można było przykręcić ją pod wyświetlacz. Jeśli twój LCD 24*2 ma takie samo umiejscowienie pinów, nie ma problemu. W przypadku wyświetlaczy z pinami po boku (8*2 rzędy) należy odpowiednio połączyć je przewodami. Pola na potencjometry są niewielkie, jeśli nie posiadamy takowych, można podlutować je od strony druku, lub raz ustawić i wlutować dzielniki R. Niestety nie udało mi się bardziej tego upchać, mając do dyspozycji elementy przewlekane. Rezystor „LCD LED” to zasilanie podświetlenia LCD – jeżeli nasz wyświetlacz posiada już rezystory, można wlutować w to miejsce zworę.

Uwagi co do uruchamiania.

Najważniejszą rzeczą to podanie odpowiedniego sygnału do urządzenia. Jego amplituda musi się zawierać w przedziale szyn zasilania, na wysokości 2.5V. Sygnał o większej amplitudzie po przejściu przez WO straci wierzchołki (przester) – uC będzie błędnie liczył widmo.
1.Masę sygnału można podpiąć do „masy analogowej” urządzenia, oznaczonej jako „Agnd” – jest to sztuczna masa zrobiona na dzielniku R 1:1 między szynami zasilania. Sygnał podajemy bezpośrednio pod wejście IN. Jest to wejście WO o dużej impedancji wejściowej.
2.Układ można zasilić symetrycznie -2.5V / +2.5V, (sygnał jak wyżej).
3.Jeśli masa układu i masa sygnału audio MUSZĄ być połączone, trzeba wykonać dzielnik na rezystorach, który podniesie nasz sygnał na wysokość 2.5V. LUB TEŻ pokombinować z kondensatorem odzielającym składową stała, ale należy zadbać aby sygnał zawierał się pomiędzy szynami zasilania.

Kalibracja/regulacja.

Potencjometry R12 i R13 służą do wzmocnienia podanego sygnału dla górnej i dolnej części pasma. Przed wejściem uC sygnał nie powinien być przesterowany. W programie zmieniamy stałą CZULOSC – w dowolnym zakresie (np. od 10 do 50) (znajduje się w jednej z pierwszych linii programu). Po prostu należy ustawic układ tak, aby prawidłowo wskazywał częstotliwość, a wychylenie wg własnego gustu. Polecam jakiś generatorek sinusa na wejście, i oscyloskop przed wejście uC – dopilnujemy aby sygnał nie był przesterowany, i sprawdzimy czy nasze słupki prawidłowo się wychylają.

Filmiki z linku to nagrany układ pracujący wg załączonego schematu. Większy LCD 24*2 teoretycznie powinien chodzić woniej, to logiczne że program ma więcej do liczenia i wyświetlania. Na filmikach jest przeciwnie, mniejszy wyświetlacz chodzi wolniej, da się to zauważyć. Wnioskuje że ma po prostu wolniejszy sterownik, wolniej odpowiada dla uC. Efekt końcowy to w bardzo dużej mierze odpowiednie ustawinie urządzenia, i podanie sygnału na odpowiednim poziomie. Jak widać – da się uzyskać dobry efekt.

Jeszcze sprawa uC – fusebity ustawiamy na „zewnętrzny kwarc z kondensatorami 10-16MHz” (1110), aktywujemy bit CKOPT. Można poeksperymentować z wyższymi wartościami kwarcu. U mnie całość potrafiła bezawaryjnie chodzić przy 27MHz – oczywiście podajemy tę wartość w programie. Zdjęcia przedstawiają pierwszą płytkę, musiałem nanieść na niej pewne poprawki. Ta z załączona jest poprawiona. Pliki EAGLE V4.11e. Po załadowaniu kliknąć RASTNES. Jeśli ktoś zechce wykonać lepszą płytkę, z lepszym filtrem, w smd, itp, usprawnić program – bardzo proszę.

Pobierz wszystkie pliki – *.bas (kod źródłowy bascoma), *.bin *.hex skompilowane, *.png (schemat), *.sch *.brd (EAGLE 4.11), *.pdf (pcb)




English description. I don’t guarantee that is correctly translated! If you have some questions, or see some bugs in this text, or you can help with translate, please contact me. The autor of the program is user Hunterhouse from elektroda.pl forums (login is requaired to send PM). I have made pcb and opamp filter, and give an idea for use with LCD display.


ATTENTION – there is new improved version of analyzer (V2) – HERE!

There is only one notice you must keep to, with format of input signal. It must be between GND and 5V, with amplitude at 2.5V height. You can connect your signal gnd to „agnd” on board, and then signal simply to „IN”. Or, if yours gnd’s (signal and power) must be connected together, then you must create divider with resistors, witch raise your signal from 0v to 2.5v height, and then connect to „IN”. Check signal with oscilloscope before uC, if it is not clipping – this is very important. If opamp clip your signal, then uC will be badly calculating spectrum. The „agnd” on board is just a artificial gnd maked on resistor divider between gnd and 5v.

With R13 and R12 you can set the gain of input signals. Signal is splitted on two signals, higher band (900hz – infinity) is just gained in opamp, and a lower band (0 – 900hz) i filtered in chebyshev filter to cut it at 900hz. This is important too.

If you have display 16*2 then you use the „16*2 program”. In program in first lines, there is „CZULOSC” – you can calibrate the sensitivity. Type there digits between 15 – 40 and check how its working. Compile the file in BASCOM compiler and write to your atmega8. The PCB’s are EAGLE files, you must use the 4.11 version. You must set the fusebits in atmega, to „external quartz with capacitors high freuency”. Other things you can read from scheme.

Other thing is that, you can experiment with the higher crystal. In project is 16MHz, but i give once 27MHz and spectrum was displayed little faster. In that case you must change the „$crystal = 16000000” line in program, and wrote there correct frequency. But if your LCD display is corresponding slowly, there nothing you can do :(. I tested with a 16*2 and 24*2 displays. The 16*2 was much slower than 24*2. This is some kind of absurd, because with bigger LCD (24*2) program has more things to do, but in that configuration 24*2 was displayed much faster than 16*2.

And i forgot, display MUST be the HD44780 – other may do not work.

Download all files – *.bas (bascom source code), *.bin *.hex compiled codes, *.png (scheme), *.sch *.brd (EAGLE 4.11), *.pdf (pcb)




Русское описание (Спасибо Maxis).

внимание – новая улучшенная версия анализатора (V2) –здесь!

Автор программы – пользователь Hunterhouse с форума elektroda.pl (логин – requaired, чтобы отправить ПС). Я сделал схему, печатную плату и фильтр , и дал идею для использования LCD дисплея.

Обратите внимание что входной сигнал должен быть от 0 до 5В (с амплитудой не более 2.5В). Если ваш сигнал превышает данные значения вы должны пропустить его через резистивный делитель напряжения. Проверьте сигнал с помощью осциллографа на входе микроконтроллера не обрезается ли он – это очень важно. Если сигнал обрезается, то анализатор будет ужасно вычислять спектр.

Переменными резисторами R13 и R12 вы можете изменять входной сигнал по напряжению. Далее сигнал делиться на: высокочастотный (900hz – бесконечность) пропускается на микроконтроллер и низкочастотный (0 – 900hz) отсекается фильтром Чебышева.

Если вы используете дисплей 16*2 необходимо прошить микроконтроллер программой “16*2 program”. В программе в первых строчках, есть параметр “CZULOSC” – им вы можете калибровать чувствительность. Впишите туда число от 15 до 40 и проверьте как это работает. Соберите файл в компиляторе BASCOM и прошейте ваш atmega8. PCB’s – файлы EAGLE , необходимо использовать версию 4.11. Вы должны установить fusebits в atmega, как “внешний кварц высокой частоты” (CKOPT=0, все остальные=1). Всё остальное вы можете прочитать из схемы.

Также вы можете экспериментировать с более высокочастотным кварцем. В проекте используется кварц 16MHz, но я однажды поставил 27MHz, и спектр отображался намного быстрее. В этом случае Вы должны изменить строку “$crystal = 16000000 ″, необходимо указать там верную частоту. Но если ваш жидкокристаллический дисплей работает медленно, этим вы ничего не сможете изменить. Я проверял с 16*2 и 24*2 дисплеями. Дисплеи 16*2 были намного медленнее чем 24*2. Это – немного абсурдно, потому что с большим LCD (24*2) программа имеет больше команд для вычисления спектра, но в конфигурации 24*2 спектр отображался намного быстрее чем 16*2.

Дисплей ДОЛЖЕН быть на основе чипа HD44780 – другие могут работать некорректно.

Загрузить все файлы – *.bas (исходный текст программы bascom), *.bin *.hex (отткомпилированные программы), *.png (схема), *.sch *.brd (EAGLE 4.11), *.pdf (печатная плата)

От переводчика:
Данная схема корректно работает с микроконтроллером ATmega8L.
Если у вас работает только 8 первых столбцов на дисплее то проблема решается изменением строк в исходных текстах

Sample_h:
Config Adc = Single , Prescaler = 2 , Reference = Avcc

на строки

Sample_h:
Config Adc = Single , Prescaler = 4 , Reference = Avcc

Номиналы всех резисторов и конденсаторов должны точно соответствовать указанным на схеме, иначе отображаемый спектр не будет соответствовать действительности.
Рекомендуется использовать дисплей с негативным типом подсветки – выглядит намного красивее J.
Если у вас есть вопросы или вы заметили неточности в переводе пожалуйста свяжитесь с автором статьи или со мной. Перевод предоставлен Черкановым Максимом ака maxis (maxis@novline.ru).

VFD 20*2 display
[flashvideo file=”http://www.mm.pl/~kisiel-ket/diy.elektroda.eu.video.server/analizator2.mp4″ image=”http://mdiy.pl/wp-content/uploads/video_images/analizator2.jpg” /]

LCD 24*2 display
[flashvideo file=”http://www.mm.pl/~kisiel-ket/diy.elektroda.eu.video.server/analizator1.mp4″ image=”http://mdiy.pl/wp-content/uploads/video_images/analizator1.jpg” /]

5.00 avg. rating (96% score) - 1 vote

87 komentarzy

  1. Мужики пришлите прошивку отлаженную для lcd16×2, а то у меня пол индикатора работает

  2. Witam! Zrobiłem cały układ i muszę przyznać że troche się namęczyłem zanim wogóle coś pojawiło się na wyświetlaczu:) jestem początkujący w programowaniu procesorów…tak czy inaczej jest problem, ponieważ wydaje sie jakby wyświetlacz działał. Przez górną i dolną „krawędź” przelatuje w dosyć szybkim tempie jasna linia, a w międzyczasie jest przejaw poprawnego działania ale tylko na „kreskach” owych lini. Próbowałem już ustawiać fusebity ale zarówno na zewnętrznym jak i na wewnętrznym kwarcu nie chce zadziałać poprawnie. Wiesz gdzie jeszcze może leżeć błąd, czy jest możliwe że przyczyna leży w montażu …??? Będę wdzięczny za pomoc.
    Pozdrawiam.

  3. No i działa, tylko że niezupełnie bo tylko połowa widma.Ustawiałem tak jak pisałeś prescaler, na 4 i niestety nie pomogło. Wydaje mi sie że to wina nieodpowiednich fusebitów, tylko że tych ,1110, jest w mojej wersji bascoma 1.11.9.5 aż kilka i nie wiem dokładnie którą wybrać…byłbym wdzięczny gdybyście mogli dokładnie napisać jakie fusy ustawić. U mnie są oznaczone dokładnie tak jak tutaj http://www.engbedded.com/fusecalc/ a większość oznaczeń tam zawartych jest mi niestety nieznana.
    PS: Projekt świetny i chiałoby się żeby działał w całości…:)

    • Witam
      Czy poradziles sobie z tym problemem?
      Bo ja mam taki sam tez tylko polowa wyswietlacza mi sie wyswietla czy mozesz mi powiedziec jak sobie z tym poradzic
      zmienialem prescaler na 2,4,8 i nic to nie dalo
      prosze o pomoc
      moj kontakt to
      kulamario@vodafone.ie

    • Witam,mam ten sam problem jeżeli ktoś go rozwiązał prosiłbym o kontakt na maila daniel146@op.pl

    • Właśnie zauważyłem że jak ustawię na wewnętrzny oscylator 8Mhz to działa poprawnie lecz z lekkim opóźnieniem;/

  4. Witaj Krzysiek, najlepiej jak pokażesz screenshot z ustawień fusebitów z poziomu bascoma, nie programuje nim więc nie mam teraz nawet możliwości otworzyć karty fusebiów. generalnie ma być „external crystal high frequency”, i włączyć bit CKOPT. Aby sprawdzić czy pracuje na zewnętrznym rezonatorze wystarczy rezonator odłączyć na chwilę, i będzie wiadomo, program powinien się zatrzymać :)

    Ale powiem ci że jeśli ustawisz prescaler na 4 i przy 16MHz nadal nie widać połowy widma, to chyba trafiła ci się mizerna sztuka i musisz dać jeszcze większy prescaler. Pokombinuj, bo przy preskalerze 4 przetwornik i tak jest mocno przetaktowany. Jeśli to nie pomoże, szukaj błędu w filtrze, może nie dochodzi sygnał?

  5. На основе этой конструкции собрана цветомузыка.
    Смотрим здесь – http://bascom.at.ua/publ/cvetomuzyka_quotdetka_001quot/1-1-0-20

  6. Witam, przymierzam się do zrobienia tego cuda :D Mam programator pod Atmege16 i z tego powodu zmieniony schemat analizatora pod Atmege16. I tu jest mały problem jestem początkującym „programistą” a piny/porty nieco się różnią od Twojego schematu. Czy mógłbyś rzucić okiem i napisać mi na maila np co mam zmienić w programie? Analizator lcd 2x 16
    To jest link na elektrode z nowych schematem – http://www.elektroda.pl/rtvforum/download.php?id=375250
    Pozrawiam :)

    • Robił ktoś to na AtMega32, bo nie wiem jak podłączyć wyświetlacz.

  7. Tomec dzięki za motywacje do stworzenia wersji 2 analizatora, wkrótce się pojawi!!! :)

  8. Hi
    what the pins name on the lcd
    eample : maga8-pin4 > lcd-d3
    thanks

  9. buzqurd

    lcd_7 = Portd7
    lcd_6 = Portd6
    lcd_5 = Portd5
    lcd_4 = Portd4
    lcd_e = Portd3
    lcd_rw = Portd2
    lcd_rs = Portd1

    Look here, i have made version 2, it’s WAY better documented than this.
    http://diy.elektroda.eu/analizator-widma-akustycznego-v2/

  10. Zmontowałem dwa analizatorki (w układzie stereo) i niestety połowa wyświetlacza wyświetla się, pomimo kręcenia PRkami. Podłączyłem wyświetlacz 2×40 i tylko 8 słupków się pojawiło.
    Co jest nie tak?

  11. thank u for beautiful project
    i am making a spectrum analyzer with fft function but i have a problem
    my problem is display sample on lcd , i was saw your code , i dont understand how display charachter on lcd
    Lazienka_jest_zamknieta = Wynik_o(k) + Uklad
    Line1d(k) = Lookup(lazienka_jest_zamknieta , L1)
    Line2d(k) = Lookup(lazienka_jest_zamknieta , L2)
    Line3d(k) = Lookup(lazienka_jest_zamknieta , L3) ‚xx
    Line4d(k) = Lookup(lazienka_jest_zamknieta , L4) ‚xx

    Locate 1 , K
    Lcd Chr(line1d(k))
    Locate 2 , K
    Lcd Chr(line2d(k))
    Locate 3 , K ‚xx
    Lcd Chr(line3d(k)) ‚xx
    Locate 4 , K ‚xx
    Lcd Chr(line4d(k))
    .
    .
    .
    L1: ‚efekt 0 1 2 >>>>!<<<>>>!<<<< efekt 4
    Data 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 1 , 3 , 5 , 7 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 1 , 3 , 5 , 7 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 0 , 1 , 2 , 3 , 3
    up example for lcd and lable L1 for data table for lcd charachter you explain me in this by english language
    very very thank u
    excuse me for my english language is poor

    • ”xx means only that this line is needed only on lcds with 4 lines.

      L1 table holds data for all bars, for all effects, for one lcd line.

      k is an index

      Wynik_o holds the calculation result, with k index there are hold bar results for each bar (in example, for 4*20 lcd index k works from 1 to 20)

      lazienka_jest_zamknieta is only a temporary variable with a funny name :)

      Lookup gets data from L1 table and write to Line1d

      Line1d and such, holds data for bars for whole lcd line

      Locate 1 , K set lcd cursor to firs line, at a char given from k index

      Lcd Chr (line1d(k)) displays one character from line1d variable at k index

      This whole table looks messy but try to change some values and check how program works – you will get it :) I can’t now describe how table works because i don’t remember :)

  12. thank u for answer me but more help me because i make a mini spectrum with dot matrix 8*8 and that project without fft and that after sampling whit ADC data compare with a rang value and save value’s suitable dot matrix for example
    if (a>20)
    row = 0x07
    if (a>10 )
    row = 0x03
    .
    .
    .
    i want know in this project how display on lcd .more explain or present other source that show me what it work
    very thank u

  13. Hello. What is the marking of the LCD 24*2 end VFD 20*2 display whith yoy used in your wideo???

  14. I try the 16×2 LCD but not success. can you provide the source code again.

  15. można prosić o nazwę drugiej piosenki co leci na wyświetlaczu vfd 2*20 ?

  16. Witam!
    Próbuję właśnie przerobić kod programu obsługującego LCD 16×1, a tak dokładnie muszę przerobić ten analizator tak, aby działał jak kolorofon 4-kanałowy (tylko niższych tonów), czyli wysterowanie tylko 4 np. diod. Dodam, że nie miałem wcześniej z Bascomem do czynienia ;)
    Pytanie 1 z n :
    Wyrzuciłem z programu definicję wyświetlacza zaraz za zmiennymi – OK?
    Pytanie 2 z n :
    Jeżeli chciałbym zobrazować tylko niższe pasmo, to wszystkie funkcje typu SAMPLE_H i PRZELICZ_H mogę usunąć?
    Pytanie 3 z n :
    Jak powinna się zmienić część programu odpowiedzialna za wyświetlanie wyników na LCD, tak żeby wysterować tylko te kilka diod?

    Byłbym bardzo wdzięczny za pomoc
    Mogę nawet ofiarować punkty na elektrodzie ;)
    Pozdrawiam
    Ernest

  17. P.S.
    Oczywiście chcę przerobić analizator 16×2 a nie 16×1 ;)

    Ernest

    • Wybacz nie pomogę, nie mam czasu. Nie mam także samego układu. Proszę pytać na forum elektrody, tam na pewno ktoś się zainteresuje :)

  18. Здравствуйте!
    Помогите пожалуйста, собрано все вроде правильно, но не работает.
    Мигает одна строчка.
    фото – http://rghost.ru/19861291

  19. Witam. Jaki jest algorytm obliczania amplitudy dla danej częstotliwości? Grzebałem w sieci i znalazłem transformaty Fouriera ale nie wiem za bardzo jak sie do tego odnieść… Może tutaj inaczej jest wyliczana amplituda. ;)

  20. „chebysheva” – co to za amerykański potworek? Przecież to ma polską nazwę: filtr Czebyszewa.

  21. Hello,when i want change code in bascom it does not compilate,appear 2 mistakes with lines 246,271 Sample_l and Sample_h(Error 369 Name used by const or variable) in all versions of program.HELP!

  22. Or give me ready hex and bin,need change crystal in 24MHz

  23. Ja mam ten sam błąd:
    Error : 369 Line : 239 Duplicate label name used by const or variable [SAMPLE_L] , in File : C:\analizator20x4.bas
    Error : 369 Line : 264 Duplicate label name used by const or variable [SAMPLE_H] , in File : C:\analizator20x4.bas

    Co jest nie tak z kodem?

    • Kod jest ok, z tym że był pisany na starszej wersji kompilatora. Wersja kompilatora 2.0 i nowsze wprowadzają sporo zmian i możliwe że coś się gryzie.

      Mam pytanie. Po co korzystać ze starej wersji analizatora skoro jest nowsza, podlinkowana kilkukrotnie w artykule powyżej?

  24. Masz racje kod daje się skompilować w wersji 1.11.9.0.

    Nie byłbym sobą gdybym nie sprawdził obu wersji analizatora. :)

  25. Witam
    Plik programu nie chce mi sie kompilowac
    wywala mi blad error 369 duplicate label name used by const or variable

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Proszę pozostawić te dwa pola tak jak są: