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

Timer do silników rakietowych/fajerwerków etc.

Templarious 09 Mar 2014 20:02 5325 2
  • Wstęp

    Modelarstwo rakietowe to piękny sport uprawiany przez nielicznych. Jego piękno tkwi w modelach rakiet oraz wielu silników rakietowych które tworzą amatorzy tego sportu. Elektroniczne moduły zapalające silniki są nieodzownym elementem stanowiącym bezpieczeństwo tego sportu.


    Moja propozycja timera (spark ignition system) do silników rakietowych jest wspaniałym rozwiązaniem niosącym ze sobą frajde z odpalania silnika bez lontu - a cyfrowo, a przy tym całkowicie bezpiecznie. Daje to duż frajdy, słysząc odliczanie sekund po którym następuje start rakiety albo to wszystko za nacisnięciem jednego przycisku (tryb manualny). Całość sterowana jest przez mikrokontroler ATMega8 oraz 2 rejestry przesuwne, kilka tranzystorów i mosfet IRF371S wykonawczy, który przepala drut.


    Hardware

    Sercem całego układu jest mikrokontroler atmega8l-8au, który taktowany jest wewnętrznym sygnałem 8Mhz. Mikrokontroler został zasilony przetwornicą impulsową LM2675M-5.0NOPB.
    Układ projektowałem z myślą odprzęgania zasilania, tzn. dobranie elementów i rozłożenie ich na płytce PCB aby EMC było jak najniższe. Oczywiście EMC, to emisja fal elektromagnetycznych.
    Do tego użyłem kondensatorów ceramicznych o wartości 100nF zarówno przy przetwornicy jak i przy mikrokontrolerze przy pinach AVCC oraz AREF (gdyż nie jest wykorzystywane) oraz 2 kondensatory 330uF elektrolityczne tuż za przetwornicą. Kondensatory elektrolityczne odprzęgają zasilanie z zakresu niskich częstotliwości a kondensatory ceramiczne - z wyższych częstotliwości tętnienia zasilania. Oczywiście rezystor 10k ohm podciągnięty jest od pinu RESET do zasilania VCC równym +5V.



    Opis elementów

    Timer do silników rakietowych/fajerwerków etc.

    Rysunek 2 Opis elementów po stronie TOP

    Timer do silników rakietowych/fajerwerków etc.

    Rysunek 3 Opis elementów po stronie BOTTOM
    Zasilanie
    Zdecydowałem się na zastosowanie przetwornicy impulsowej LM2675M-5.0NOPB. Jest ona zastosowana nad "wyrost" ponieważ wg. noty katalogowej dopuszczalny prąd na wyjściu to 1A, a cały układ nie pobiera więcej niż 300mA. Zastosowanie jej ma jednak swoje uzasadnienie, ze względu na jej sprawność oraz to, że nie grzeje się. Wcześniejszy stabilizator liniowy LM7805 niestety po krótkim czasie grzał się dosyć mocno i uznałem, że trzeba zainwestować w coś dobrego i cieszyć się zabawką dłuższą chwilą.
    Wyświetlacz
    Do wyświetlania czasu, użyłem wyświetlacza 7-mio segmentowego o wysokości znaku około 2 cm, który sterowany jest bezpośrednio z 2 rejestrów (po 1 rejestrze na cyfrę) 74HC595. Same rejestry są sterowane za pomocą interfejsu SPI ale o nim powiem troszkę dalej. Obie cyfry wyświetlacza są włączane za pomocą tranzystorów PNP BC807.
    Wyświetlacz posiada wspólną anodę (+) i stereowany jest masą od strony rejestrów przesuwnych z ograniczeniem prądu poprzez oporniki 330 ohm. Użyte rejestry przesuwne zapewniają brak duchów na wyświetlaczu ponieważ wyposażone są w zatrzaski. Przepisują one zawartość buforu na wyjście :). Oczywiście całość nie jest multipleksowana. Każda cyfra wyświetlacza ma osobny rejestr 8śmio bitowy.
    Impulsator
    Impulsator (enkoder) służy do inkrementacji albo dekrementacji czasu. Możliwy jest zakres regulacji od 5 do 99 sekund gdzie 99 sekund to wejście w tryb manualny - zatem faktyczny zakres czasu wacha się od 5 do 98 sekund. Nie bez powodu minimalny czas do odpalenia jest równy 5, a jest on ze względów bezpieczeństwa. W razie omyłkowego naciśnięcia przycisku odliczania (enkodera) możliwe jest jego zatrzymanie poprzez naciśnięcie przycisku podłączonego do portu PD2 mikrokontrolera.
    Przycisk enkodera służy do rozpoczęcia odliczania czasu, którego zliczenie do 0 powoduje odpalenie ładunku pirotechnicznego albo silnika etc.. (fajerwerki również) bądź też do wejścia w tryb manualny (o którym mowa była wczesniej) wtedy i tylko wtedy gdy czas będzie równy 99.
    Kontrola zapalnika
    Układ timera wyposażony jest również w kontrole obecności zapalnika, a realizuje to dzielnik napięcia złożony z rezystorów 12k ohm oraz 7,5k ohm który z 13V daje nam na wyjściu 5v. (13V ponieważ wiekszość akumulatorów ma około 12V z hakiem więc wziąłem pod uwagę 13V.). Całość podłączona jest do portu PC0 mikrokontrolera (ADC). Gdy zapalnik zostanie wykryty, zostanie włączona kropka DP2 na wyświetlaczu (prawy dolny róg) który zasygnalizuje jego obecność. Port ten (ADC) i konfiguracja dzielnika napięcia umożliwia modyfikację programu do odczytywania napięcia na drucie oporowym. Ze względów bezpieczeństwa dodałem opornik 1k ohm, który ogranicza prąd docierający do uC i zabezpiecza go przed dużym prądem.
    Buzzer
    Buzzer jest tutaj fajnym gadżetem, który sygnalizuje akustycznie każdą sekundę oraz sam moment "odpalenia" :).
    Mosfet
    Cała robotę rozpalania drutu oporowego pełni MOSFET IRF3711S który sterowany jest masą od strony Atmegi poprzez tranzystor PNP BC847A. Rezystory podciągające służą do wymuszenia stanu linii pomiędzy tranzystorem a MOSFET'em w taki sposób aby podczas uruchomienia układu oraz podłączonego zapalnika (co nie jest wskazane) nie było przypadkowego odpalenia ładunku - gdybyśmy byli koło niego.
    Przyciski
    Dodatkowo każdy przycisk posiada sprzętową eliminację drgań - jest ona zawsze pewna nie to co program :). Składa sie ona z: rezystora 330 ohm pomiędzy pinem uc a przyciskiem, w szeregu jest kondensator 100nF ceramiczny i całość tuż za opornikiem 330 ohm po stronie przycisku, podłączona przez rezystor 47k ohm do zasilania VCC +5V.
    Dioda prostownicza
    W układzie została użyta dioda prostownicza 1N4007 (SM4007 smd), która zabezpiecza układ przed odwrotnym podłączeniem zasilania. Należy pamiętać, że owa dioda powoduje spadek napięcia w okolicach 0.7V.
    Software
    Cały program został napisany w języku C (wydaje mi się włatwiejszy niż C++) w programie AVR studio 4 i przy użyciu kompilatora avr-gcc. Starałem się aby cały kod został opatrzony w niezbędne komentarze oraz niektóre elementy wpakowałem do osobnych plików nagłówkowych, tak aby ich modyfikacja była szybka bez długiego szukania fragmentu w kodzie.

    Działanie przycisków
    Pozwoliłem sobie stworzyć odpowiednio tabęlkę, która pokazuje dostępne opcje urządzenia, zarówno przed startem odliczania oraz po "starcie" - czyli naciśnięciu przycisku enkodera.

    Timer do silników rakietowych/fajerwerków etc.
    Fuse bits
    Trzeba pamiętać również o własciwym ustawieniu Fuse bitów, a mianowicie ustawienie sygnału taktującego mikrokontroler. W tym projekcie jest to 8Mhz wew.
    sparkv2_nowy.c
    Jest to główny plik (coś jak znane i lubiane main.c), który kontroluje wszystko. Posiada on zdefiniowane pliki nagłówkowe i standartowe biblioteki jak np. <avr/io.h> . Dzieki zdefiniowaniu makr (widoczne poniżej) możliwe jest szybkie zastosowanie wyrażenia BUZZER_ON; niż pisać _BV(PD7) i uniknąć przy ty błędów...

    // Definicja makr (aby łatwiej było używać częstych zmian danego portu. (np. włacz/wyłącz buzzer)
    #define RCK_ON PORTB |= _BV(PB2)
    #define RCK_OFF PORTB &= ~_BV(PB2)

    #define HOT_WIRE_ON PORTB &= ~_BV(PB1)
    #define HOT_WIRE_OFF PORTB |= _BV(PB1)

    #define BUZZ_OFF PORTD &= ~_BV(PD7)
    #define BUZZ_ON PORTD |= _BV(PD7)

    #define WYS1_OFF PORTD |= _BV(PD0)
    #define WYS1_ON PORTD &= ~_BV(PD0)

    #define WYS2_OFF PORTD |= _BV(PD1)
    #define WYS2_ON PORTD &= ~_BV(PD1)

    #define FIRE_ON PORTD &= ~_BV(PD6)
    #define FIRE_OFF PORTD |= _BV(PD6)
    // ====================================================================

    Oczywiście program oparty jest w dużej mierze na przerwaniach oraz TIMER'ach, które kontrolują odliczanie sekund i sygnalizacje akustyczną (Buzzer).

    Tryb automatyczny jest domyślny. Zastosowanie funkcji if(argument), wykonuje przechodzenie pomiędzy trybami - automatycznym i manualnym. Naciśnięcie przycisku powoduje zmiane argumentu w funkcji if() co powoduje wyjście z niej i przejście do kolejnej. Wewnątrz funkcji if() zastosowałem pętlę while(), która w nagłówku posiada np. manual=1 (typ boolean) i gwarantuje mi jej wykonywanie dopuki nie zajdzie potrzeba np. wyjścia z tego trybu. Następuje to np. poprzez wpisanie do argumentu manual wartości 0, która powoduje przerwanie funkcji while.
    enkoder.h
    W tym pliku nagłówkowym zawarłem tylko i wyłącznie obsługę enkodera. Przechowuje ona i definuje niezbędne zmienne, do określania kierunku obrotu enkodera. Jest to gotowe rozwiązanie z ksiażki T. Francuz'a i uważam, że nie ma sensu wywarzania otwartych drzwi. Jest to znakomicie opisane w jego książce co serdecznie polecam.
    ioinit.h
    Niniejszy plik nagłówkowy posiada inicjację portów I/O mikrokontrolera. Definiuje ona kierunek portów (wejście/wyjście) oraz czy ma zostać zastosowany Pull-up na danym porcie czy nie.
    _BV(port); oznacza wpisanie logicznej "1" i powoduje odpowiedniu w rejestrze DDRx (gdzie x to literka portu, np.D) jako wejście, a w rejestrze PORTx jako Pull-up.


    Działanie układu:



    oraz


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    Templarious
    Poziom 22  
    Offline 
    Specjalizuje się w: systemy operacyjne, elektronika
    Templarious napisał 1141 postów o ocenie 81, pomógł 48 razy. Mieszka w mieście Warszawa. Jest z nami od 2008 roku.
  • #2
    s.uchy
    Poziom 10  
    Witam. A czy kolega wrzuci wsad? czy nie udostępnia takich rzeczy?