Elektroda.pl
Elektroda.pl
X

Search our partners

Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Pad na podczerwień, generacja fali nośnej 36kHz.

Superdomek111 21 Mar 2009 20:27 1773 2
  • #1
    Superdomek111
    Level 12  
    Czesc. Mam pewne problemy z generacją fali nośnej 36kHz na wew. kwarcu 1mHz, mikrokontroler atmega8. Podłączam odbiornik i zasilanie pad'a przy takim programie:

    Code:

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void){ //początek funkcji main
        DDRD=0xFF;
        DDRB=0xFF;
        PORTD=0x0;
        //generacja fali nośnej 36kHz
        while(1){
                PORTB=0xFF;
                _delay_us(13.5);
                PORTB=0x0;
                _delay_us(13.5);
        }
    return 0;
    }


    Czytałem o generacji fali nośnej na tej stronie: http://www.ustr.net/infrared/infrared1.shtml .

    Odbiornik podczerwieni to TSOP1736. A więc po podłączeniu zasilania pad'a i odbiornika na mierniku ukazuje mi się przy wyłączonym padzie napięcie 4.4V, przy włączonym 4.3V a na nóżkach zasilania jest 4.6V.

    Przy podczerwieni generowanej przez pilota napięcie waha się od 3V do 4V, dlaczego tutaj napięcia waha się tylko o 0.10V. Czy to może byc wina złej generacji fali nośnej?

    I trochę dziwne pytanie, ile uS ma jedna milisekunda? Szukałem na necie o jednostkach czasu, ale nie doszukałem się takiej jak uS.

    Proszę o nie przenoszenie tematu do kosza, na prawdę dużo czytałem na internecie.



    Dodano po 1 [godziny] 45 [minuty]:

    Pomyślałem, że przy samej fali nośnej skoki napięcia mogą nie byc takie duże więc napisałem taki program:

    Code:
    #define F_CPU 1000000L
    
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void){ //początek funkcji main
       DDRD=0xFF;
       DDRB=0xFF;
       PORTD=0x0;
       //generacja fali nośnej 36kHz
       while(1){
          for(int i=0; i<=8; i++){
                PORTB=0xFF;
                _delay_us(13.5);
                PORTB=0x0;
                _delay_us(13.5);
          }
          _delay_ms(1);
       }
    return 0;
    }


    tyle, że jest to samo. Proszę o jakąś podpowiedź.

    Dzięki.

    Dodano po 2 [minuty]:

    Mała pomyłka, dioda chyba taka słaba jest. Po przybliżeniu odbiornika napięcia spada do 3V więc nie jest chyba tak źle :) Ale jak mogę zrobic żeby pętla wykonywała się przez 1mS?

    Dzięki.
  • Helpful post
    #2
    Sinistra
    Level 14  
    mikro = 0.001 [mili]
    mikro = 1 / 1000 [mili]
    czyli jedna milisekunda(ms) ma tysiąc mikrosekund(us).

    Mam pytanie: czy to działa z metodą wysyłania kwadratowej fali? Bo ja chcę zrobić pilot który będzie wysyłał parę komend, ale nie wiedziałem jak zmodulować sygnał. bardzo bym prosił o potwierdzenie tego sposobu.

    A co do wysyłania tylko przez określony czas, to mam pomysł:
    Albo przeliczyć ile cykli procka ma milisekunda, i użyć wewnętrznego timera, by zrobił przerwanie które wyjdzie z pętli;

    Albo policzyć ile mikro sekund zajmuje jedno przejście pętli while (mniej więcej 36us?) i zrobiżć pętle for, która wykona te przejścia tylko parę razy(mniej więej 27/28 razy)

    Sinistra
  • #3
    Superdomek111
    Level 12  
    Dzięki, problem rozwiązany. To jest kod:

    Code:
    #define F_CPU 1000000L
    
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void){ //początek funkcji main
        DDRD=0xFF;
        DDRB=0xFF;
        PORTD=0x0;
        //generacja fali nośnej 36kHz
        while(1){
        for(int ii=0; ii<=15; ii++){
            for(int i=0; i<=38; i++){
                    PORTB=0xFF;
                    _delay_us(13.5);
                    PORTB=0x0;
                    _delay_us(13.5);
        }
        _delay_ms(1);
        }
        _delay_ms(170);
        }
    return 0;
    }


    może Ci się przyda w robieniu pilota. Działa już prawidłowo. Aby wygenerowac falę nośną 36kHz wystarczy aby dioda włączała się i wyłączyła co 13.5uS i świeciła też przez 13.5uS ;) 1mS to będzie około 37 wykonań pętli(sam bym do tego nie doszedł, podpowiedział mi użytkownik pewnego forum) :)

    Dzięki.