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 ). I tu pytanie: Jak to podłączyć by wyświetlało mi poprawnie na skali LED.
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.
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
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.
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ć.
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.
Tylko czy początkujący poradzi sobie z FFT 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ę.
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 ?
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 ?
Tylko czy początkujący poradzi sobie z FFT Bo ja wiem że ona czyni cuda w sprzęcie pomiarowym jednak zastosowanie wymaga dość sporej wiedzy.
Nikt też nie mówi że musowo używać FFT (DFT też nie)
seweryn888 napisał:
1. Jak pozyskać wartość szczytową ?
Bardzo prosto.
Próbkujesz sygnał i jeżeli Wartość chwilowa jest większa od poprzedniej to zwiększasz ją.
Wcześniej Wartosc_chwilowa trzeba jeszcze obrobić. Sprowadzić składową stałą do 0 i wyprostować.
Ostatecznie wychodzi takie coś:
Kod: C / C++
Zaloguj się, aby zobaczyć kod
I jednocześnie zmniejszaj wartość zmiennej Szczyt powoli do 0;
Np:
Kod: C / C++
Zaloguj się, aby zobaczyć kod
A to po to żeby mogła spaść jak Wartosc_chwilowa spadnie.
Jest to analogiczne do działania zwykłego analogowego detektora szczytowego:
https://www.circuitlab.com/circuit/75p326/basic-peak-detector-01/ Sygnał jest prostowany na diodzie.
Jak jest większy od wartości sygnału zapamiętanego w kondensatorze to doładowuje tenże kondensator (czyli zapamiętuje w nim nową większą wartość sygnału).
Jednocześnie kondensator jest powoli rozładowywany przez rezystor. Aby wartość na kondensatorze spadała gdy sygnał na wejściu zaniknie (albo zmniejszy swoją amplitudę). Bo inaczej nie mógł by spaść (dioda może jedynie doładować kondensator, nie może go rozładować).
Taka analogia do układu analogowego jest dobra bo pozwala w prosty sposób zrobić programowo wiele rzeczy na które ciężko wpaść tak od razu.
strikexp napisał:
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.
Trochę naciągane stwierdzenie. Sygnał nie jest modulowany. Można by raczej powiedzieć że to on jest modulacją (sygnał).
seweryn888 napisał:
2. Napięcie odniesienia zmienię łącząc AREF przez rezystor do VCC ?
Lepiej to zrobić wybierając VCC w rejestrach ADCka.
Czyli tak jak napisał dondu:
dondu napisał:
2. Napięcie odniesienia zmienia się:
- programowo wybierając odpowiednie źródło,
strikexp napisał:
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.
Trochę dużo nieścisłości w tym co piszesz. Jakaś drabinka tranzystorowa, sygnał sinusoidalny.
W każdym razie VCC (jeżeli jest to stabilizowane 5V) nie jest takie złe do analizy sygnału audio. Tam nie trzeba dużej dokładności.
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.
Działa 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
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).
Po prostu podłącz za pomocą jednego z tych sposobów. Jak będzie minimalnie gorszy albo minimalnie bardziej skomplikowany (1 rezystor więcej) to się nic nie stanie.