Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR - Pomiar adc atmega8 sprawdzenie kodu

krzysiekwfd 08 Mar 2015 23:20 5763 97
  • #61 08 Mar 2015 23:20
    Wirnick
    Poziom 26  

    To jest sukces podparty oklaskami :D
    Też jestem na początku tajemnicy AVR. Myślę, że opóźnienia pętli przez delay musimy odrzucić. Pozostają funkcje z określoną ilością pomiarów lub timery sprzętowe(przerwania). Mamy reakcję na pierwsze klaśnięcie, ustawiony interwał czasu na drugie klaśnięcie. A jakby tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod
    , testować czy nastąpiło drugie klaśnięcie.

  • #62 09 Mar 2015 09:44
    Wirnick
    Poziom 26  

    Mnie jako elektronika, urzekła historia tego tematu.
    Założyłeś pomiar wartości analogowej (x>700), lecz mikrofon ma sygnał analogowy o częstotliwości akustycznej do 100kHz. Wynikiem pomiar(1) może być wartość od 0 do max, czyli wartość przypadkowa. Rozwiązaniem na tym etapie może być sprzętowe uśrednienie(całkowanie) sygnału z mikrofonu - kondensator na wyjściu mikrofonu.
    Innymi sposobami, to porównywanie próbek klaśnięć i wiele innych sposobów.

  • #63 09 Mar 2015 10:29
    krzysiekwfd
    Poziom 11  

    quote="Wirnick"]Mnie jako elektronika, urzekła historia tego tematu.
    Założyłeś pomiar wartości analogowej (x>700), lecz mikrofon ma sygnał analogowy o częstotliwości akustycznej do 100kHz. Wynikiem pomiar(1) może być wartość od 0 do max, czyli wartość przypadkowa. Rozwiązaniem na tym etapie może być sprzętowe uśrednienie(całkowanie) sygnału z mikrofonu - kondensator na wyjściu mikrofonu.
    Innymi sposobami, to porównywanie próbek klaśnięć i wiele innych sposobów.[/quote]
    tyle ze w moim przypadku nie jest to sm mikrofon tylko cała płytka podłączone do wejścia adc1 którą przy klaśnięciu generuje napięcie w zakresie 1,5-3,2V

    Cytat:
    uint8_t i = 0;
    while(i<10){if(pomiar(1)>700) PORTC^=(1<<led1);i++;}


    zastanawia mnie jaki cel ta linijka wykonywanie 10razy sprawdzenie czy wartość adc przekroczyła wartosc 700 a później świecenie diodą raczej wyglądało by to na ten sam efekt co wcześniej

  • #64 09 Mar 2015 10:57
    dondu
    Moderator Mikrokontrolery Projektowanie

    krzysiekwfd napisał:
    tyle ze w moim przypadku nie jest to sm mikrofon tylko cała płytka podłączone do wejścia adc1 którą przy klaśnięciu generuje napięcie w zakresie 1,5-3,2V

    więc:
    dondu napisał:
    ... należy rozpocząć od tego, jak wygląda sygnał podawany na wejście ADC.

    Sprawdziłeś to oscyloskopem? Jeśli nie masz, to: http://mikrokontrolery.blogspot.com/2011/04/darmowy-oscyloskop-i-analizator.html
    wtedy zobaczysz z czym masz do czynienia i zastosujesz odpowiednie rozwiązanie (sprzętowe i/lub programowe) np. wskazane przez kol. Wirnick

    Schemat, który pokazałeś to tylko wzmacniacz i konwerter poziomów. Nie ma w sobie żadnego filtru formującego (po wykryciu klaśnięcia) sygnału np. 1 logicznej o czasie trwania np. 1s.

  • #65 09 Mar 2015 11:16
    krzysiekwfd
    Poziom 11  

    dondu napisał:
    krzysiekwfd napisał:
    tyle ze w moim przypadku nie jest to sm mikrofon tylko cała płytka podłączone do wejścia adc1 którą przy klaśnięciu generuje napięcie w zakresie 1,5-3,2V

    więc:
    dondu napisał:
    ... należy rozpocząć od tego, jak wygląda sygnał podawany na wejście ADC.

    Sprawdziłeś to oscyloskopem? Jeśli nie masz, to: http://mikrokontrolery.blogspot.com/2011/04/darmowy-oscyloskop-i-analizator.html
    wtedy zobaczysz z czym masz do czynienia i zastosujesz odpowiednie rozwiązanie (sprzętowe i/lub programowe) np. wskazane przez kol. Wirnick

    Schemat, który pokazałeś to tylko wzmacniacz i konwerter poziomów. Nie ma w sobie żadnego filtru formującego (po wykryciu klaśnięcia) sygnału np. 1 logicznej o czasie trwania np. 1s.

    nie sprawdziłem tego dokładnie ale w projekcie z którego bałem tą płytkę było napisane
    Cytat:
    Na wyjściu wzmacniacza przy użytym stabilizatorze występuje napięcie 1.6V, przy głośnym klaśnięciu przekracza 3V.

    a nie zalezy mi na dokładnym pomiarze wystarczy mi tylko to ze gdy adc 2 razy w ciągu powiedzmy 2 sekund zmierzy wartość większa niz 400 to ma sie zaświecić dioda a puzniej ponownie zmienić swoj stan

  • #66 09 Mar 2015 11:17
    Wirnick
    Poziom 26  

    krzysiekwfd napisał:

    Cytat:
    uint8_t i = 0;
    while(i<10){if(pomiar(1)>700) PORTC^=(1<<led1);i++;}


    zastanawia mnie jaki cel ta linijka wykonywanie 10razy sprawdzenie czy wartość adc przekroczyła wartosc 700 a później świecenie diodą raczej wyglądało by to na ten sam efekt co wcześniej

    Funkcja while 10 razy sprawdza warunek if. Jeśli nie został spełniony, to dioda nie zmieni stanu. Funkcja while coś robi, natomiast _delay() tylko kręci "piruety" - opóźnia przebieg programu.
    By pomiar mógł się dokonać prawidłowo, sygnał na pinie ADC1 musi mieć postać DC, a nie AC. Chodzi o czas pomiaru przy preskalerze = 8 "1/(F_cpu/8)[s]". Na pinie led1 też możesz dać kondensator maskujący piki wychodzące z funkcji while(i<10).

  • #67 09 Mar 2015 11:26
    dondu
    Moderator Mikrokontrolery Projektowanie

    krzysiekwfd napisał:
    ... wystarczy mi tylko to ze gdy adc 2 razy w ciągu powiedzmy 2 sekund zmierzy wartość większa niz 400 to ma sie zaświecić dioda a puzniej ponownie zmienić swoj stan

    Pojedyncze klaśnięcie składać się będzie z szeregu impulsów, które należy odpowiednio przefiltrować programowo i/lub kondensatorem.

    Jeśli programowo, to na przykład tak:
    - dodawaj kolejne pomiary i uśredniaj np. 10 ostatnich,
    - jeśli średnia przekroczy założony próg to znaczy, że wykryłeś pojedyncze klaśnięcie.

    Wykrycie podwójnego jest więc równie łatwe.

  • #68 09 Mar 2015 12:12
    Wirnick
    Poziom 26  

    dondu napisał:

    Wykrycie podwójnego jest więc równie łatwe.

    Obawiam się i sam jestem tym zainteresowany, ale to chyba za wcześnie na tablice lub nagrywanie dźwięku.
    Pozdrawiam.

  • #69 09 Mar 2015 12:14
    szelus
    Specjalista - Mikrokontrolery

    dondu napisał:

    Schemat, który pokazałeś to tylko wzmacniacz i konwerter poziomów. Nie ma w sobie żadnego filtru formującego (po wykryciu klaśnięcia) sygnału np. 1 logicznej o czasie trwania np. 1s.


    Pozwolę sobie nie zgodzić się z kolegami (pomimo, że moje wykształcenie elektroniczne jest "niepełne" - przerzuciłem się na informatykę :) ). Układ ze schematu bynajmniej nie jest zwykłym wzmacniaczem. Wprawdzie brak podanej wartości R8, ale mam wrażenie, że punkt pracy nie leży w zakresie pracy liniowej (a przynajmniej na granicy). Są tam też dwa nisko leżące zera, jedno na pewno poniżej 2Hz (100n/1M).
    Myślę, że to działa jak swego rodzaju detektor szczytowy z filtrem dolnoprzepustowym, czyli to co jest potrzebne.
    (poprawka, chyba jednak zera, nie bieguny; teoria już mi trochę umyka :) )

  • #70 09 Mar 2015 13:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    Dlatego sugerowałem, by sprawdzić oscyloskopem jak przebieg wygląda, czego autor nie zrobił jeszcze.

  • #71 09 Mar 2015 15:11
    krzysiekwfd
    Poziom 11  

    dondu napisał:
    krzysiekwfd napisał:
    ... wystarczy mi tylko to ze gdy adc 2 razy w ciągu powiedzmy 2 sekund zmierzy wartość większa niz 400 to ma sie zaświecić dioda a puzniej ponownie zmienić swoj stan

    Pojedyncze klaśnięcie składać się będzie z szeregu impulsów, które należy odpowiednio przefiltrować programowo i/lub kondensatorem.

    Jeśli programowo, to na przykład tak:
    - dodawaj kolejne pomiary i uśredniaj np. 10 ostatnich,
    - jeśli średnia przekroczy założony próg to znaczy, że wykryłeś pojedyncze klaśnięcie.

    Wykrycie podwójnego jest więc równie łatwe.

    to uśrednianie muszę robić w trybie ciągłego pomiaru adc ??

  • #72 09 Mar 2015 15:19
    dondu
    Moderator Mikrokontrolery Projektowanie

    krzysiekwfd napisał:
    to uśrednianie muszę robić w trybie ciągłego pomiaru adc ??

    Każdy problem można rozwiązać na kilka sposobów, zależnie od tego jakie mamy zasoby. Nie wiemy, co jeszcze Twój mikrokontroler będzie wykonywał. Jeżeli nic poza rozpoznawaniem klaskania i włączaniem odbiornika, to tryb ciągły jest jak najbardziej prawidłowy.

  • #73 09 Mar 2015 15:21
    krzysiekwfd
    Poziom 11  

    dondu napisał:
    krzysiekwfd napisał:
    to uśrednianie muszę robić w trybie ciągłego pomiaru adc ??

    Każdy problem można rozwiązać na kilka sposobów, zależnie od tego jakie mamy zasoby. Nie wiemy, co jeszcze Twój mikrokontroler będzie wykonywał. Jeżeli nic poza rozpoznawaniem klaskania i włączaniem odbiornika, to tryb ciągły jest jak najbardziej prawidłowy.

    czyli wartości z powiedzmy 10 pomiarów mam uśrednić i tak jak pisałeś wyżej jeśli przekroczy jakaś ustaloną wartość to mamy nasze klaśniecie i wtedy zapalmy diode

  • #75 09 Mar 2015 20:51
    Wirnick
    Poziom 26  

    Testowałem program.

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    Co prawda - zadawałem sygnał na ADC1 potencjometrem z kontrolą wartości na LCD - działa!!!

  • #76 09 Mar 2015 20:53
    krzysiekwfd
    Poziom 11  

    Wirnick napisał:
    Testowałem program.
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    Co prawda - zadawałem sygnał na ADC1 potencjometrem z kontrolą wartości na LCD - działa!!!

    e: sprawdziłem to u sb i dioda świeci cały czas wiec chyba coś jest nie tak ale gdy sam na potencjometrze sprawdzałem to wcześniejszy program działało dobrze teraz raczej skłaniam sie za zebraniem 5 pomiarów i uśrednianiu ich tylko nie wiem za bardzo jak mam je zbierać ??

  • #77 09 Mar 2015 22:16
    dondu
    Moderator Mikrokontrolery Projektowanie

    krzysiekwfd napisał:
    ... skłaniam sie za zebraniem 5 pomiarów i uśrednianiu ich tylko nie wiem za bardzo jak mam je zbierać ??

    Ciągniesz ten temat już przez 3 strony (począwszy od 17 lutego) między innymi dlatego, że nie czytasz i nie analizujesz tego co Ci dajemy "na tacy" - w poprzednim poście podałem Ci przykład liczenia średniej - ładnie opisany i zastosowany w praktyce.

  • #78 09 Mar 2015 22:26
    krzysiekwfd
    Poziom 11  

    dondu napisał:
    krzysiekwfd napisał:
    ... skłaniam sie za zebraniem 5 pomiarów i uśrednianiu ich tylko nie wiem za bardzo jak mam je zbierać ??

    Ciągniesz ten temat już przez 3 strony (począwszy od 17 lutego) między innymi dlatego, że nie czytasz i nie analizujesz tego co Ci dajemy "na tacy" - w poprzednim poście podałem Ci przykład liczenia średniej - ładnie opisany i zastosowany w praktyce.

    wiem ale ten program który podałeś nie jest w stanie zrozumieć go jak dla mnie jest zbyt rozbudowany:/ ale nie załamuje sie i sam napisałem coś takiego dla uśredniania pomiarów
    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #79 10 Mar 2015 09:18
    Wirnick
    Poziom 26  

    krzysiekwfd napisał:
    :/ ale nie załamuje sie i sam napisałem coś takiego dla uśredniania pomiarów

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie możesz posługiwać się "kopiuj i wklej" , ponieważ w tym zapisie funkcja for wykona tylko 1 pomiar i zakończy się. Wyjaśnienie w kodzie. Dochodzi jeszcze deklaracja stałej "pomiar" , a nazwa licznika funkcji for().

  • #80 10 Mar 2015 11:12
    dondu
    Moderator Mikrokontrolery Projektowanie

    Odnoszę wrażenie, że wziąłeś się za zadanie które Ciebie przerasta na ten moment.
    Napisałeś, że jesteś początkujący i biorę to pod uwagę, ale po wklejeniu tej linijki:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    oraz umiejscowieniu tej linijki:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    w pętli for, widzę, że nie znasz nawet podstaw języka C.

    Moim zdaniem odłóż na razie ten projekt ad acta i najpierw naucz się języka C: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html

    Gdy opanujesz język C na tyle by nie robić tak podstawowych błędów jak wskazane wyżej, powinieneś przerobić jakiś kurs AVR np: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html
    i dopiero wrócić do swojego projektu.

    To naprawdę dobre rady - patrz punkt 6: http://mikrokontrolery.blogspot.com/2011/04/pieklo-poczatkujacych.html

    Przy Twoim zaangażowaniu (które jak widzę jest spore i pełne entuzjazmu) zajmie Ci to tydzień - góra dwa.
    Zrób to, a ruszysz później "z kopyta" do przodu :)

    Nie zamykaj więc tego tematu, bo do niego wrócimy po tym czasie. OK?

  • #81 18 Mar 2015 09:29
    krzysiekwfd
    Poziom 11  

    Witam ponownie, przestudiowałem kilkukrotnie podane wyżej linki postaram sie juz nie wklejać nie przemyślanego kodu:) w międzyczasie zabrałem sie za modyfikacje kodu i tak jak zakładałem w początkowej fazie projektu czyli ponowny pomiar po odczekaniu 1 sekundy używając przerwania timiera w trybie porównywania ctc.Proszę o sprawdzenie poprawności kodu
    w eclipsie nie ma żadnych błędów wiec myślę ze jest ok ale testując go usb na płytce zauważyłem ze dioda od razu świeci po podłączeniu zasilania

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #82 18 Mar 2015 10:11
    BlueDraco
    Specjalista - Mikrokontrolery

    W przerwaniu timera najpierw czytaj wynik poprzedniej konwersji, a potem startuj następną. W ten sposób wyeliminujesz zbędne i błędne oczekiwanie w przerwaniu. Pierwszy wynik może być fałszywy - raczej w niczym Ci to nie przeszkodzi.

  • #83 25 Mar 2015 09:25
    krzysiekwfd
    Poziom 11  

    Witam napisałem juz algorytm uśredniania wydaje mi się ze jest dobrze ale nam problem bo po wgraniu całość programu do procka używając potencjometru podłączonego do acd1 podłączone mam tam napiecie 5V brak jest reakcji diody(cały czas świeci) prosze o pomoc

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #84 25 Mar 2015 13:18
    dondu
    Moderator Mikrokontrolery Projektowanie

    1. Uporządkuj program, bo definicję funkcji init_adc() masz wewnątrz pętli while funkcji main(),

    2. Jeśli średnia spełnia warunek, to wykonuje:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    czyli ... i tutaj dopisz co według Ciebie za każdym razem (wiele razy na sekundę) wykonuje ta linijka.

    3. Zmienna wynik jest zbędna - w jej miejsce wstaw rejestr ADC.

    4. zamiast 3 linijek kodu liczenia średniej zrób to w jednej linijce - C to nie BASCOM, że należy wszystko rozbijać na pojedyncze linie :)

    5. Nie bardzo znasz kolejność działań czynności patrząc na ten fragment:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    napisz co chciałeś w tej linijce osiągnąć.

    6. Na koniec zastanów się, jak ma zgasić diodę ten program w momencie, gdy warunek nie jest spełniony.

  • #85 25 Mar 2015 14:03
    Wirnick
    Poziom 26  

    dondu napisał:

    6. Na koniec zastanów się, jak ma zgasić diodę ten program w momencie, gdy warunek nie jest spełniony.

    Mój Mistrzu !!1


    Dioda musi być w warunku z sygnałem na ADCn.

  • #86 25 Mar 2015 14:23
    krzysiekwfd
    Poziom 11  

    dondu napisał:
    1. Uporządkuj program, bo definicję funkcji init_adc() masz wewnątrz pętli while funkcji main(),

    2. Jeśli średnia spełnia warunek, to wykonuje:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    czyli ... i tutaj dopisz co według Ciebie za każdym razem (wiele razy na sekundę) wykonuje ta linijka.

    3. Zmienna wynik jest zbędna - w jej miejsce wstaw rejestr ADC.

    4. zamiast 3 linijek kodu liczenia średniej zrób to w jednej linijce - C to nie BASCOM, że należy wszystko rozbijać na pojedyncze linie :)

    5. Nie bardzo znasz kolejność działań czynności patrząc na ten fragment:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    napisz co chciałeś w tej linijce osiągnąć.

    6. Na koniec zastanów się, jak ma zgasić diodę ten program w momencie, gdy warunek nie jest spełniony.


    2: powinno byc tak
    Kod: c
    Zaloguj się, aby zobaczyć kod

    5.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    wartosc z rejestru ADC będzie dzielona przez 10

  • #88 25 Mar 2015 14:44
    krzysiekwfd
    Poziom 11  

    poprawiłem to i teraz jest ok

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #89 25 Mar 2015 16:58
    Wirnick
    Poziom 26  

    Proszę jeszcze przetestować z funkcją while(licznik < 4)

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Od trzeciego obiegu srednia = 0 ....

  • #90 25 Mar 2015 17:02
    krzysiekwfd
    Poziom 11  

    Wirnick napisał:
    Proszę jeszcze przetestować z funkcją while(licznik < 4)
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Od trzeciego obiegu srednia = 0 ....

    e: juz wiem w moim przypadku z każdym obrotem pętli dodawana jest nowa wartosc adc