Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega8][C] - Typ przerwania

pawel1730 19 Jul 2013 00:35 8109 93
Tespol
  • #61
    pawel1730
    Level 15  
    Zgaduje:
    - pomiar ADC?
    - warunek 'if'
    - zmiana bitów MUX na odpowiedni kanał ?
    - wywołanie funkcji 'pomiarADC'?
  • Tespol
  • #63
    pawel1730
    Level 15  
    dondu wrote:
    Elektronik na zgadywaniu daleko nie zajedzie

    Nie jestem elektronikiem z wykształcenia, jeśli ma to jakieś znaczenie. ;)

    Chyba nie za bardzo wiem jak policzyć ten czas, nigdy nie liczyłem czegoś takiego.
    Raczej nie chodzi o podanie wartości granicznych z dokumentacji ?
  • #64
    dondu
    Moderator on vacation ...
    OK, to Ciebie naprowadzę :)

    Masz zegar 8MHz.
    Używasz preskalera ADC, który dzieli sygnał zegarowy przez 128 (patrz Twój program).
    Czyli sygnał taktujący ADC wynosi: ... oblicz sam

    Następnie oblicz ile czasu trwa jeden cykl sygnału taktującego ADC.

    Jeden pomiar ADC trwa X cykli sygnału taktującego ADC.
    X znajdujemy w datasheet w tabelce: ADC Conversion Time
    Przyjmujemy wartość: Normal conversions, single ended

    Teraz masz już wszystko, by policzyć ile czasu trwa jeden pomiar ADC.
  • Tespol
  • #65
    pawel1730
    Level 15  
    Mam 16MHz, czyli:

    16000000/128 = 125000
    125000*13=1625000
    (1/16Mhz)*162500 = 0.10075 sec ?
  • #66
    dondu
    Moderator on vacation ...
    pawel1730 wrote:
    Mam 16MHz

    OK, ja przeczytałem to co pisze w komentarzach.

    pawel1730 wrote:
    16000000/128 = 125000
    125000*13=1625000
    (1/16Mhz)*162500 = 0.10075 sec ?

    Nie używasz jednostek i dlatego się gubisz:

    Czestotliwosc zegara ADC = 16000000Hz/128 = 125000Hz

    OK, ale poniżej jest błąd. Co tutaj obliczyłeś?:

    pawel1730 wrote:
    125000*13=1625000


    W drugim kroku miałeś obliczyć:

    dondu wrote:
    Następnie oblicz ile czasu trwa jeden cykl sygnału taktującego ADC.

    czyli okres: http://pl.wikipedia.org/wiki/Okres_(fizyka)
  • #67
    pawel1730
    Level 15  
    Tak powinno być?

    (1/125kH)*13(cykli/pomiar) = 0.000104 sec ?
  • #68
    dondu
    Moderator on vacation ...
    Teraz jest OK. Skoro już znasz czas trwania pomiaru, powinieneś się zastanowić, jaki to ma wpływ na Twój problem, przyjmując dla uproszczenia, że Twoje przerwanie trwa co najmniej tyle czasu.

    EDIT:
    I jeszcze pytanie (nie czytałem całości tego tematu): Dlaczego sygnał B mierzysz za pomocą ADC?

    Dodatkowa uwaga do kodu - zamiast:

    Code: c
    Log in, to see the code


    wystarczy:

    Code: c
    Log in, to see the code
  • #69
    pawel1730
    Level 15  
    Ma duży, ale jak to uprościć to nie mam zielonego pojęcia. ;/
  • #71
    pawel1730
    Level 15  
    dondu wrote:
    I jeszcze pytanie (nie czytałem całości tego tematu): Dlaczego sygnał B mierzysz za pomocą ADC?


    Żeby wiedzieć jaki jest stan sygnału B w momencie gdy wystąpiło przerwanie na sygnale A.
  • #72
    dondu
    Moderator on vacation ...
    pawel1730 wrote:
    dondu wrote:
    I jeszcze pytanie (nie czytałem całości tego tematu): Dlaczego sygnał B mierzysz za pomocą ADC?


    Żeby wiedzieć jaki jest stan sygnału B w momencie gdy wystąpiło przerwanie na sygnale A.

    Czy ten sygnał jest analogowy, czy cyfrowy?
    Skoro A jest cyfrowy, to B zapewne także.
  • #73
    pawel1730
    Level 15  
    Analogowy, ale przechodzi przez LM393. Myślisz o komparatorze?
  • #74
    dondu
    Moderator on vacation ...
    Tak jak pisałem nie czytałem całego tematu stąd pytanie. Sądziłem, że A i B to sygnały z enkodera, a to nie tak. Sygnał A to enkoder, a B to zupełnie inny sygnał. Innymi słowy enkoder kręci się tylko w jednym kierunku?

    Dobrze rozumiem?
  • #75
    pawel1730
    Level 15  
    nie sygnały A i B pochodzą z enkodera, oba przechodzą przez LM393. A na przerwanie bo drugie będzie potrzebne do czego innego a jak już pisałem w trakcie każdego przerwania na linii A muszę znać stan linii B.
  • #76
    dondu
    Moderator on vacation ...
    OK.

    W takim układzie masz kilka możliwości:

    1. Dostosować sygnał ze wzmacniacza w taki sposób, by nie trzeba było używać ADC do pomiaru jego stanu tylko po prostu odczytać cyfrowo stan pinu do którego podłączony jest sygnał B. Nie używamy ADC.

    2. Zwiększyć częstotliwość taktowania ADC i zmniejszyć rozdzielczość do 8 bitów, a nawet do 4 bitów. W tym zakresie można sporo zyskać: http://mikrokontrolery.blogspot.com/2011/03/adc-techniki-wykorzystania.html

    3. zmienić mikrokontroler, na szybszy, ale moim zdaniem to zupełnie niepotrzebne.

    Ja wybrałbym pkt. 1.

    Na razie kończę bo późno dość :)
  • #77
    pawel1730
    Level 15  
    Zamienione na z ADC na komparator na lini B i wygląda na to, że się poprawiło:

    Code: c
    Log in, to see the code
  • #79
    pawel1730
    Level 15  
    dzięki za pomoc

    chyba się pośpieszyłem, z radością ;/

    EDIT
    Teraz sygnał A podawany jest na INT1 a sygnał B na komparator AIN1 a na AIN0 napięcie referencyjne dla sygnału B

    poprawiłem kod, mógłbyś zerknąć?

    Code: c
    Log in, to see the code
  • #80
    pawel1730
    Level 15  
    dondu wrote:
    zmniejszyć rozdzielczość do 8 bitów, a nawet do 4 bitów


    czy dobrze zrozumiałem ze wskazanego artykułu, że rozdzielczość 'wybiera' się przez tylko odczyt założonej przez nas liczby bitów?
  • #82
    pawel1730
    Level 15  
    czyli jak chce mieć rozdzielczość 4 bity dla napięcia od 0 to Vcc=5 V to będę miał dokładność około 0,3125 V?

    obecnie dla odczytu 10 bitów oraz ADLAR = 0:
    Code: c
    Log in, to see the code


    I teraz pytanie jak odczytać na przykładzie powyższego kodu te 4 bity, które to będą?
  • #84
    pawel1730
    Level 15  
    czyli zawsze te najbardziej znaczące bity ?
    dla 4 bitów rozdzielczości będzie wyglądało tak jak poniżej ?

    Wersja 1:
    Code: c
    Log in, to see the code


    A teraz stara wersja:

    Wersja 2:
    Code: c
    Log in, to see the code


    i czy teraz mógłby ktoś mądrzejszy ode mnie policzyć czas pomiaru dla obu wersji jako pojedynczy pomiar?
    (zakładając, że zegar 16Mhz i prescaler 128)
  • #86
    pawel1730
    Level 15  
    Więc kiedy będzie jakaś korzyść zmniejszając rozdzielczość z 10 bitów np do 4 ?
  • #88
    pawel1730
    Level 15  
    Czy da się jeszcze jakoś usprawnić program, żeby działało poprawnie dla większej prędkości tarczy enkodera?
  • #90
    pawel1730
    Level 15  
    docelowo chcę mieć enkoder oraz 4 potencjometry,
    co jest szybsze odczyt stanu pinu czy komparator ?