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

Zasilanie ATmega128 z akumulatora

silvanjk 09 Mar 2010 12:13 3271 25
  • #1 09 Mar 2010 12:13
    silvanjk
    Poziom 12  

    Witam. Mam taki problem (jestem elektrykiem, a nie elektronikiem), mianowicie:

    Mam zbudować układ, oparty na ATmega128.
    Mają to być 2 płytki scalone (każda ze swoim uP), komunikujące się ze sobą za pomocą transmitera Rf1.2b (również po 1 sztuce na każdym scalaku).

    Nie wiem, jak zrobić zasilanie, wymogi są następujące:
    Jedna z nich ma być zasilana z portu USB komputera, przechodzącego w RS232 - i w konsekwencji podłączanego do omawianego scalaka (Scalak nr 1 = S1)

    Scalak 2 (S2) ma być zasilany z jakiegoś własnego źródła napięcia (bateria, akumulator). Z tego co zdążyłem wyczytać o ATmega128, to przy 16MHz jej zasilanie to przedział od 4.5 do 5.5V.

    Transmiter Rf12b (http://www.hoperf.com/rf_fsk/RF12B.htm) zasilanie ma od 2.2 - 3.8 V.

    Ma ktoś może jakieś pomysły, jak takie coś zorganizować?

    I jeszcze proszę o oszczędzenie mi żargonu - pewnie wiele nie zrozumiem ;)

    Z góry dziękuję.

    Ah, no i chciałem zapytać, czy w takich przypadkach, jak zasilanie nie z sieci, ale z USB/RS232, czy też z baterii wymagane są również jakieś filtry, czy stabilizatory?

    0 25
  • Sklep HeluKabel
  • #2 09 Mar 2010 12:34
    any56
    Poziom 39  

    Oczywiście!
    Przy zasilaniu z aku powinieneś zastosować stabilizator 5V (np. 7805).

    0
  • Sklep HeluKabel
  • #3 09 Mar 2010 13:10
    nenpa8lo
    Poziom 17  

    Jeżeli urządzenie ma być przenośne to odradzał bym stabilizator ze względu na straty i zastąpił bym przetwornicą.

    0
  • #4 09 Mar 2010 14:11
    pagask
    Poziom 11  

    użyć atmegi128L (jeżeli to 16MHz nie jest krytyczne) wtedy pójdzie na tym aku bez żadnych stabilizatorów

    0
  • #5 10 Mar 2010 14:47
    silvanjk
    Poziom 12  

    A jakieś schematy takich połączeń przy tych zasilaniach?
    Z baterii i RS232?

    Jak z filtrowaniem? Urządzenie ma pracować w towarzystwie silników indukcyjnych, a więc źródła pola el-mg.

    I jak podłączyć do tej części zasilanej z baterii, miernik cęgowy (a nawet 2 - na dwóch różnych fazach)?
    Zależnie od silnika prąd będzie od dziesiątych części ampera do kilkunastu, czy może nawet kilkudziesięciu A.
    Pewnie trzeba jakiś przetwornik A/C zastosować.
    Dane o wartości prądu mają być paczkami wysyłane przez tą jednostkę z akumulatorem, do tej jednostki podłączonej do komputera, a z niej - już bezpośrednio do kompa.

    0
  • #6 12 Mar 2010 13:53
    Kabuto15
    Poziom 18  

    Jeśli chodzi o zasilanie i ew. stabilizację napięcia to możesz użyć jakieś przetworniczki STEP-UP. Z baterii np. litowo-jonowej (3.7V) będziesz zasilał bezpośrednio Rf12b, a z przetwornicy ATmegę. Napięcie z USB jest ok, jak dobrze zaprojektujesz płytkę, odfiltrujesz zasilanie to będzie działać ok przy silnikach etc.
    Co do pomiarów prądu i użycia przekładnika to musisz dostosować go do swoich potrzeb. Dla mniejszych prądów (do kilku amper) możesz pokusić się o wykorzystanie rezystorów pomiarów, ale dla dużych prądów musisz użyć przekładnika prądowego. Jeśli interesują Cię pomiary dla 50Hz to łatwo i tanio znajdziesz przekładnik, jeśli zaś interesują Cię pomiary w szerokim pasmie to tylko przetworniki LEM. Obecnie są takie nawet cuda jak LTS-8NP (8A), które zasilanie są z 5V a na wyjściu dają napięcie proporcjonalne do prądu od 2.5V (+/-0.625). Tyle, że ciężko Ci będzie mierzyć zarówno części amperów jak i kilkadziesiąt amperów (rozdzielczość przekładników). ATmega ma wbudowany przetwornik ADC więc nie ma problemu z przetwarzaniem na postać cyfrową.

    0
  • #7 15 Mar 2010 14:27
    silvanjk
    Poziom 12  

    Chciałem dopytać jeszcze o kilka rzeczy.
    Jak chcę zrobić to zasilanie z USB. Tam są 2 piny przeznaczone do transmisji, a 2 to +5V i GND.
    Jak z tego zrobić przejście na RS232? Tam jest z kolei 9 pinów...
    I jak wyciągnąć na któryś z tych pinów te 5V? Potrzebuję je do zasilania układu, a tu:
    http://pl.wikipedia.org/wiki/RS-232
    w opisie nie widzę, aby któryś z pinów RS232 był wolny, lub przeznaczony na jakieś napięcie...

    0
  • #8 15 Mar 2010 15:00
    Kabuto15
    Poziom 18  

    Nie da się łatwo przejść z USB na RS232. Najlepszy sposób zastosować układy z serii FT232 (BM, RL). W dokumentacji, którą znajdziesz zobaczysz jak można wykorzystać te +5V z USB do zasilania FT232 oraz ew. innych układów.

    0
  • #9 23 Mar 2010 15:22
    silvanjk
    Poziom 12  

    Co powinno się robić z wolnymi pinami uP, które pozostają nieużywane? Jeżeli robię mały projekcik, chwilowy, dosłownie, aby sprawdzić transmiter Rf12b, to czy muszę się wolnymi pinami przejmować?
    Jeśli tak, to którymi?
    Pozdrawiam.

    0
  • #10 23 Mar 2010 16:38
    _Robak_
    Poziom 33  

    Nie musisz się przejmować specjalnie, ale najlepiej jak ustawisz jako wejścia i podepniesz do masy.

    0
  • #11 23 Mar 2010 17:20
    silvanjk
    Poziom 12  

    A jak chciałbym podłączyć kilka przycisków do jakiegoś portu?
    Mam taki klasyczne przyciski, one mają 4 nóżki.
    Rozumiem, że port ustawiam jako wejście.
    Czy może być to zrealizowane tak, że:
    Od VCC, przez rezystor 22k do masy (tylko, że to ciągły pobór prądu) i dalej, po wciśnięciu przycisku (przed masą) zwieram to VCC przez rezystor do nóżki procesora?
    [img]
    https://obrazki.elektroda.pl/12_1269361234.jpg
    [/img]

    0
  • #12 23 Mar 2010 17:25
    _Robak_
    Poziom 33  

    Tak się tego nie robi, poczytaj na necie;) A jak już poczytasz to dojdziesz do tego dlaczego w AVRach przycisk daję się jedną stroną do pinu procesora a drugą do masy, uprzednio ustawiając pull up na pinie.

    0
  • #13 23 Mar 2010 17:50
    silvanjk
    Poziom 12  

    Chodzi o to, że pin wewnątrz jest podłączony do VCC (czy jakiegoś tam innego napięcia) przez rezystor podciągający.
    Ten rezystor jest tylko po to, aby ograniczyć prąd?
    W takim razie, jeśli przycisk podłączony jest do masy, to po jego wciśnięciu na pinie będzie '0'?
    O to chodzi?
    Czyli procek traktuje 0 na wejściu, jako wciśnięcie przycisku?
    Po jego puszczeniu wraca nam stan wysoki?

    0
  • Pomocny post
    #14 23 Mar 2010 18:09
    _Robak_
    Poziom 33  

    Dokładnie tak jak piszesz;)

    0
  • #15 23 Mar 2010 19:18
    atom1477
    Poziom 43  

    pagask napisał:
    użyć atmegi128L (jeżeli to 16MHz nie jest krytyczne) wtedy pójdzie na tym aku bez żadnych stabilizatorów

    Że co?

    0
  • #16 23 Mar 2010 21:09
    rpal
    Poziom 27  

    atom1477 napisał:
    pagask napisał:
    użyć atmegi128L (jeżeli to 16MHz nie jest krytyczne) wtedy pójdzie na tym aku bez żadnych stabilizatorów

    Że co?

    a co się kolega atom tak dziwi może to jest wersja lampowa z zasilaniem napięciem stałym na poziomie 200V:)

    0
  • #17 23 Mar 2010 22:28
    atom1477
    Poziom 43  

    Ale kolega nie ma akumulatora 6V do żażenia procesora więc bez przetwornicy 12/6.3V i tak się nie objedzie. ;)

    0
  • #18 23 Mar 2010 23:29
    silvanjk
    Poziom 12  

    Aku ma być 3.7 V.
    Rf12b ma zasilanie chyba do 3.8V, a ATmega128L od 2.8V, więc stabilizator na 3V byłby chyba na miejscu?

    0
  • #19 23 Mar 2010 23:35
    atom1477
    Poziom 43  

    No to trzeba było od razu napisać że akumulator będzie miał 3,7V..
    Myślę że możesz wszystko zasilić bezpośrednio bez żadnych stabilizatorów. RFM12B wytrzyma i 5V.

    0
  • #20 24 Mar 2010 21:23
    silvanjk
    Poziom 12  

    Mam taki problem. Połączyłem sobie taką płytkę, ustawiłem portA ATmega16 jako wyjście, i daje on w stanie wysokim tylko 1.5V. Ktoś wie, dlaczego?
    Z tego, co wyczytałem w DS, powinno być min. 4.5V.

    0
  • #21 24 Mar 2010 22:38
    ShEvU_elektro
    Poziom 25  

    daj prosze kod, to zobaczymy:)

    0
  • #22 24 Mar 2010 23:47
    silvanjk
    Poziom 12  

    Kod wygląda następująco:

    Code:
    .include "m16def.inc"
    

    ldi R16, 0xFF
    out DDRA, R16

    ldi R16, 0b00000000
    out DDRD, R16



    ldi R16, 0x0F
    out PORTD, R16


    ldi R17, 0b00001011
    ldi R18, 0b00000000



    petla:


    Calosc:

    NieMa:
       out PORTA, R18
       sbic PIND, PIND5
    rjmp NieMa


    Jeest:
       out PORTA, R17
       sbis PINd, PINd5
    rjmp Jeest


    rjmp Calosc

    rjmp petla


    Co jest ciekawe, później się to zmieniło. Diody świeciły już jasno.
    Gorsze jest to, że mi w ogóle nie reaguje na rozkazy 'sbic' oraz 'sbis'. Mam JTAGICE, więc przy debugu widzę, że np. bez wciśnięcia klawisza pętla wykona się z 4 - 5 razy (powinna w nieskończoność) i przeskakuje dalej. Właściwie, to robi sobie co chce...

    Ah, no i wypada dorzucić schemat:
    Zasilanie ATmega128 z akumulatora


    Na płytce uniwersalnej, musiałem użyć wielu przewodów do połączeń (http://www.kamami.pl/published/publicdata/BTC10/attachments/SC/products_pictures/cab_a_red.jpg). Nie wiem, czy problemy nei wynikają właśnie z tego powodu...


    ---------------

    Powyższa kwestia rozwiązana...
    Zamiast:


    Code:

    ldi R16, 0x0F
    out PORTD, R16


    powinno być:
    Code:

    ldi R16, 0xFF
    out PORTD, R16

    0
  • #23 28 Mar 2010 11:09
    silvanjk
    Poziom 12  

    Pojawił się kolejny problem. Zlutowałem 2 płytki zgodnie z powyższym schematem (kilka postów wyżej).
    Jeden jest całkiem ok, wszystko elegancko, drugi po kilku programowaniach za pomocą JTAG'a zaczął wywalać błąd, który jest w poniższym rysunku w oknie dialogowym na dole:
    Zasilanie ATmega128 z akumulatora

    Chodzi o te ostrzeżenia od JTAGICE.

    -----------------------------------


    I z tym sobie poradziłem... Odłamał się lut przy pinie przy resecie.

    Mam inne pytanie. Przeszukałem trochę elektrodę, ale nie mogę znaleźć konkretnego tematu (inne dotyczyły gotowych generatorów czasowych), mianowicie:
    Chciałbym, aby coś się stało po pewnym czasie, przykładowo 1s - załóżmy, dioda zaświeci dopiero jedną sekundę po wciśnięciu klawisza. Albo zaświeci na 1 sekundę i zgaśnie.
    Taka pętla. Nie bardzo wiem, jak to zrobić.
    Z tego co zdążyłem się zorientować, to ważny jest czas trwania rozkazów. Przykładowo noop trwa 1 cykl zegarowy (chyba) co przy jednym MHz daje 1/1000000 s (tak mi się wydaje). Więc musiałbym zapętlić ten rozkaz milion razy, po czym powinno nastąpić wyjście z pętli. Ale jak to zliczyć?
    Pozdrawiam.

    0
  • #24 28 Mar 2010 20:12
    rpal
    Poziom 27  

    kolenia niech sprawdzi czy nie ma pozwieranych wyprowadzeń bo skoro powinno być 0 a jest 1,5 V to na to ewidentnie wskazuje. Najprędzej z piniem które pracuje jako wyjście i ma akurat logiczne 1 na wyjściu.

    0
  • #25 28 Mar 2010 23:15
    silvanjk
    Poziom 12  

    Dzięki, ale z tym sobie już poradziłem. Nie cały port miał włączone podciąganie (0F zamiast FF)...

    Wiesz może coś o tej pętli? Taki klasyczny pascalowy 'delay(1000);'

    Pozdrawiam.

    0
  • #26 13 Kwi 2010 11:04
    silvanjk
    Poziom 12  

    Witam. Mam pytanie.
    Dotyczy assemblera, a mianowicie konkretnej komendy (czy raczej argumentu):
    Kod:

    Code:

    ldi R16, (1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (ADPS1) | (1<<ADPS0) | (1<<ADATE)



    a<<b
    Wiem, że '<<' oznacza przesuwanie logiczne wartości 'a' o 'b' pozycji w lewo, zaś '|' to chyba po prostu OR, ale nie bardzo rozumiem sens tego i cel. Po co przesuwać jakaś wartość o ileś pozycji? Nie lepiej po prostu ustawić interesujący nas konkretny bit chcianą wartością? Poza tym co oznacza przesuwanie? W jakimś bajcie [7 6 5 4 3 2 1 0]... No właściwie nawet nie wiem, jak to powiedzieć. Skąd dokąd się coś przesuwa?
    Poza tym, jeżeli parametr 'b' jest np całym bajtem? To co wtedy?
    Już pomijam tego '|' ORa. Po co ten or? Do czego to?

    Może po prostu ktoś to wyjaśni prosto :) Może z jakimś dziecinnym przykładem... Trochę się z tym motam.

    Chodzi o dokumentację dla RF12b (Code). Tam jest co prawda używane C, ale kod wygląda podobnie, służy do ustawień Rf'a jako nadajnika lub odbiornika.
    To dość potrzebne, a nie bardzo to rozumiem...
    Tam wygląda to następująco:
    Code:

    #define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL)
    #define HI_SEL() PORT_SEL|= (1<<RFXX_SEL)
    #define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL)
    #define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI)
    #define HI_SDI() PORT_SDI|= (1<<RFXX_SDI)
    #define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI)
    #define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO)


    Nie rozumiem za bardzo, co tu się dzieje... Pomijam już fakt, że to C...

    0