• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 5
  • 1
  • 2
  • 3
  • 4
  • 5
Zegar RTC PCF8563 lub inne zasilanie z baterii. Czy są takie dostępne?
#41
kaczakat a sprawdzałeś to z prockiem, żeby uspać Atmege i zostawić to na parę dni na baterii?
U mnie strasznie Rabie baterie ten pcf jak jest w trybie alarmu nawet do 400uA. Moim zdaniem nie nadaje się do zasilania z baterii nawet przy 3.3V no chyba że coś robiłem źle. Narazie to porzuciłem bo muszę inne tematy pokończyć. Timer jest bardzo fajny tylko ten prąd....
 
Odpowiedź
#42
Nie no ja mam dylemat czy w faktycznym użyciu to będzie bardziej 1, 3 czy 12uA, 400uA to tak na czuja mi się kojarzy niewyłączony ADC. To juz ten 3221 ma 10x mniejszy pobór prądu przy 3.3V. Ale wgram jakiś kod z usypianiem uC i pomierzę jeszcze.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#43
Ok będę wdzięczny. Ja u siebie proc uspalem i sam proc pobiera 1uA więc na pewno mi zegar rąbał bo procek śpi jak odlaczalem zegar było 1uA.
Ciekawi mnie ile u ciebie zejdzie tysięcznych volta w ciągu dnia. Bo wychodzi na to że zegar w trybie aktywnego alarmu rąbie do 400uA.
Czasami w układach ciężko jest precyzyjnie zmierzyć dokładny prąd miernikiem szczególnie podczas pracy układu w faktycznym użyciu. Więc wywalam go na baterie i obserwuje miernikiem jak tysięczne volta spadają i wtedy wiem , że coś jest nie tak.
 
Odpowiedź
#44
No ale wystarczy, że wgrasz program ustawiający alarm za godzinę, odłączysz wszystko inne i sprawdzisz ile pobiera sam RTC.

Przy zasilaniu z konwertera UART FTDI ustawionego na 3.3V, a realnie miał 3.46V pobór całego układu to 2.2uA, przy czym uC to 0.1uA, reszta to RTC. Przy zasilaniu 4V z aku 18650 pobór całego układu to 3.5uA. Wyjęcie baterii nic nie zmienia, bo napięcie VCC było wyższe niż baterii.

Być może odtworzyłem problem. Przy zasilaniu z 2.5V uC miał problem by się uśpić w pełni, pobierał 300-400uA. Bez sensu by wtedy pobór prądu rósł przez RTC, bo tak się działo nieważne czy RTC miał baterię czy nie, a nawet go wyjąłem z układu i ciągle pobór był tego rzędu.
Do tego UART działał normalnie w tym stanie, układ niby się usypiał, niby się budził, migał led, drukował godzinę i usypiał się z powrotem, ale żrąc 350uA.
Przeniosłem układ na zasilacz regulowany, rezystor pomiarowy R100, bez baterii, Atmega pobiera w uśpieniu ze 100nA, a cały układ łącznie:
Vcc I
V uA
5 7
4,5 5,1
4,2 4,1
3,5 2,2
3,3 1,7
3 1
2,8 0,8
2,5 0,6
2,3 0,5
2,1 0,4
A po pierwszym włączeniu alarmu 350uA! Tadam.
Na wszystkich Vcc od 5 do 2.1V.
Coś jest w moim programie nie halo, albo na stykówce.
Włożyłem baterie, program ten sam, ustawiłem napięcie 3.1V, pobór ze 100nA, czyli RTC sobie ciągnie ze swojego aku, normalnie się budzi i zasypia. Trochę pomajtałem układem wciskając baterię, więc raczej stykówka.
Chyba trzeba sobie ustawić jakiś pomiar napięcia i jeśli zeżre za dużo to jakoś zadziałać, możne I2C musi poczekać dłużej przed komunikacją, bo się linia nie naładowała po wybudzeniu?
Jeśli się normalnie wybudza to pewnie bezpieczniej byłoby robić te wybudzenia regularnie, a jak coś zacznie żreć prąd to zrobić reset.
Nie mam na razie motywacji by z tym dalej walczyć, bo głównym podejrzanym u mnie jest "kabelkologia"na stykówce.
Ja swoją wiedzę o usypianiu czerpię głównie stąd: http://www.gammon.com.au/power - może coś znajdziesz ciekawego.
Na 4V teraz też działa OK.
Przełączyłem na aku i tak zostawiłem, wybudzanie mam co 2 minuty, zerknę na to rano.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#45
Po dobie pipczenia co 2 minuty napięcie na baterii (tu wystrzał konfetti) WZROSŁO o 0.005V. Zmierzyłem 2 multimetrem, aż wypiąłem ten 1 z pomiaru prądu by to sprawdzić, bo nim mierzyłem wczoraj, faktycznie ten 2 pokazał wyższe nawet o 13mV.
Sprawdzę jeszcze jutro, bo leży w innym miejscu, może temperatura podkręciła wynik, ale wstępnie zaczynam się pakować po odbiór Nobla.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#46
No to nie źle. Jakie napięcie masz na Aku? Czy timer ciągnie z Aku czy masz baterie podtrzymującą?
Przyszło mi z chin 5 szt to jeszcze do tego wrócę. Chociaż mój timer z tpl i Tina też działa git.
 
Odpowiedź
#47
3.9112V, pobór 3,1-3,4uA, bateria jest założona, ale pomiary z wczoraj w tej kolumnie były bez baterii, jak napięcie Vcc jest podawane wyższe, to baterii pastylkowej nie rusza, jak podawałem z baterią poniżej 3.2V to pomiary spadały do 0.1uA, tyle ile brał sam uC, nie brał nic z Vcc.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#48
Muszę to dzisiaj sprawdzić bo temat nie daje mi spokoju.
Dobrze że mam kilka szt ostatnio przyszły może ten co testowałem coś z nim nie tak.
Rozumiem, że żadnych sztuczek programowych nie stosujesz ? Jaka bibliotekę masz? Podasz schemat jak to podłączyłes i biblioteke? 
Czyli wychodzi że przy 4V nie pobiera dużych prądów 3.4 uA to rewelacyjny wynik.

EDIT

Podłączyłem innego pcf i jaja pobór teraz 3.93uA przy 4V mam włączone wew RTC w procku to sam proc pobiera 1uA jak wyłączę RTC to proc będzie pobierał 100nA czyli prąd jeszcze spadnie. Cholera mam coś nie tak z tamtym poprzednim.
Zostaje mi to z powrotem podłączyć do układu i zostawić na 2 dni.
Tak dla pewności zapytam:
Jeśli mój układ pracuje w zakresie 4.2-3.37V to mogę tą baterię cr1220 w timerze zostawić bo i tak będzie brał prąd z Aku i ta mała bateria w timerze powinna wystarczyć na lata?
 
Odpowiedź
#49
Biblioteka ta sama, 99 nie ustawia opcji w timerze.
Baterię możesz zostawić, wyjmowałem do testu jaki jest pobór prądu. Wraz z rozładowaniem baterii pobór prądu powinien spadać, do 400nA przy 2V, krzywa V vs I robi się tym bardziej stroma im bardziej powyżej 3V.
Nie mam jakiegoś specjalistycznego miernika nA, to dość dobry multimetr, ale dla setek nA pomiary już w okolicach ostatniej cyfry wyświetlacza to może być i +/- 100%, ale ciągle to byłoby <1uA. Nie chciałem tego mierzyć przez rezystor 10k by nie wprowadzać dużego zakłócenia.
Sprawdź też jak jest po drugim uśpieniu, bo gdy sie bawiłem przy laptopie było OK, jak przeniosłem na stół z zasilaczem było OK, tylko jak zostawiłem na parę minut i wróciłem to żarło 350uA, bo uC się nie usypiał po wybudzeniu prawidłowo.
Schemat to podłączony moduł RTC do Atmegi 328, Atmega z kwarcem 4MHz by można  ją było zasilać od 1.8V. Nawet rezystor podciągających I2C nie ma, bo biblioteka robi to wewnętrznymi. Całość zasilana jest jest przez rezystor R100, to też trochę ogranicza prąd. Pod pin LED mam jeszcze podłączony LED z R1000 i buzer aktywny przez R20, by słyszeć te mignięcia led co 2minuty.
Kod:
/* Demonstration of Rtc_Pcf8563 Alarms.
*
* The Pcf8563 has an interrupt output, Pin3.
* Pull Pin3 HIGH with a resistor, I used a 10kohm to 5v.
* I used a RBBB with Arduino IDE, the pins are mapped a
* bit differently.  Change for your hw.
* SCK - A5, SDA - A4, INT - D3/INT1
*
* After loading and starting the sketch, use the serial monitor
* to see the clock output.
*
* setup:  see Pcf8563 data sheet.
*         1x 10Kohm pullup on Pin3 INT
*         No pullups on Pin5 or Pin6 (I2C internals used)
*         1x 0.1pf on power
*         1x 32khz chrystal
*
* Joe Robertson, jmr
* orbitalair@gmail.com
*/
#include <Wire.h>
#include <Rtc_Pcf8563.h>

#define debug 1

uint32_t czasTeraz,czasPoprzedni,tik=10; //tik musi byc mniejszy niz 1000 i dzilic 1000ms na rowne czesci
uint8_t nTik,sekundy,minuty,godziny,dni; //liczniki tikow, sekund, itd.
bool fnTik,fsekundy,fminuty,fgodziny,fdni; //flagi zdarzen nowy tik, nowa sekunda,minuta, godzina, dzien
//20221109 21:00       3.9065
//20221110 21:19 3.919 3.9112
/*
Vcc   I
V     uA
5     7
4,5   5,1
4,2   4,1
3,5   2,2
3,3   1,7
3     1
2,8   0,8
2,5   0,6
2,3   0,5
2,1   0,4
*/
bool flaga1;
/* get a real time clock object */
Rtc_Pcf8563 rtc;
/* a flag for the interrupt */
volatile int alarm_flag=0;

const byte led=13;

byte year;
byte month;
byte date;
byte dOW;
byte hour;
byte minute;
byte second;
uint8_t minutki;

void goSleep()
{
  // Wylaczenie ADC
  ADCSRA = 0; 
 
  set_sleep_mode (SLEEP_MODE_PWR_DOWN); 
  sleep_enable();

  noInterrupts ();
 
//Wybudzenie INT0 na pinie 3
  attachInterrupt (0, wakeUp, FALLING);
  EIFR = bit (INTF0);  // clear flag for interrupt 0
//Wylaczenie BOD
  MCUCR = bit (BODS) | bit (BODSE);
  MCUCR = bit (BODS);
  //uspienie
  interrupts ();  // one cycle
  sleep_cpu ();   // one cycle 
}
/* the interrupt service routine */
void wakeUp()
{
  alarm_flag=1;
  sleep_disable();
  detachInterrupt (0);
}

void setup()
{
  pinMode(2, INPUT);           // set pin to input
  digitalWrite(2, HIGH);       // turn on pullup resistors
  pinMode(led,OUTPUT);
  #if debug
  Serial.begin(250000);
  #endif
//  noInterrupts ();
//  CLKPR = bit (CLKPCE);
//  CLKPR = clock_div_8;
//  interrupts ();
  /* clear out all the registers */
//  rtc.initClock();
  /* set a time to start with.
   * day, weekday, month, century, year */
//  rtc.setDate(14, 6, 3, 0, 10);
  /* hr, min, sec */
//  rtc.setTime(1, 15, 40);
  /* set an alarm for 20 secs later...
   * alarm pin goes low when match occurs
   * this triggers the interrupt routine
   * min, hr, day, weekday
   * 99 = no alarm value to be set
   */
   minutki=rtc.getMinute();
//  rtc.setAlarm(99, 12, 99, 99);
  rtc.setAlarm((minutki+=2)%60, 99, 99, 99);

  /* setup int on pin 3 of arduino */
  attachInterrupt(0, wakeUp, FALLING);
  alarm_flag=0;
   goSleep();
}

void loop()
{
  czas();
  #if debug
      if (Serial.available()) {
        getDateStuff(year, month, date, dOW, hour, minute, second);
      rtc.setDate(date, dOW, month, 0, year);
      rtc.setTime(hour, minute, second);
      }
  /* each sec update the display */
//  if (fsekundy and (sekundy%10==0))
//  {
  Serial.print(rtc.formatTime());
  Serial.print("  ");
  Serial.print(rtc.formatDate());
  Serial.print("  0x");
  Serial.print(rtc.getStatus2(), HEX);
  Serial.print("\r\n");
//  }

   #endif
  if (alarm_flag==1){
 

    clr_alarm();

    flaga1=!flaga1;
  }
 
}

void clr_alarm()
{
    minutki=rtc.getMinute();
   #if debug
   Serial.print("blink!\r\n");
   #endif
  rtc.clearAlarm();
  rtc.setAlarm((minutki+2)%60, 99, 99, 99);
//    rtc.setAlarm(99, 12, 99, 99); 
  for (int i=0;i<6;i++)
  {
    digitalWrite(led,! digitalRead(led));
    delay(50);
  }
  alarm_flag=0;
   #if debug
Serial.println("Ide spac");
Serial.flush();
   #endif
goSleep();
}



void getDateStuff(byte& year, byte& month, byte& date, byte& dOW,
                  byte& hour, byte& minute, byte& second) {
    // Call this if you notice something coming in on
    // the serial port. The stuff coming in should be in
    // the order YYMMDDwHHMMSS, with an 'x' at the end.
    // 2210311032200x - bez znakow konca linii i NL
    // 2211067214500x
    boolean gotString = false;
    char inChar;
    byte temp1, temp2;
    char inString[20];
   
    byte j=0;
    while (!gotString) {
        if (Serial.available()) {
            inChar = Serial.read();
            inString[j] = inChar;
            j += 1;
            if (inChar == 'x') {
                gotString = true;
            }
        }
    }
    Serial.println(inString);
    // Read year first
    temp1 = (byte)inString[0] -48;
    temp2 = (byte)inString[1] -48;
    year = temp1*10 + temp2;
    // now month
    temp1 = (byte)inString[2] -48;
    temp2 = (byte)inString[3] -48;
    month = temp1*10 + temp2;
    // now date
    temp1 = (byte)inString[4] -48;
    temp2 = (byte)inString[5] -48;
    date = temp1*10 + temp2;
    // now Day of Week
    dOW = (byte)inString[6] - 48;
    // now hour
    temp1 = (byte)inString[7] -48;
    temp2 = (byte)inString[8] -48;
    hour = temp1*10 + temp2;
    // now minute
    temp1 = (byte)inString[9] -48;
    temp2 = (byte)inString[10] -48;
    minute = temp1*10 + temp2;
    // now second
    temp1 = (byte)inString[11] -48;
    temp2 = (byte)inString[12] -48;
    second = temp1*10 + temp2;
}


void czas()
{
  czasTeraz=millis();
fnTik=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik) //tan napisany warunek jest odporny na "klątwe 50 dni millis()"
{
  czasPoprzedni=czasTeraz;
  fnTik=1;
  nTik++;
  if(nTik>=(1000/tik))
  {
    nTik=0;
    sekundy++;
    fsekundy=1;
     if (sekundy>=60)
    {
      sekundy=0;
      minuty++;
      fminuty=1;
      if (minuty>=60)
      {
        minuty=0;
        godziny++;
        fgodziny=1;
        if (godziny>=24)
        {
          godziny=0;
          fdni=1;
          dni++;
   
        }
      }
    }
  }
}
}
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#50
Dzięki. Robiłem krótkie testy i było ok  do 3 wybudzeń procka. Cały układ 4uA. Zostawiam to na 2 dni niech się testuję ustawiłem czasy 22:00 -->> 6:00 -->> 22:00 i tak w kółko, zobaczę jak to wyjdzie przy podłączonym układzie Aku 3.907V zobaczymy jak to będzie do jutra rano. Wcześniej leciało mi 0.01V w ciągu 12H ewidentnie żarł 400uA. Bateria pastylkowa jest w timerze teraz tylko czekać.
U mnie okresowo wew RTC robi za watch doga więc mu walnie strzała do spania.
 
Odpowiedź
  


Skocz do:


Przeglądający: 2 gości