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

Atmega16 - jednokrotne przelaczenie przekażnika hfd41

feelka 07 Mar 2013 07:18 1242 7
  • #1 07 Mar 2013 07:18
    feelka
    Poziom 6  

    Witam!

    Od kilku tygodni mam plytkę avr EVBavr05 i sobie zabawiam sie oprogramowując jej elementy. Ostatnio napisałem program do obsługi i wyświetlania z czujników ds18b20 temperatur. Teraz chciałbym podczas osiągnięcia określonej wartości temperatury zwierać lub rozwierać zewnętrzny układ. ogólnie chodzi o to, że poszukuje układu który by przy określonej temperaturze Th rozwierał mi zewnętrzny układ, natomiast przy Tl zwierał. Wyjście rel1 podłączyłem do PD1 natomiast rel2 do PD2 i jak ustawiam cały port jako wyjście coś mi sie przełącza, natomiast gdy jest jako wejście rozłącza. Ale to jest tylko jednokrotne przełączenie. Nie wiem, bo nigdzie nie mogłem wyczytać, czy tylko jeden raz można przełączyć taki przekaźnik, czy dałoby radę oprogramować go jakoś, żeby program mógl go zwierać lub rozwierać co określony warunek , np. czas.

    Prosiłbym o jakieś sugestie, i ogólne stwierdzenie, ze wykorzystując ta płytkę jestem w stanie zwierać i rozwierać zewnętrzny układ i jeśli tak to jak napisać taki program. ogólnie dzięki za all podpowiedzi

    0 7
  • Relpol
  • #2 07 Mar 2013 07:31
    chudybyk
    Poziom 26  

    Pokaż schemat i kawałek programu, to szybciej dojdziemy co namieszałeś.
    Port powinien być ustawiony jako wyjście, żeby wysterować cokolwiek. Jeśli będzie to przekaźnik, to nie polecam podłącza go bezpośrednio ze względu na indukcyjnośc cewki przekaźnika. Wykorzystaj dodatkowy tranzystor lub układ pośredniczący, np ULN2803
    Sterowanie odbywa się oczywiście poprzez ustawienie wartości wyjściowej portu (PORTx), a nie kierunku (DDRx)!
    Pozdrawiam!

    0
  • Relpol
  • #3 07 Mar 2013 11:42
    feelka
    Poziom 6  

    Code:
    #include <avr/io.h>
    
    #include <util/delay.h>
    #define rel1 PD5
    #define rel2 PD6
    #define przekazniki ((rel1 <<1) | (rel2<<1))
    #define przelaczanie PORTA ^= przekazniki
    int main(void)
    {
       int i=0;
       if(i)
       {
          DDRD = 0xff;
       }
       while(1)
       {


          PORTD |= ((1<<rel1)|(1<<rel2));
          _delay_ms(1000);
          PORTD&= ~((1<<rel1)|(1<<rel2));
          _delay_ms(1000);
       }

       while(1);
       return 0;
    }


    tak wygląda mój program. Ogólnie płytka była juz gotowa i ma w opisiecos takiego:
    Zastosowane przekaźniki sterowne są poprzez tranzystor. Bazy tranzystorów są wyprowadzone na złącze MISC jako REL1 oraz REL2 natomiast końcówki przekaźników: NC, NO, COM do złącz RL1 i RL2, pozwalając użytkownikowi na sterowanie zewnętrznymi układami.

    ja chciałbym po prostu wiedzieć, czy można go zastosowac jako uklad do zwierania i rozwierania ukladow. Ogolnie to zamierzam zrobić tak: do 1 przekażnika wlożyć jedną nozkę zasilacza i jedna końcowkę ukladu, natomiast do drugiego, drugą nózkę zasilacza i drugą końcowke obwodu ( jest to uklad z drutem oporowym, na ktorym mierze temperaturę). W momencie osiagnięcia przez uklad okreslonej temperatury ma się zwierać układ(prąd plynie przez drut oporowy), natomiast w przypadku th rozwierać( nie plynie prąd w ukladzie. I nie wiem sam juz czy tymi przekaznikami jestem w stanie wysterowac taką pracę.

    0
  • #4 07 Mar 2013 11:58
    chudybyk
    Poziom 26  

    Jasne, że można układ stosować jako sterowany wyłącznik. Po to właśnie ma przekaźniki.
    W programie widze mały bałagan, ale to co powoduje problemy to początek funkcji main(). Konfiguracja portu DDRD jest unieszczona w ciele instrukcji 'if', która nigdy się nie wykona, bo 'i' jest równe 0. Wyrzuć 'if'-a, zostaw przypisanie DDRD i będziesz do przodu.

    0
  • #5 07 Mar 2013 12:14
    BlueDraco
    Specjalista - Mikrokontrolery

    Wyrzuć z tego programu pierwszy if i ostatni while, to będzie miał szansę zadziałać. Obecnie ustawiasz i na 0, a następnie ustawiasz port jako wyjście, pod warunkiem, że i nie jest zerem (czyli nigdy).

    0
  • #6 07 Mar 2013 16:31
    feelka
    Poziom 6  

    dobra to dzięki ale to chyba raczej wada mojego przekaźnika. W sumie dzięki, ale nie działa nadal, chyba mój przekaznik ma możliwość tylko jednokrotnego zwarcia lub rozwarcia. W schemacie mam rel1, rel2 i rel3 a mam tylko jedno wyprowadzenie na płytce więc jakaś lipa.

    0
  • Pomocny post
    #7 07 Mar 2013 17:43
    BlueDraco
    Specjalista - Mikrokontrolery

    Skoro uważasz, że to przekaźnik jest winny temu, że Twój program nie chce go przełączyć, to trwaj dalej w tym mylnym przekonaniu. Każdy przekaźnik daje się w programie ałączać i wyłączać, pod warunkiem, że w programie jest to napisane. U Ciebie w programie tego nie ma.

    Podłącz zamiast przekaźnika diodę świecącą (z szeregowym rezystorem oczywiście), a będziesz mógł snuć teorie o diodach , które gasną lub zapalają się tylko raz.

    0
  • #8 08 Mar 2013 11:17
    feelka
    Poziom 6  

    dziala, dzieki za pomoc

    Code:
    #include <avr/io.h>
    
    #include <util/delay.h>
    #define rel1 PA0
    #define rel2 PA1
    int main(void)
    {
       DDRA = 0xff;
       while(1)
       {
          PORTA = ((1<<rel1)|(1<<rel2));
          _delay_ms(2000);
          PORTA &= ~((1<<rel1)|(1<<rel2));
          _delay_ms(2000);
       }



       return 0;
    }

    0