Poprzedni temat «» Następny temat
Energooszczędny XMEGA32E5 - Pierwsze podejście do AVR Xmega
Autor Wiadomość
Ertew 
-.^



Wiek: 26
Dołączył: 03 Lip 2005
Posty: 1347
Skąd: Leszno
Wysłany: 2015-07-26, 19:37   Energooszczędny XMEGA32E5 - Pierwsze podejście do AVR Xmega

Jakieś 5 lat temu organizowałem prezent na ważną uroczystość kolegi, również elektronika. Prócz oficjalnego prezentu postanowiłem wykonać też drobny gadżet, który samą obecnością przywoła wspomnienia. Wybór padł na 'system wieloprocesorowy' opisany przez Gawła i do niedawna dostępny w starym Elportalu.
Dla osób które nie natrafiły na ten projekt zamieszczę drobne streszczenie. Bierzemy 6 procesorów identycznych pod względem wymiarów, najlepiej starych złoconych. Idealnie nadają się 386 i 486, Pentium, P. MMX, P2, P3 i Celeronowe odpowiedniki. Z kolekcji AMD dobre są również ceramiczne Durony. Z procesorów składamy sześcian pinami do środka, wyjmujemy jeden i przez okno lutujemy piny pozostałych sztuk. Na koniec brakujący procesor mocujemy z użyciem kleju. W ten sposób otrzymujemy estetyczny przycisk do papieru.
A jak zagospodarować wnętrze powstałej obudowy? Ja upchnąłem tam 2 paluszki R6 (AA), klasyczny multiwibrator na 2 tranzystorach i jednego białego LEDa. Cały układ tak zaprojektowałem by błyskał LEDem co kilka sekund przy możliwie małym poborze prądu. Do tego by optymalnie wykorzystać energię baterii, LED został podłączony od strony bazy, przez co wykorzystywał energię zgromadzoną w kondensatorze na zasadzie podwajacza napięcia.
Z relacji kolegi wiem że układ spełnił pokładane nadzieje, błyskając nieprzerwanie przez jakieś 3 lata. Całkiem nieźle jak na urządzenie gdzie energooszczędne komponenty były dobierane na czuja.



Ale wróćmy do tematu.
Kolejnego kolegę wypadało by obradować czymś własnej roboty. Problemem jest tylko termin, czas na realizację wynosi kilka tygodni a praktycznie wszystkie komponenty trzeba zamówić. Tydzień polowania na aledrogo i udało się upolować garść nowszych procesorów.

Oto 3 kostki które udało mi się złożyć z zakupionych procesorów. Od lewej:
- 3 Durony i 3 Celeron3 na kolorowych płytkach drukowanych,
- 6 Duronów w obudowach ceramicznych,
- 2 Pentium MMX i 4 Celeron3 na czarnych płytkach drukowanych.

Tym razem wybór padł na czarny sześcian. Kanty porządnie przejechałem papierem ściernym by zmieścić na nich LEDy, a jeśli o nich mowa to zaryzykowałem użycie białych 'oświetleniowych' z TME, model DB2835N-C7.



Skoro już mam obudowę, teraz to co tygrysy lubią najbardziej, czyli wnętrzności.
Układ analogowy już był, teraz czas na użycie mikroprocesora. Szybkie wyszukanie gotowców i znalazłem dwa projekty gotowe do powielenia:
http://www.technoblogy.com/show?KX0
https://arduinoelectronics.wordpress.com/2014/01/06/ultra-low-power-led-flasher-with-attiny/
Szybka kalkulacja, kilkanaście uA przy baterii CR2032 oznacza rok życia urządzenia - zdecydowanie za mało. Przy baterii CR123A już mam sensowny czas życia urządzenia. Pytanie czy da się jeszcze lepiej?
W tym momencie przypomniałem sobie o prockach z rodziny Xmega, podobno energooszczędnych. Świetna okazja by to sprawdzić i nauczyć się czegoś nowego. XMEGA32E5 leży w szufladzie i czeka na lepsze czasy, bo UsbAsp nie chce się z nim dogadać. Programator Atmel-ICE w wersji gołej zamówiony z Seguro (może jestem burżujem, ale nie będę przepłacać za kabelek i obudowę), magiczny kabelek z miniaturowymi złączkami również. Zatem do dzieła.


Jak widać na fotkach, da się nawet na płytce uniwersalnej dla elementów DIL przy użyciu lutownicy transformatorowej ;) Do tego jeszcze LED i można zacząć kodzić.

Rezultat kilku dni kombinowania:
- pobór prądu przy wewnętrznym oscylatorze RC 2Mhz - 1.5mA,
- przełączenie na taktowanie 1khz (RC 32khz plus dzielnik), wyłączenie zbędnych peryferiów, ustawienie pinów jako wyjścia - 200uA,
- j/w plus uśpienie do power save (chodzi generator RC 32khz, licznik RTC wygeneruje przerwanie i obudzi uC) - 100uA, chyba robię coś nie tak,
- procesor zabity (power down) a porządku pilnuje WatchDog - poniżej 1uA, chyba znalazłem właściwą drogę.

Zostało jeszcze wymyślić jak sterować LEDem by nie stracić wszystkiego co oszczędziłem wcześniej, oraz wykorzystać maksimum energii baterii. Tutaj ponownie pomógł mi podwajacz napięcia gdyż LED wymaga prawie 3V do działania a procesor żyje przy napięciu poniżej 2V.

Przy jednej zmianie polaryzacji kondensator ładowany jest prądem ograniczonym przez R2 by nie obciążać zbytnio źródła zasilania. Kolejna zmiana polaryzacji generuje błysk o energii ograniczonej pojemnością kondensatora, a R1 ogranicza prąd do wartości bezpiecznej dla wyjść uC. Teraz wystarczy zmieniać stan pinów z częstotliwością np. 1hz i dowolnym wypełnieniem, a LED powinien błyskać jak należy.
Dwukrotne zwiększenie pojemności i błyski LEDa będą zauważalne nawet w dzień.

Szybki test, przy kondensatorze 1uF i błyskaniu 1hz odnotowałem średni pobór prądu na poziomie 5uA, analogicznie 10uA dla 2hz i 3uA przy 0.5hz.
Przy wariancie 1hz, naładowany kondensator 1mF wystarczył na 5 minut błyskania. Niewiarygodne a jednak możliwe.

Zakładając pobór prądu na poziomie 10uA, bateria CR2032 daje 2 lata działania, CR123A to jakieś 15 lat pracy. Niestety nie udało mi się w rozsądnym czasie zdobyć koszyka na baterie CR123 więc jako źródło zasilania zastosowałem paluszki alkaliczne w odpowiednim koszyku. Szacuję że 2 paluszki R3 (AAA) mimo podobnej pojemności, ze względu na trwałość chemiczną wystarczą na jakieś 5 lat pracy. Czas pokaże czy miałem rację.


W ostatecznej wersji urządzenia zastosowałem 4 LEDy i 4 obwody pokazane na wcześniej zamieszczonym schemacie, podłączone odpowiednio pod piny A2 i A7, C7 i C4, D7 i C1, D4 i D2. Do tego zgodnie z wcześniejszymi zdjęciami, 2 kondensatory, zworki na liniach VCC i GND, złącze zasilania oraz złącze programatora. Całość przyklejona do jednej ze ścianek na hot-gluta. Jak mówią, prowizorka działa najdłużej. Prawdopodobnie w kolejnej wersji błyskacz dorobi się porządnej płytki drukowanej, piezo i czujnika światła (informacja o konieczności wymiany baterii lub otwarta droga do pipka-dręczyciela).
Na fotkach widać stronę górną z czterema LEDami oraz stronę dolną z stopą wykonaną z kleju.
Stopa dolna jest elementem demontowalnym, pozwalającym na ewentualną wymianę baterii. Udało mi się tak wykonać kostkę, że ten procesor wchodzi idealnie na wcisk, dla pewności w narożnikach poprawiłem połączenia klejem.

Zdjęć wnętrza nie będzie ponieważ aparat padł i nie było czasu na naładowanie. Film prezentujący działanie jest, ale ze względu na krótki czas błysku, praktycznie nic nie udało mi się uchwycić.
Jedyna nadzieja w tym, że osoba obdarowana zechce udokumentować efekt mojej pracy, podeśle lub sama opublikuje film i zdjęcia z działania urządzenia.


Poniżej znajduje się kod programu który po prostu błyska kolejnymi LEDami z częstotliwością 0.5hz. Kompilowałem w kombajnie zwanym AtmelStudio 6.2. W planie było wprowadzenie algorytmu błyskania losowego lub rytmicznego (odpowiednio długa tablica), jednak czas nie pozwolił na implementację tego pomysłu. Cóż, zawsze jest punkt zaczepienia dla rozbudowy kolejnej wersji...
Kod:
#include <avr/io.h>
//#include <util/delay.h>
#include <avr/sleep.h>
//#include <interrupt.h>

volatile  uint8_t licznik __attribute__((section (".noinit")));            // zmienna sterująca mrugającymi diodami

int main(void) {
    /*
    CCP = CCP_IOREG_gc; // odblokowanie zmiany preskalera
    CLK.PSCTRL = CLK_PSADIV_32_gc | CLK_PSBCDIV_1_1_gc; //włączenie preskalera 32
   
    OSC.CTRL     =    OSC_RC32KEN_bm;        // włączenie oscylatora 32k
    while(!(OSC.STATUS & OSC_RC32KRDY_bm));  // czekanie na ustabilizowanie się generatora
    CPU_CCP      =    CCP_IOREG_gc;         // odblokowanie zmiany źródła sygnału
    CLK.CTRL     =    CLK_SCLKSEL_RC32K_gc;  // zmiana źródła sygnału na RC 32k
    */

    PORTA.OUT = 0b11110000;
    PORTA.DIR = 0b11111111;
   
    PORTC.OUT = 0b00111111;
    PORTC.DIR = 0b11111111;
   
    PORTD.OUT = 0b00000111;
    PORTD.DIR = 0b11111111;
    PORTR.DIR = 0b11111111;
       
    ++licznik;
   
   
    if (licznik == 1)
    {
        PORTA.OUT = 0b00001111;
    }

    if (licznik == 2)
    {
        PORTC.OUT = 0b11000111;
    }

    if (licznik == 3)
    {
        PORTC.OUT = 0b00111000;
        PORTD.OUT = 0b11000111;       
    }

    if (licznik > 4)
    {
        PORTD.OUT = 0b00111000;
        licznik = 0;
    }
   
    //wyłączenie niepotrzebnych peryferiów
    CCP = CCP_IOREG_gc; //*///
    PR.PRGEN = PR_XCL_bm |
    PR_EVSYS_bm |
    PR_EDMA_bm ;
    CCP = CCP_IOREG_gc;
    PR.PRPA = PR_DAC_bm |
    PR_ADC_bm |
    PR_AC_bm ;
    CCP = CCP_IOREG_gc;
    PR.PRPC = PR_TWI_bm |
    PR_USART0_bm |
    PR_SPI_bm |
    PR_HIRES_bm |
    PR_TC5_bm |
    PR_TC4_bm ;
    CCP = CCP_IOREG_gc;
    PR.PRPC = PR_USART0_bm |
    PR_TC5_bm ;  //*///
   
   
    CCP = CCP_IOREG_gc;
    WDT.CTRL = WDT_ENABLE_bm | WDT_CEN_bm | WDT_PER_2KCLK_gc;
    // Enable WarchDog at 1s time
    //set_sleep_mode (SLEEP_MODE_PWR_SAVE);
    set_sleep_mode (SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sleep_cpu();
}
 
 
     
sstasinek
Nowy na forum


Dołączył: 24 Sty 2015
Posty: 12
Skąd: centrum
Wysłany: 2016-02-28, 11:22   Re: Energooszczędny XMEGA32E5 - Pierwsze podejście do AVR Xm

Jedno jedyne słowo: "aledrogo".
Jeśli jest drogo to dlaczego tam kupujesz.. jisas aż wzbiera we mnie.
 
 
     
Ertew 
-.^



Wiek: 26
Dołączył: 03 Lip 2005
Posty: 1347
Skąd: Leszno
Wysłany: 2016-05-02, 11:03   Re: Energooszczędny XMEGA32E5 - Pierwsze podejście do AVR Xm

sstasinek napisał/a:
Jedno jedyne słowo: "aledrogo".

Kwestia przyzwyczajenia. Wszyscy znajomi mówią aledrogo, więc i ja przyjąłem tą nazwę.
 
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  


Powered by phpBB modified by Przemo © 2003 phpBB Group
Strona wygenerowana w 0,03 sekundy. Zapytań do SQL: 10