logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega16] Jak podłączyć mp3 do ADC w atmega16, aby poprawnie wyświetlało na skali LED?

seweryn888 31 Maj 2015 16:46 1407 26
REKLAMA
  • #1 14735119
    seweryn888
    Poziom 10  
    Witam !
    Chcę podłączyć mp3/radyjko do ADC ale nie wiem jak bo za każdym razem pojawia się wysoka wartość (nie znam się ale chyba z AREF :D ). I tu pytanie: Jak to podłączyć by wyświetlało mi poprawnie na skali LED.

    Oto kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dziękuję :D
  • REKLAMA
  • Pomocny post
    #2 14735152
    strikexp
    Poziom 27  
    A jakim napięciem zasilana jest MP3? I jakie wartości są na wyjściu audio? Założę się że to sinusoida.
    Zmierzenie chwilowego napięcia nic ci nie da bo ciebie interesuje wypełnienie i wartość szczytowa. Wrzuć sygnał na wzmacniacz operacyjny i drabinkę tranzystorową a uzyskasz zamierzony efekt.
    A co do twojego problemu to winne jest oczywiście napięcie odniesienia. Zapewne używasz domyślnego około 2.56V i wszystkie wyższe napięcia są interpretowane jako 1023.
  • #3 14735175
    seweryn888
    Poziom 10  
    Napięcie z MP3 to 5 V.

    Mam pytania:
    1. Jak pozyskać wartość szczytową ?
    2. Napięcie odniesienia zmienię łącząc AREF przez rezystor do VCC ?

    PS: Jestem początkującym więc proszę o wyrozumiałość :D


    Dzięki i Pozdrawiam
  • #4 14735200
    dondu
    Moderator na urlopie...
    1. Np. dodając zmienną ADCmax i przypisując jej nową wartość ADC, gdy została zmierzona większa niż była w zmiennej ADCmax.

    2. Napięcie odniesienia zmienia się:
    - programowo wybierając odpowiednie źródło,
    - i/lub podając na pin AREF takie napięcie jakie chcesz mieć (nie wyższe niż AVcc-0,2V).
    Patrz rozdział Analog to Digital Converter w dokumentacji mikrtokontrolera - szukaj: Changing Channel or Reference Selection

    Dodatkowo zapoznaj się z tym artykułem: http://mikrokontrolery.blogspot.com/2011/03/avr-adc-podlaczenie.html

    Ponawiam uwagę z poprzedniego Twojego tematu:

    dondu napisał:
    Zdecyduj się na jedno z rozwiązań ustawiania bitów:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie mieszaj tych dwóch sposobów, by kod był jednolity.

    Przykłady: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html

    i ponownie link byś nabył umiejętności, bo nieco Ci ich brakuje.
  • #5 14735221
    strikexp
    Poziom 27  
    1. Na to nie ma prostego sposobu bo sygnał jest modulowany. Mam kilka pomysłów ale są niewykonalne dla początkującego i samej ATmega.
    2. Samo Vcc jest beznadziejnym źródłem odniesienia, potrzebujesz specjalnego układu przypominającego tranzystor. Poza tym co ci da zmiana AREF na 5V skoro masz modulowany sygnał sinusoidalny.

    Moim zdaniem pomógłby ci tylko bardzo szybki przetwornik A/C tak z 220kHz, i matematyczna analiza odczytów. ATmega nie da rady, ma na pewniaka tylko 4kHz A/C i trzebaby kombinować z kondensatorami itp a to lipny sposób.
  • #6 14735266
    dondu
    Moderator na urlopie...
    strikexp napisał:
    ATmega nie da rady, ma na pewniaka tylko 4kHz A/C i trzebaby kombinować z kondensatorami itp a to lipny sposób.

    Minimalny czas konwersji (pomiaru) to 13µs, a to daje prawie 77ksps (77 tys pomiarów na sekundę). Pasmo jest jednak ograniczone do 38,5kHz, ale to i tak sporo więc wiele można było zrobić.

    4kHz to ograniczenie dla pomiarów różnicowych.
  • REKLAMA
  • #7 14735291
    strikexp
    Poziom 27  
    Faktycznie jak doczytałem to wygląda to znacznie lepiej, podobno do 100kHz przy 8 bitach znaczących. Ale to nie zmienia faktu że ATmega ma za wolny zegar do analizy częstotliwości.
    Możnaby jedynie określać wartość średnią i na jej podstawie sterować LED. Tylko jak tam jest sinusoida to trzeba to uwzględnić w pomiarach.
  • REKLAMA
  • #9 14735332
    strikexp
    Poziom 27  
    Tylko czy początkujący poradzi sobie z FFT :P Bo ja wiem że ona czyni cuda w sprzęcie pomiarowym jednak zastosowanie wymaga dość sporej wiedzy.
  • #10 14735372
    dondu
    Moderator na urlopie...
    strikexp napisał:
    Tylko czy początkujący poradzi sobie z FFT :P Bo ja wiem że ona czyni cuda w sprzęcie pomiarowym jednak zastosowanie wymaga dość sporej wiedzy.

    To już jest inna sprawa, ale nie pisz, że czegoś się nie da zrobić skoro jest to możliwe, a w sieci jest masę przykładów wraz z plikami źródłowymi. Podobnie z parametrami - zbyt dużo razy musimy Ciebie poprawiać. Zanim więc coś kategorycznego napiszesz, sprawdź proszę.
  • #11 14735477
    seweryn888
    Poziom 10  
    Dobra panowie mi tylko zależy żeby pobrać wartość wyliczyć procent i reszte dam sobie rady.
    Proszę tylko o pomoc wyliczenia wartości szczytowej i jaka jest maksymalna liczba żeby wyliczyć procent.

    Dodano po 19 [minuty]:

    Dobra ustawiłem napięcie odniesienia na 0.2 mniejsze od VCC.
    Tylko nie wiem dla czego gdy nic nie mam podłączone do pinu to świecą się obie diody.

    Dodano po 17 [minuty]:

    Powie mi ktoś jak ustawić REFS1=0 REFS0=1 za pomocą kodu ?

    Dodano po 5 [minuty]:

    Dobra już ustawiłem. Już widać efekty :D
  • #12 14735688
    dondu
    Moderator na urlopie...
    seweryn888 napisał:
    Dobra panowie mi tylko zależy żeby pobrać wartość wyliczyć procent i reszte dam sobie rady.
    Proszę tylko o pomoc wyliczenia wartości szczytowej i jaka jest maksymalna liczba żeby wyliczyć procent.

    Prosty algorytm wyłuskania wartości szczytowej (peak) otzymałeś już w poście nr #4.
    Maksymalną liczbę z ADC otrzymałeś w poście nr #2.

    seweryn888 napisał:
    Powie mi ktoś jak ustawić REFS1=0 REFS0=1 za pomocą kodu ?

    Oj kolego, kurs C: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html
    oraz kurs AVR: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html
    Podstawy naprawdę warto znać.
  • #13 14735903
    Konto nie istnieje
    Poziom 1  
  • #14 14737691
    seweryn888
    Poziom 10  
    Hmm chciałem obliczyć procent
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ale diody tylko migły. Co robię źle ?
  • #15 14737748
    tmf
    VIP Zasłużony dla elektroda
    ADC/1023 zazwyczaj daje jako wynik zero, a tylko jeśli ADC jest równe 1023 masz jako wynik 1, czyli finalnie 100. Chyba nie o to ci chodziło prawda? Odpowiedź dlaczego tak jest kryje się w standardzie języka C i domyślnych typach.
  • #16 14737796
    seweryn888
    Poziom 10  
    Czyli co mam zrobić by wyliczyć procent ?
  • REKLAMA
  • #17 14737808
    strikexp
    Poziom 27  
    Użyć innego typu zmiennej, takiego który pozwala obliczać na ułamkach, np. float.
  • #18 14737841
    seweryn888
    Poziom 10  
    zmieniłem na float i to samo
  • #19 14737885
    Konto nie istnieje
    Poziom 1  
  • #20 14737960
    seweryn888
    Poziom 10  
    Działa :D ale świecą wszystkie. I nie mogę tego wysterować potencjometrem. Ale mam pomysł czy ktoś dałby mi link do fajnego poradnika z kodem itp, jak zrobić coś takiego ? https://www.youtube.com/watch?v=MkHKWd-eYd0
  • Pomocny post
    #21 14738192
    Wirnick
    Poziom 30  
    seweryn888 napisał:
    zmieniłem na float i to samo

    A dlaczego nie korzystać z proporcji. (ADC *100)/1023 odpada pamięciożerny float.
    Co do bargrafu, to podziel 1023 na ilość (diod +1) i if (ADC== X) PORTp &=~(1<<LEDn).
  • #22 14738228
    Konto nie istnieje
    Poziom 1  
  • #23 14738521
    seweryn888
    Poziom 10  
    Wszystko fajnie. :D Proszę jeszcze tylko o wskazówkę jak podłączyć mikrofon do wzmacniacza operacyjnego bo na internecie są różne wersje.
  • #24 14738544
    Konto nie istnieje
    Poziom 1  
  • #25 14738686
    seweryn888
    Poziom 10  
    A jest najprostszy ?
  • Pomocny post
    #26 14738751
    Konto nie istnieje
    Poziom 1  
  • #27 14738811
    seweryn888
    Poziom 10  
    Dziękuję wszystkim za pomoc. :D
REKLAMA