logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVRButterfly Atmego169 ,utrzymanie napięcia na portach, Sound Card Oscyloskop.

koirat 21 Mar 2012 17:12 1587 6
REKLAMA
  • #1 10704029
    koirat
    Poziom 9  
    Witam,

    Ostatnimi czasy chciałem podłączyć KAmodBTM222 do AVRButterfly. AvrButterfly zasilany jest z dwóch baterii 1,5V połączonych szeregowo co daje 3v.
    Jako iż UART na motylku przystosowany jest do połączeń z komputerem czyli do pracy na znacznie wyższym napięciu, postanowiłem zastosować software UART na jadnym z pinów (PORTB pin 1 <=> PB0).

    W celach testowych zainstalowałem sobie program tworzący oscyloskop z karty graficznej i przez dzielnik napięcia na rezystorach 80K oraz 20K podłączyłem ten port PB0 do komputera.

    program testowy który stosuje wygląda tak:
    
    while(true)
    {
    	PORTB^=1;
    	_delay_ms(100);
    	PORTB^=1;
    	_delay_ms(50);
    	PORTB^=1;
    	_delay_ms(20);
    	PORTB^=1;
    	_delay_ms(10);
    
    }
    


    Jak widać Odwraca on wartość tego portu i zmienia czas trwania stanu o mniej więcej połowe, następnie rozpoczyna cykl od początku.

    Tu jest wynik jaki podaje oscyloskop, to co mnie niepokoi to stopniowa zmiana napięcia do jakiegoś stanu środkowego , nie rozumiem dlaczego tak się dzieje.

    AVRButterfly Atmego169 ,utrzymanie napięcia na portach, Sound Card Oscyloskop.
  • REKLAMA
  • #2 10704268
    M. S.
    Poziom 34  
    Karta dźwiękowa będzie miała kondziołek (-||-) na wejściu. Zwiększ częstotliwość impulsów z uC, a obraz prostokąta powinien się poprawić.

    P. S. Możesz także zmodyfikować dzielnik rezystorowy - dać np ok. 8k i 2k albo 4k i 1k.
  • REKLAMA
  • #4 10705516
    koirat
    Poziom 9  
    Tu nie ma żadnych impulsów po prostu ustalam stan wysoki który ma trwać X milisekund. (nazwijmy to jednym długim impulsem :P)
    A później stan niski który ma trwać Y ms.

    [edit] Rozumiem iż proponujesz na tyle skrócić impuls aby nie zdążył się zmniejszyć, tak da się tak zrobić jednak co będzie w przypadku jeśli będe miał wiele impulsów o stanie wysokim, prawdopodobnie to co teraz.[/edit]

    Dałem dzielnik 8 do 2 i niestety nadal wygląda to tak samo.

    Teoria z kondensatorem wydaje mi się być dość racjonalna, czy mógł bym prosić o wytłumaczenie tego - fenomenu. Czy nie powinno to po prostu dłużej podtrzymywać stanu wysokiego ? W tym wypadku to wygląda tak jakby stan niski oraz stan wysoki były ściągane do stanu dokładnie pomiędzy niskim a wysokim.

    Obawiam się iż dlatego korzystam z oscyloskopu na karcie dźwiękowej iż nie mam dostępu do bardziej profesjonalnego sprzętu.

    Ile może kosztować sensowny oscyloskop do domowego użytku ? Najlepiej podłączany do komputera.
  • REKLAMA
  • #5 10705925
    janbernat
    Poziom 38  
    koirat- na oko dajesz na kartę dźwiękową 20hz.
    Dobra karta powinna to jakoś przenieść.
    Masz dość słabą.
    Daj 1khz- 1ms- to już powinno być dobrze.
    Sensowny oscyloskop z podłączeniem do komputera kosztuje ok. 1500zł.
    Sensowna przystawka z pasmem ze 200khz kosztuje ok. 400zł.
  • REKLAMA
  • #7 10707534
    koirat
    Poziom 9  
    1500 - Auć ;)
    400 to już jest bardziej realna suma.

    Ogólnie udało mi się rozwiązać ten problem, czyli zastosowanie programowego połączenia AVRButterfly z modułem bluetooth KamodBtm222. Karta dźwiękowa jakoś tam dała radę :). Tak iż dziękuje wszystkim za pomoc. Poniżej przedstawiłem rozwiązanie tego problemu - tak dla potomności :)

    Zastosowałem kod ściągnięty z internetu lekko zmodyfikowałem.

    Całość funkcjonuje dla częstotliwości.
    
    #define F_CPU 		2000000	
    


    
    //don't forget to set direction on DDRx for port Pxy as an output
    #define BAUD (19200) 					
    #define BIT_DURATION ( (1000000)/BAUD)    //microseconds
    #define STX_PORT (PORTB)	//transceiver port set PORTx
    #define STX_BIT (PB1)		//transceiving port number Pxy
    
    void sputchar( uint8_t c )
    {
      c = ~c;
      STX_PORT &= ~(1<<STX_BIT);            // start bit
      for( uint8_t i = 10; i; i-- ){        // 10 bits
        _delay_us( BIT_DURATION );    // bit duration 
        if( c & 1 )
          STX_PORT &= ~(1<<STX_BIT);        // data bit 0
        else
          STX_PORT |= 1<<STX_BIT;           // data bit 1 or stop bit
        c >>= 1;
      }
    }
    


    Ogólnie domyślnie ten moduł BT ma ustawione parametry na
    Baud Rate 19200
    8 bit danych
    1 bit stopu

    Poniżej przedstawiam wykres dla wartości 0x55 wysłanej przez ten moduł do docelowego procesora.

    AVRButterfly Atmego169 ,utrzymanie napięcia na portach, Sound Card Oscyloskop.

    binarnie wartość 0x55 można zapisać 01010101


    W momencie gdy nic nie nadajemy stan na linii powinien być wysoki. Zmiana tego stanu na niski oznacza rozpoczęcie transmisji.
    Po zakończeniu transmisji (pojedynczej danej w naszym wypadku będzie to 8 bitów) ustanawiamy stan wysoki za pomocą stop bitu.

    Bity nadawane są od najmniej znaczącego (LSB) do najbardziej znaczącego (MSB)
    Patrząc na ten wykres widzimy następujący przebieg.
    Pierwszy spadek napięcia symbolizuje start bit (stan niski)
    Następnie stan wysoki oznacza ostatni bit z (01010101) czyli 1
    Następnie stan niski powstaje z przed ostatniego bitu którego wartość wynosi 0
    .
    .
    .
    .
    Ostatni wzrost napięcia to stop bit który ustawia linie w stan wysoki i tym samym następuje zakończenie transmisji naszej 8 bitowej informacji. Jak widać ostatecznie potrzebowaliśmy nadać 10 bitów.

    Pozdrawiam.
REKLAMA