Forum: Mikrocontroller und Digitale Elektronik Spannungsversorgungs Probleme!


von Zagros B. (zagros17)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

Ich habe eine Schaltung aufgebaut, welches ich mit dem CR2477 LI-IOn 
Batterie versorgen möchte und es soll so lange halten wie möglich. Die 
Schaltung Läuft einwandfrei, wenn 3V Spannung angelegt sind. Die 
Batterie entlädt sie sich zu schnell bis zur 2,7 und die Schaltung ist 
nach 10 min stillgelegt.
Jedoch muss ich sagen, dass ich zum Test zwecke es auf Dauerbetrieb 
gehalten hab. Natürlich soll es später 10 bis 20 Mess- und 
Sendeeinheiten Senden. Der restlichen Zeit soll es in Sleep Modus sein. 
Der Mikrocontroller erfasst die Daten von Sensor und gibt es an Sender 
weiter. Es wird gesendet dann bekommt der Sende/ Empfänger einen 
Bestätigungsabfrage die er zum Vollendet der Sendeeinheit tätigen muss. 
Das ist der Ablauf der Sendeeinheit.

Ich benutze einen Sensor MS5803-14BA
https://cdn.sparkfun.com/datasheets/Sensors/Weather/ms5803_14ba.pdf

Für die Sende und Empfangseinheit diente RFM 22W mit 433 MHz:
https://www.sparkfun.com/datasheets/Wireless/General/RFM22B.pdf

Der Mikrocontroller habe ich den ATmega328P genommen.
http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf

Ich komme leider nicht mehr weiter. Obwohl die vorhandene Spannung alle 
Bauteile betreiben kann wird der Batterie schnell entladen. Ich würde 
mich freuen, wenn ihr mir da weiterhelfen könntet.

von KlausKleber (Gast)


Lesenswert?

.sch ist eine schei* datei? Damit kann jemand ohne Eagle leider nichts 
anfangen...

von Sebastian S. (amateur)


Lesenswert?

Funken kostet sehr viel Energie.

Mein erster Blick sagte mir: Sparsamkeit am falschen Platz!

Also wenn Du Energie sparen willst, so mach das auch.

Natürlich "sparst" Du eine Leiterbahn, in dem Du SDN am RFM24 offen 
lässt, aber ich würde mir mal das Kapitel:
Operating Modes Response Time and Current Consumption
im Handbuch reinziehen!

Muss aber nicht sein.

Was sonst noch im Kleingedruckten steht weiß ich nicht.

Auch den ATMega kann man als Verbraucher ansehen, über die verwendete 
Software schweigt sich Dein Post ja aus. Kenne den Befehlssatz nicht, 
aber ein paar Schnarchoptionen werden wohl auch verfügbar sein.

Auch Dein MS5803-05BA hat einen Stand-by Modus.

Wie gesagt: Muss aber nicht sein...

von Zagros B. (zagros17)


Angehängte Dateien:

Lesenswert?

KlausKleber schrieb:
> .sch ist eine schei* datei? Damit kann jemand ohne Eagle leider nichts
> anfangen...

Sorry benutze halt eagle aber lade ein Bild hoch. ich hoffe da können 
sie was erkennen.

von Sebastian S. (amateur)


Lesenswert?

Was mir noch eingefallen ist:
Möglicherweise reicht eine 1:1 Beschaltung eines Ports zum SDN nicht.
Ich weiß aber nicht, was die Ports des ATMega machen, wenn Schlafenszeit 
angesagt ist. Möglicherweise kommt also zu der Leiterbahn noch ein 
Widerstand gen Masse hinzu.

Ob die Spannungsversorgung wirklich für 24 Bit ausreicht glaube ich 
nicht.

Der µP und der Sender produzieren reichlich "Schmutz" auf den 
Versorgungsleitungen. Da das Teil aber bis hinunter auf 1,8 V betrieben 
werden kann, könnten eine Entkopplung aus Spule und ev. Widerstand (in 
Reihe) und Kondensator (µF - Bereich + Kerko) gegen Masse helfen.

Ist alles "kann" und nicht "muss".

: Bearbeitet durch User
von Zagros B. (zagros17)


Lesenswert?

Sebastian S. schrieb:

> Ich weiß aber nicht, was die Ports des ATMega machen, wenn Schlafenszeit
> angesagt ist.

hier ist mein code leider ist da noch keine schlafenzeit integriert. Ich 
möchte dass er 20 sekunden lang senden und 15 Sekunden schläft.

Ich bin leider nict so gut bei programmieren und habe zwar einen 
lösungansatz gefunden kann die aber nicht in meine Code integrieren.
ich hoffe jemand von euch ist so gütig und kann mir den code 
integrieren.
hier der lösungansatz
http://shelvin.de/arduino-in-den-sleep_mode_pwr_down-schlaf-modus-setzen/
1
#include <RHReliableDatagram.h>
2
#include <RH_RF24.h>
3
#include <SPI.h>
4
#include <MS5803_05.h>
5
6
#define CLIENT_ADDRESS 1
7
#define SERVER_ADDRESS 2
8
9
// Singleton instance of the radio driver
10
RH_RF24 driver;
11
12
// Class to manage message delivery and receipt, using the driver declared above
13
RHReliableDatagram manager(driver, CLIENT_ADDRESS);
14
15
// Single instance of the pressure sensor
16
MS_5803 sensor = MS_5803(4096);
17
18
// stuct of measured data to send 
19
struct Messung{
20
  double temperature;
21
  double pressure;
22
};
23
24
25
26
void setup() 
27
{
28
  Serial.begin(115200);
29
  if (!manager.init())
30
    Serial.println("init failed");
31
  // Defaults after init are 434.0MHz, modulation GFSK_Rb5Fd10, power 0x10
32
  if (sensor.initializeMS_5803()) {
33
    Serial.println( "MS5803 CRC check OK." );
34
  } 
35
  else {
36
    Serial.println( "MS5803 CRC check FAILED!" );
37
  }
38
  delay(100);
39
}
40
41
uint8_t data[] = "Hello World!";
42
// Dont put this on the stack:
43
uint8_t buf[RH_RF24_MAX_MESSAGE_LEN];
44
45
void loop()
46
{
47
  Messung m, m1,m2,m3,m4,m5;
48
49
  // Read sensor data 5 times
50
  sensor.readSensor();
51
  m1.temperature=sensor.temperature();
52
  m1.pressure=sensor.pressure();
53
  
54
  sensor.readSensor();
55
  m2.temperature=sensor.temperature();
56
  m2.pressure=sensor.pressure();
57
  
58
  sensor.readSensor();
59
  m3.temperature=sensor.temperature();
60
  m3.pressure=sensor.pressure();
61
  
62
  sensor.readSensor();
63
  m4.temperature=sensor.temperature();
64
  m4.pressure=sensor.pressure();
65
  
66
  sensor.readSensor();
67
  m5.temperature=sensor.temperature();
68
  m5.pressure=sensor.pressure();
69
70
  // Average of temperature
71
  m.temperature = (m1.temperature+m2.temperature+m3.temperature+m4.temperature+m5.temperature)/5.0;
72
  // Average of pressure
73
  m.pressure = (m1.pressure+m2.pressure+m3.pressure+m4.pressure+m5.pressure)/5.0;
74
75
  //Serial.print("Temperatur: ");
76
  Serial.println(m.temperature);
77
  //Serial.print("Druck: ");
78
  Serial.println(m.pressure);
79
80
  // byte array for sending data
81
  uint8_t payload[sizeof(struct Messung)];
82
  // copy struct of measurement to byte array for sending
83
  memcpy(payload,&m,sizeof(m));
84
  
85
  Serial.println("Sending to rf24_reliable_datagram_server");
86
    
87
  // Send a message to manager_server
88
  if (manager.sendtoWait(payload, sizeof(payload), SERVER_ADDRESS))
89
  {
90
    // Now wait for a reply from the server
91
    uint8_t len = sizeof(buf);
92
    uint8_t from;   
93
    if (manager.recvfromAckTimeout(buf, &len, 2000, &from))
94
    {
95
      Serial.print("got reply from : 0x");
96
      Serial.print(from, HEX);
97
      Serial.print(": ");
98
      Serial.println((char*)buf);
99
    }
100
    else
101
    {
102
      Serial.println("No reply, is rf24_reliable_datagram_server running?");
103
    }
104
  }
105
  else
106
    Serial.println("sendtoWait failed");
107
  delay(1000);
108
}

von Sebastian S. (amateur)


Lesenswert?

Wie ein Mensch macht ein batteriebetriebener µP ohne Pausen sehr bald 
schlapp.

In wie fern der Arduino, bzw. dessen Entwicklungsumgebung, die 
Energiesparzustände unterstützt, weiß ich nicht. Wichtig ist aber: 
Dauerzustand alles aus.

In den gewünschten Intervallen den µP aufwecken der dann seinerseits die 
jeweilige Peripherie kurz in Betrieb nimmt. Sofort, wenn nichts zu tun 
ist: In den Ruhezustand versetzen.
So wird es z.B. kaum der Fall sein, in dem der Sensor und der Sender in 
Betrieb sind. Außerdem ist so etwas mehr Ruhe auf der 
Versorgungsspannung.

Die hier sinnvolle Reihenfolge, nach dem Aufwachen, ist wohl:
Sensor an.
Wartezeit lt. Datenblatt. Falls vorhanden.
In den Speicher messen.
Sensor aus.
Sender an.
Die Einschaltzeit zum Aufbereiten der Messwerte nutzen. Falls nötig.
Daten senden.
Sender aus.
Ab in die Heia.
Übrigens, soll auch noch empfangen werden, so reicht es aus den 
Empfänger alle paar Sekunden kurz in Betrieb zu nehmen. Oft haben die 
Befehlsgeber oder sogar ein PC/Schlapptopf genügend Energie um ein paar 
Sekunden dauernd zu senden.
Das Sendemodul sollte, wenn es sowieso in Betrieb ist, auch mal kurz auf 
Empfang umschalten. So die Energiebilanz hierbei positiv ist.

Man sieht also, wenn es auf eine effektive Energiebilanz ankommt, sollte 
der gesamte Programmablauf zeitgesteuert/zeitgeplant erfolgen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.