Atmega328'imin pillerle bir yıl boyunca çalışmasını nasıl sağlayabilirim?


51

senaryo

Yurt odam için güzel bir elektronik kapı kilidi yarattım. Şu anda kapıyı kilitleyen bir servo [un] ile bir Arduino Diecimila. 3x4 düğmeli ve 5 LED'li (2 seri çift ve bir tek LED) sayısal tuş takımına sahiptir. Aynı zamanda bir cep telefonu şarj cihazında da çalışıyor.

Şimdi bağımsız bir Arduino (ATmega328) ile çalışacak şekilde yeniden tasarladım, ancak gerçekten AA pillerle veya hatta 9V pille çalışmasını istiyorum.

Yazılım bölümü sleepiçin, ATmega güç tüketimini mümkün olduğunca düşük tutabilmek için döngü yönteminin içine belirli zamanlarda çağrı koyabileceğimi düşündüm . Ve LED'in mümkün olduğu kadar uzun süre kapalı kalmasına izin verin.

Soru 1

Tahtanın uyuduğu birkaç milisaniyede bir düğmeye basıldığında, uykudan çıkıncaya kadar "hatırlanacak" / "tutulacak" ve sonra bir düğmeye basılarak toplanacak mı?

Bu düğmeye basarak uykuya dalmanın en iyi yolu ne olabilir? Düğme etkinliğini uyandırmak için kodlayabilir miyim, yoksa sadece 10 m.s için uyumasına izin vermeli miyim? Her döngüde?

soru 2

Bu cihazı 10 ay boyunca çalıştırmak için kaç adet AA pil gerektiğini hesaplamanın matematiğine nasıl yaklaşabilirim?

Ayrıca, dakikada ortalama güç tüketimini nasıl ölçeceğimi bilmiyorum, çünkü hızla değişiyor.

Cihaz

Benim kapı kilit cihazı

Yanıtlar:


35

Atmega328, minimumdan mükemmele sipariş edilen altı güç tasarrufu modu sunar ( bu forum gönderisinden tahmin edilen mevcut tüketimler ):

  • SLEEP_MODE_IDLE: 15 mA
  • SLEEP_MODE_ADC: 6.5 mA
  • SLEEP_MODE_PWR_SAVE: 1.62 mA
  • SLEEP_MODE_EXT_STANDBY: 1.62 mA
  • SLEEP_MODE_STANDBY: 0.84 mA
  • SLEEP_MODE_PWR_DOWN: 0.36 mA

Orijinal sorudan alıntı:

sleepDöngü yönteminin içine belirli zamanlarda çağrı koyabileceğimi düşündüm "

sleep_cpu()Yukarıdaki listeden, istediğiniz uyku modunu ayarladıktan sonra kullanmanız gerekir . Arduino Bahçesi'nin bu konuda yararlı bir yazısı var .

Uygulamanın kesilmesi gerekir, yukarıdaki uyku modlarını yoğun bir şekilde kullanın ve işlemlerin gerçekte yürütülmesi için düğmeye basıldığında, zamanlayıcı taşma ve izleme zamanlayıcı olaylarında işlemciyi uyandırın.

Aşağıdaki adımlarla ek güç tasarrufu sağlanabilir:

  • Mikrodenetleyicinin dahili osilatörünü ve düşük bir saat hızını (16 yerine 8MHz) kullanın - ancak zaman ve zamanlama ile ilgili kodun beklendiği gibi çalışmasını sağlayın. Bunun için önyükleyicinin farklı bir sürümü gerekli olabilir.
  • Uygulama kullanıyorsa, LED'leri uzun süre açık tutmaktan kaçının. Kısa süreli hızlı, çift veya üçlü flaş (0,05 saniye açık, 0,5 saniye kapalı), aradaki saniye aralıklarla, minimum güç tüketimi ile gözle görülür gösterge sağlar
  • Bir regülatör gerekliyse, doğrusal bir regülatör yerine bir anahtarlama regülatörü kullanın.
  • Mikrodenetleyiciyi destekleniyorsa, düşük voltajda, 3,0 Volt (örn. CR2032 Lityum hücre, regülatör gerekmez) veya 5 Volt yerine 3.3 Volt çalıştırın.
  • Minimum güç kaybı için kullanılmayan giriş ve çıkış pimi ayarları için veri sayfasındaki önerileri izleyin.

Bu önerilerin dahil edilmesi, mikrodenetleyici uygulamalarının tek bir CR2032 madeni para hücresinde haftalarca veya aylarca, LR123 tipi bir lityum hücrede yıllarca çalıştırılmasını sağlar. Elbette, kilometreniz, uygulamanızın ihtiyaç duyduğu sensör, çıktı ve fiili işleme bağlı olarak değişebilir.

Bazı yararlı referanslar:


Deneyimlerime göre, SLEEP_MODE_PWR_DOWN içinde, her küçük şeyi kapatma konusunda akıllıysanız (kahverengi algılama gibi) 0.1uA ile 6.0uA arasında bir değere alabilirsiniz. Bir dizi alkalin AA pilde 3-5 yıl süren 60uA'dan daha az kullanan yapılar oluşturdum.
Tim Eckel

@TimEckel LED'ler ile durum belirtme konusunda çıldırıyorum - bu güç bütçesini modası geçmiş gibi yiyor.
Anindo Ghosh

3
Zorunda değil. Yüksek dirençli, yüksek güçlü LED'ler kullanın. 20 mA yerine bir mA'nın bir kısmını kullanacaktır. Ayrıca, durum ışığını sürekli açmak yerine birkaç saniyede bir 5-15 msn yanıp söner. 30 mA kullanan ucuz bir loş durum LED'im vardı, onu her 8 saniyede bir 15 ms boyunca parladığım 3.3k Ohm'luk bir dirençle yüksek güçlü LED'e değiştirdim. 30 mA ile 2.9 uA arasında bir ortalama akım, 1/1000 güç harcadı!
Tim Eckel

4
@TimEckel Yanıp sönen ışıklara olan tutkumun derecesini açıkça anlamıyorsunuz: - D Yoğunluğu azaltmak istemiyormuşum gibi değil, Hades'in alevleri gibi parıldayan küçük şeyleri seviyorum, güç bütçesi karanlık! Daha ciddi bir notta: Bu küçük numaraların farkındayım ve aslında LED'lerdeki gücü azaltırken görsel alarm etkisini artıran bir kaçını benimsemişim. Bu önceki yorum ( sadece kısmen ) jest olarak, buralarda cevapladığım çok sayıda eğlenceli LED sorusu ile ilgiliydi .
Anindo Ghosh

3
ATMega328P'nin güç tüketimini farklı voltaj ve frekanslarda ölçtüm ve bu çizelgeyi docs.google.com/spreadsheets/d/…
Cano64

19

Masamda şu anda 2 adet AA pil ile çalışan ve gerekirse bir yıldan fazla süredir çalışabilecek bir Arduino Pro Mini var.

Bunu başarmış tasarımın üç yönü vardır.

1. Farklı bir regülatör

LTC3525 takviye regülatörü kullanıyorum. Çok düşük sakin akım (7uA) ve yüksek verime (>% 90 @ 0.2mA) sahiptir. Bu kıvılcım kurulu gibi bir şey https://www.sparkfun.com/products/8999 benzer bir iş yapmalı. Arduino'nun kullanılmaması için VIN'a değil Arduino'daki 5V pime bağladığınızdan emin olun.

2. Sleeeeeeep

Cihazın aktif olduğu zaman oranı az olacaktır. Cihazın kalan süresinde SLEEP_MODE_POWER_DOWN içinde uykuya dalması gerekir. Uyku rutinlerinizi Rocketscreem Low Power Library'den temel alabilirsiniz . Bu bağlantıya göre ADC, BOİ ve WDT kapalı ve kapalı modda 1,7uA'ya indirebilmelisiniz.

3. Kesmeler

Uykunun diğer yarısı onu uyandırmak için kesiliyor. Power Down uyku modunda, sadece seviye INT1 ve INT2, TWI eşleşmesinde kesiliyor, WDT uyanacak. Bu nedenle, INT1 veya INT2'ye bağlı bir düğmeye sahip olmanız gerekir, böylece düğmeye basmak onu uyandıracaktır.

Diğer şey:

Kesinlikle gerekli olmadıkça tüm LED'leri kapatın. Kilit kapalıysa, LED'lerin parlak olması gerekmez, bu da daha fazla güç tasarrufu sağlar. Ayrıca, MCU’nun düzenli olarak bir görevi yerine getirmesini istiyorsanız, periyodik olarak uyandırmak için bekçi saati zamanlayıcısını kullanın.

Düzenle:

İşe yarayabilecek bir yöntem, yukarıdaki Low Power kitaplığını kullanmak ve bekçi saati sayesinde her döngüde 60ms kadar uyumaktır. Uyandıktan sonra düğmesine basın kontrol edin. Çağrılacak işlev

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

Bu yorumların hepsi yerinde. Birkaç öneri daha eklemek istiyorum:

1) LED'ler için yüksek çıkışlı 20 mA LED kullanın. İşte mantık. Her 8 saniyede bir yanıp sönen loş bir durum LED'i istediğinizi varsayalım. Parlak olmasını istemezsiniz, bu yüzden rastgele bir LED kullanırsınız. Sorun, bir dim LED'in sadece 100 mcd çıktı almak için hala 20 mA (veya daha fazla) kullanmasıdır. Bunun yerine, hala 20 mA için derecelendirilmiş, ancak 4000 mcd çıkış yapabilen yüksek bir çıkış LED'i alın (çıkış açısına baktığınızdan emin olun, muhtemelen 30 derece veya daha fazla olmasını istersiniz). Bu 4000 mcd LED ile, 3.3 k Ohm'luk bir direnç gibi bir şeye bağlarsınız ve 100 mcd civarında ışık çıkışı elde edersiniz, ancak 1 mA'dan daha az kullanırlar. Durum LED'i için 20 mA kullanmak yerine, tek bir mA'nın bir kısmını kullanıyorsunuz. Ayrıca durum LED flaşını yalnızca 5-15 ms süre ile ayarlıyorum, bu durumda daha önce 100 ms'de flaş açtıysanız çok fazla güç tasarrufu da sağlayabilirim.

2) Benim voltaj regülatörüm, Microchip MCP1700. Sadece 1,6 µA sakin akım kullanır ve süper ucuzdur (küçük miktarlarda yaklaşık 0,30 $). Tek sınırlama, maksimum giriş voltajının sadece 6 volt olmasıdır, 9 voltluk bir pil kullanamazsınız. Ancak, 4 adet AA pil, bir tek hücreli LiPo veya iki lityum madeni para hücresi için idealdir.

3) 4 adet AA pil ile bir ATmega devresine güç vermek için, tipik olarak 4 pilin maksimum 6 voltunu 5.5 volta düşürmek için VCC'de 1N4001 diyot kullanıyorum. Ayrıca, diyot ATmega'yı ters voltajdan korur, bu nedenle iki faydalı amaca hizmet eder. Bunu yaparken, her zaman akım tüketen voltaj regülatörü olmadığından uyurken, 0.1 µA kadar küçük bir pille çalışan devre oluşturabilirim.


8

RocketScream LowPower kütüphanesini kullanarak ekmek tahtası üzerinde çıplak bir atmega328P-PU testi yaptım

Bu taslağı kullandı:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

Bir uCurrent Gold ile güç kapalı modundayken 7.25 uA ölçtüm.


1
Güzel! Bunu en kısa zamanda deneyeceğim. Bu, CR2032 pil ile yıllarca atmega238 çalıştırılmasına izin veriyor mu?
Basj

6

Burada iki soru var, ama sadece ikincisi soru başlığının bir parçası, bu yüzden Arduino programlama sorusu için bir tane daha açarsanız muhtemelen daha iyi olur. Burada ikinci soruyu cevaplayacağım.

Tek bir üst uç alkalin 1.5V AA pil, yaklaşık 2600mAh kapasiteye sahiptir. Lityum pilleri kullanırsanız, şanslıysanız yaklaşık 3400mAh alabilirsiniz. Mutlak en iyi durum için bir temel olarak bu rakamla gidelim.

Bir yük için teorik maksimum çalışma süresini hesaplama şekliniz sadece yüke göre kapasitedir. Yükünüz 1mA ise, bunu 3400/1 = 3400 saat = 141 gün = ~ 5 ay boyunca çalıştırabilirsiniz. Ancak, bu sadece teorik bir maksimumdur , çünkü o zaman% 65 civarında önemli bir voltaj düşmesi elde etmeye başlarsınız. Çıkışı düzenliyorsanız, batarya voltajını düşürdüğü, ayarlanan voltajı korumak için gereken daha yüksek akımın bataryayı daha hızlı tüketen bir kaçak etkisi elde edersiniz. Cihazınızı çalıştırmak için yeterince yüksek bir voltajla, ilan edilen kapasitenin% 80'inden fazlasını alabiliyorsanız şaşırırım.

Diyelim ki voltaj düşmesinden ve regülatör verimsizliğinden sonra zamanın% 80'ini aldığınızı varsayalım. Serideki üç pilden 3,3V'ta çalıştığınızı varsayacağız. Bu size hala aynı kapasiteyi verecek, ancak voltaj bir regülatör için yeterli olacaktır. Cihazınız 15mA'da çalışıyorsa (bu oldukça muhafazakar bir tahmindir), sayılar şöyle görünecektir:

  • % 80 verimlilikten sonra kapasite = 3400 * 0.8 = 2720mAh
  • Süre = 2720/15 = 181 saat = 7.54 gün

Bu nedenle, bir yıl boyunca çalıştırmak için yaklaşık 144 lityum pil (48 set 3) gerekir. Çok iyi değil!

Bunun yerine şebekeden düzenlenmiş bir DC kaynağı kullanmanızı öneririm. Bir SPDT rölesi ile kolayca kurulabilen bir akü yedeği dahil edilebilir - bobini ana DC'ye bağlayın ve aküye "kapalı" kontağı bağlayın. DC başarısız olduğunda, kontak düşer ve bunun yerine pil kullanılır.


Akülü rüyalarım ezildi;) Detaylı cevap için teşekkürler. Bu bana da en iyi seçenek gibi görünüyordu.
LouwHopley

Tesadüfen, bu elektronik kapı kilidi tasarlarken kendime sorduğum aynı soruydu. Tıknaz bir 10.000mAh şarj edilebilir pil ile bile buna değmezdi. Sadece bir 250mA DC adaptör ve yedek olarak eski bir cep telefonu pili kullanarak sona erdi.
Polinom

4
15 mA ortalama bana çok muhafazakar gelmiyor! 328, uyku modunda tek basamaklı mikroamperlerde çalışabilir ve kesinlikle en azından yarı derin uykuda olmaktan kurtulabilirsiniz. Ayrıca, düşük frekanslarda (örn. 0,5 MHz) aktif modda <1 mA ile alabilirsiniz. Elbette, düşük güçlülük niteliğine uygun olarak diğer bileşenlerin (voltaj regülatörleri vb.) Seçilmesi gerekir.
exscape

4
@Polynomial Ben şematik yakından bakmadım, ama kesinlikle bir "güç LED" olmadan proje inşa olabilir. O (PWM yöntemiyle) yarım parlaklıkta eg olacak şekilde Yoksa mevcut kullanım yerine 15 inç ~ 0,09 mA ortalama düşeceği şekilde 25 ms her 2 saniyede bir, demek sadece, onu yanıp olabilir
exscape

1
Arduino güç aç. Kendi tahtanızı yapmak bunu çözecektir. Atmega328, güç tasarrufu modunda 32kH ve 0.75 uA olduğunda 0.2 mA çekiyor.
Vorac

4

Henüz kimsenin bahsetmediği bir şey: Kullanmadığınızda, servoyu çalıştıran + 5V beslemeyi kapatmak için bir yola ihtiyacınız var. Hareket etmese bile, bir servo hala güç çeker.

Arduino'dan bir I / O pimi tarafından kontrol edilen geçitle bir FET, bunun için iyi bir yoldur.


Genellikle her sensör için 2N3904 ya da açmak / kapatmak için ne kullanırım. Veya, eğer sensör düşük güçlüyse ve ATmega ile çalıştığım voltaj ile aynı voltajdaysa, güç durumunu kontrol etmek için doğrudan bir pim kullanıyorum.
Tim Eckel

1
2n3904'ten önemli ölçüde daha az güç kullanmak için 2n7000 kullanın ve bir temel direnç gerekmez.
John Meacham

3

Bir sonraki tasarımınız için özellikle düşük güç tüketimi için optimize edilmiş bir mikro kontrol cihazı kullanmayı düşünebilirsiniz. Düşük güç tüketimi için uyurken çok düşük güç almak gerekir. Genellikle göz ardı edilen şey, bu uykudan ne kadar hızlı uyanabileceğinin de önemli olduğudur.

Önemli olan, en derin uykudan mümkün olan en kısa sürede bir kesinti yapmanın (güç patlaması çok kısa olacağından) ve tekrar uykuya dalmak için ne kadar şarj gerektirdiğidir.

Böyle bir mikro kontrolöre bir örnek, Texas Instruments'tan MSP430'dur . Web sitelerinde, enerji ve enerji toplama uygulamalarının nasıl korunacağını gösteren uygulama notları bulacaksınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.