marek1707 Listopad 6, 2015 Udostępnij Listopad 6, 2015 Nie wiem co nazywasz PWM, więc może tak: 1. Gdyby spojrzeć przez lupę, to dioda sterowana jest przebiegiem prostokątnym o częstotliwości np. 36kHz. To nie musi być sygnał symetryczny, w którym "górki" są takie same jak "dołki" - czyli wypełnienie 50%, ale możesz to regulować. Jeśli przebieg ten będziesz generował przy pomocy timera pracującego w którymś trybie PWM, to zmieniając wypełnienie od np. 10% do 50% możesz regulować średni prąd diody więc niejako emitowaną energię bez zmiany częstotliwości. Im będziesz bliżej zera tym mniej prądu będziesz ciągnął z zasilania, ale tym słabszy będzie zasięg - trzeba to dobrać do wymagań stawianych czujnikowi. Mozna oczywiście regulować opornikiem (czyli chwilowym prądem diody), ale to jest niewygodne. Lepiej ustawić go na jakiś w miarę duży a potem "kręcić" ustawieniami timera. Przekraczanie 50% wypełnienia nie ma sensu, bo wtedy zawartość podstawowej harmonicznej (czyli tych 36kHz) także spada czyli zasięg również, ale prąd rośnie, czyli - bez sensu. Tak więc mamy pierwszy PWM. 2. Gdybyś po prostu puścił timer i o nim zapomniał, będzie generował falę ciągłą a tego większość TSOPów nie lubi. Tak więc musisz co jakiś czas timer zatrzymywać by wyłączył prąd diody, a po jakimś czasie znów zaczął generować falę nośną 36kHz. Masz więc kolejny PWM - tym razem wolniejszy. Ma on "jedynkę" gdy fala 36kHz jest nadawana i "zero" gdy dioda nie świeci w ogóle. Jego obwiednią będzie więc przebieg prostokątny i to do tej właśnie obwiedni odwołuje się pokazany przez Ciebie wykres. Pokazuje on konieczne wypełnienie tego PWMa w zależności od tego, ile okresów fali 36kHz przepuszczasz podczas "jedynki" tego przebiegu. Gdybyś np. wypuścił od 80 do 120 okresów fali 36kHz, to musisz zrobić tak długą przerwę by sumaryczne wypełnienie obwiedni było nie większe niż 30% (prawa część wykresu). Czyli po wygenerowaniu np. 100 okresów fali 36kHz musisz wyłączyć diodę aż na 200 okresów. Jeżeli tego nie zrobisz, firma nie gwarantuje niczego a więc czułości, zapowiedzianych zniekształceń sygnału wyjściowego itd. Nie gwarantuje, że w ogóle coś odbiornik odbierze. Idąc w lewo wykres się podnosi: po wysłaniu "paczki" 60 okresów fali 36kHz możesz robić najkrótsze przerwy, bo wypełnienie obwiedni możesz zwiększyć do 70%. Jeszcze bardziej skracając długość "paczek", znów musisz schodzić z wypełnieniem obwiedni i dla krótkich, 10-impulsowych musisz znów powrócić do wypełnienia 30% czyli odczekiwania 20 okresów fali 36kHz w ciszy. Czy to jakoś tłumaczy ten wykres? Nie wiem w jakim kontekście pytasz o siłę sygnału więc nie wiem co odpowiedzieć. Cytuj Link do komentarza Share on other sites More sharing options...
Buczex Listopad 8, 2015 Autor tematu Udostępnij Listopad 8, 2015 zmodyfikowalem program #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> int main() { TCCR0B |= (1 << CS00); //bez preskalera TCCR0A |= (1 << WGM01); //tryb ctc TIMSK0 |= (1 << OCIE0A); //timer regulujacy wysylaniem sygnalu przez diode TCCR0A |= (1 << COM0A0); OCR0A = 110; //zliczanie do 110 DDRC |= (1 << PC4); //dioda ir DDRB &= ~(1 << PB2); // wejscie dla odbiornika ir PORTB |= (1 << PB2); // podicagniecie pb2 pull upem DDRD |=(1<<PD7); DDRD |= (1 << PD5); sei(); while (1) { //PORTD ^=(1<<PD6); //PORTD ^=(1<<PD7); if(!(bit_is_set(PINB,PB2))){ //sprawdza czy tsop daje stan niski PORTD ^= (1 << PD5); _delay_ms(50); } }; } ISR(TIMER0_COMPA_vect) { // timer reguluje wysylanie sygnalu przez diode static uint8_t licznik_wysylania=0; /*test 2*/ if(licznik_wysylania<=120){ //wysyla 20 paczek licznik_wysylania++; PORTC ^= (1 << PC4); } else{ licznik_wysylania++; if(licznik_wysylania==166){ // 50 paczek czeka, dajac wypelnienie 0,4 licznik_wysylania=0; } } } wszystko dziala, tylko jest jeden maly mankament, zaraz po wlaczeniu ukladu dioda(sygnalizacyjna na PD5) miga sama z siebie przez ok 3s, czym moze to byc spowodowane? Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Listopad 8, 2015 Udostępnij Listopad 8, 2015 Cieszę się, że działa choć nie wiem co to znaczy. Jakie uzyskałeś zasięgi? Na jakich przeszkodach? Z jakim prądem zasilania? Z jakim prądem chwilowym diody? itd.. Co do mrugania: jeśli nie dzieje się nic nadprzyrodzonego, Twoja dioda mruga 10 razy na sekundę gdy na pinie PB2 jest zero. To może zamiast pytać internet, zmierz tam napięcie? Być może TSOP musi mieć trochę czasu po włączeniu na stabilizację swoich wewnętrznych stanów i w tym czasie wypuszcza stan zero? Mam też kilka uwag/pytań: 1. Widzę, że wciąż korzystasz z przerwania 72kHz - to bardzo, naprawdę bardzo często. W sumie to nie jestem pewien czy procesor się wyrabia z taką częstotliwością i czy rzeczywiście nadawana jest fala 36kHz. Do nadawania IR masz tryb sprzętowej generacji przebiegów PWM (np. tryb 7 timera 0). Dlaczego z tego nie korzystasz? Możesz wtedy dowolnie ustawić okres i wypełnienie fali 36kHz. Wystarczy diodę nadawczą podłączyć do OC0B i odpowiednio ustawić timer0. Czas (obwiednię) nadawanych paczek możesz liczyć innym timerem lub w ostateczności - tak dla próby - odliczać delay_us(). 2. W ISR, w zależności od stanu licznika odwracasz bit PC4 lub nie, co produkuje symetryczną falę 36kHz. Skąd wiesz w jakim stanie zatrzymujesz ten pin gdy nic nie nadajesz? Wtedy dioda IR powinna być zgaszona a pin "zaparkowany" do stanu 0. 3. Nieprawdziwe komentarze to gorzej niż żadne. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!