Forum: Mikrocontroller und Digitale Elektronik Strommessung und Anzeige auf 7 Segment


von GregorB. (Gast)


Lesenswert?

Abend zusammen,
ich steh vor dem kleinen Problem einen Strom messen(2-25mA) und dann das 
ganze auf 2 7Segment Anzeigen ausgeben zu wollen.

Naja, Problem ist jetzt, ich find irgendwie nix passendes, um die beiden 
7 Segment anzusteuern, für 1,4,8 Segmente gibts mehr als genug Treiber, 
nur für 2(in Worten: ZWEI) lausige Stellen ist nix zu finden.
Verbaut werden sollen 2 TDSO5150.

Strommesung ist auch noch was, Gedankengang waren Shunt und 
Anlog-Digital-Wandler, der dann das 7 Segment speist.

Wüsste da eventuell jemand was?
Nach gefühlten 1000017 erfolglos durchgesehenen Datenblättern, langen 
Nächten geb ich auf und frag euch.

Wär ne tolle Sache, wenn jemand hier was passendes wüsste.

Schönen Abend noch,
Gregor

von Christian B. (casandro)


Lesenswert?

Nimm doch einen formalen 3,5 Stellen Treiber/Wandler und benutze nur 2 
Stellen davon. Da musst Du nur aufpassen, dass Du beim Übersteuern 
plötzlich einen niedrigeren Wert hast.

von Paul Baumann (Gast)


Lesenswert?

Du könntest das mit einem Atmega8 lösen. Miß die Spannung über dem 
Shunt,
sie ist proportional zum Strom. Über einen AD-Wandler Kanal des 
Kontrollers
kannst Du sie einlesen.

Die beiden 7-Segment-Anzeigen kann der Kontroller auch ansteuern. 
Schalte dazu alle Segmente parallel und multiplexe die beiden Anoden.

So kommst Du mit einem Schaltkreis aus.

MfG Paul

von GregorB. (Gast)


Lesenswert?

Abend,
@Christian, was meinst du jetzt hiermit?
"Da musst Du nur aufpassen, dass Du beim Übersteuern
plötzlich einen niedrigeren Wert hast."

@Paul, naja, eben das wollte ich eigentlich umgehen ;-) Nochdazu wär der 
Mega8 damit ja noch lange nicht ausgereizt.

Grüße
Gregor

von Karl H. (kbuchegg)


Lesenswert?

GregorB. schrieb:
> Abend,
> @Christian, was meinst du jetzt hiermit?
> "Da musst Du nur aufpassen, dass Du beim Übersteuern
> plötzlich einen niedrigeren Wert hast."

geh die Zahlen von 50 bis 150 durch und stell dir vor du würdest die 3. 
Stelle (die Hunderter) nicht sehen.

  97, 98, 99, 00, 01, 02

ooops, nach 99 kommt 00.

Gut, deine Messung geht nur bis 25. Aber wenn es dann doch mal etwas 
mehr sein sollte, kann das biss verwirrend sein, wenn die Anzeige 02 
anzeigt, du auch 02 abliest und in Wirklichkeit sind es 102mA.

von slow (Gast)


Lesenswert?

>Nochdazu wär der Mega8 damit ja noch lange nicht ausgereizt.

Was für einen Vorteil hast Du, wenn Du einen Prozessor "ganz ausreizt"?

Über so etwas muß man erst mal nachdenken. Die Dinger (Prozessoren) 
kosten alle im einstelligen Euro-Bereich.
Tut er Dir persönlich leid, wenn er nicht an der Grenze seiner 
Leistungsfähigkeit betrieben wird? Oder ist das unsportlich. Nach dem 
Motto "kann ja jeder".

Nimm so ein Ding, etwas Hühnerfutter, etwas Programmieren und schon 
klappts auch mit nur 2 Digits.

Man habt ihr Probleme. Oder sind Deine Probleme nicht richtig 
beschrieben? Willst Du nix programmieren? Oder fehlt Wissen? So kauf 
doch eine fertige Digitalvoltmeterplatine, der entsprechende 
Shunt-Widerstand erzeugt auch gleich die richtige Anzeige.

von Andi (Gast)


Lesenswert?

Hi,

hier ist etwas Code zur Ansteuerung von zwei 7 Segmenten.
Der Code ist abgewandelt von Peter Dannegger in dem Thread
Beitrag "ADC mit Multiplexanzeige"

7Seg.h
1
typedef unsigned char  u8;
2
3
#define GA_Seg_Zehner  PB0      // Gem. Anode für Zehner Segment
4
#define GA_Seg_Einer   PB1      // Gem. Anode für Einer Segment
5
#define GA_PORT        PORTB    // Port für die Anode
6
7
#define SEG_PORT       PORTD    // Port für das 7 Segment
8
#define SEG_DDR        DDRD     // Daten-Richtungs-Register für die 7Segmente
9
10
#define  _0A  0x80              // LED A im Segment
11
#define  _0B  0x01              // LED B im Segment
12
#define  _0C  0x08              // LED C im Segment
13
#define  _0D  0x04              // LED D im Segment
14
#define  _0E  0x20              // LED E im Segment
15
#define  _0F  0x40              // LED F im Segment
16
#define  _0G  0x10              // LED G im Segment
17
#define  _DP  PD1               // Dezimalpunkt  0x02
18
19
#define  _00  (u8)~( _0A+_0B+_0C+_0D+_0E+_0F     )  // Darstellung der Zahl mit den LED's, low active
20
#define  _01  (u8)~(     _0B+_0C                 )
21
#define  _02  (u8)~( _0A+_0B+    _0D+_0E+    _0G )
22
#define  _03  (u8)~( _0A+_0B+_0C+_0D+        _0G )
23
#define  _04  (u8)~(     _0B+_0C+        _0F+_0G )
24
#define  _05  (u8)~( _0A+    _0C+_0D+    _0F+_0G )
25
#define  _06  (u8)~( _0A+    _0C+_0D+_0E+_0F+_0G )
26
#define  _07  (u8)~( _0A+_0B+_0C                 )
27
#define  _08  (u8)~( _0A+_0B+_0C+_0D+_0E+_0F+_0G )
28
#define  _09  (u8)~( _0A+_0B+_0C+_0D    +_0F+_0G )
29
30
u8 digi[2];                     // Arrays für die zwei 7Segmente
31
32
// Array in dem alle Zahlenwerte von 0-9 abgelegt sind
33
u8 number[] = { _00, _01, _02, _03, _04, _05, _06, _07, _08, _09 };

und die 7Seg.c
1
void SegFill (u8 val)
2
{
3
4
  u8 *ptr7Seg;                      // 8bit Pointer erstellen
5
6
  ptr7Seg = number;                 // Zeiger auf 1. Wert von Array
7
  while( val >= 10)                 // wenn VAL größer/gleich 10er
8
  {
9
    val-=10;                        // VAL um einen 10er verringern
10
    ptr7Seg++;                      // Zeiger um einen Wert von dem Array erhöhen
11
  }                                 // VAL wird bei jedem Durchgang um einen 10er verringert,
12
                                    // und der Zeiger wird bei jedem Durchgang um ein "numbers [x]" erhöht
13
  digi[1] = *ptr7Seg;               // Wert/Zeiger auf das 10er Array übergeben
14
15
  digi[0] = number[val];            // Wert auf das 1er Array übergeben
16
                                    // Rest (1er) nach Abzug aller 10er
17
}
18
19
20
ISR(TIMER2_COMP_vect)               // Interupt
21
{
22
  static u8 count;                  // Freilaufzähler 0-255,0-255 für 7Seg-Anzeige
23
  u8 i;                             // Schaltet bei jedem 2 Durchlauf 7Seg 1 oder 7Seg 2
24
25
  count++;                          // Freilaufzähler um 1 erhöhen
26
  i = count & 1;                    // 0,1,0,1 ...
27
28
  // Darstellung für die 7 Segmentanzeige
29
  if( i == 0 )                      // output Digits
30
  {
31
    GA_PORT &= ~(1<<GA_Seg_Einer);  // Anode 1er sperren
32
    SEG_PORT  = digi[1];            // 10er 7Segmentwert anlegen
33
    GA_PORT |=  (1<<GA_Seg_Zehner); // Anode 10er freigeben
34
  }
35
36
  if( i == 1 )                      // output Digits
37
  {
38
    GA_PORT &= ~(1<<GA_Seg_Zehner); // Anode 10er sperren
39
    SEG_PORT  = digi[0];            // 1er 7Segmentwert anlegen
40
    GA_PORT |=  (1<<GA_Seg_Einer);  // Anode 1er freigeben
41
  }
42
43
44
int main (void)
45
{
46
  SEG_DDR = 0xff;                   // Alle pins für Segment auf Eingang
47
  int wert = 0;
48
  
49
  for(;;)                           // Endlosschleife
50
  {
51
    SegFill (wert++);               // Array's für die 7Segment-Anzeigen aktualisieren
52
53
    if(wert == 100)                 // Wenn wert = 100
54
      wert=0;                       // dann wert = 0
55
56
    //delay...
57
58
  }
59
60
}

Viel Erfolg...

von MaWin (Gast)


Lesenswert?

> hier ist etwas Code

Warum sollte man multiplexen ?

Der Atmega8 hat genügend Anschlüsse, um die 7-Segment-Anzeigen einzeln 
statisch anzusteuern UND es bleiben noch A/D-Wandler-Eingänge übrig um 
den Spannungsabfall am shunt zu messen.

char segmente[]={0x3F,0x06,0x5B,0x4F,0x6D,0x7D,0x07,0x7F,0x6F};
int wert;

int main(void)
{
  DDRB=DDRD=0xFF;
  while(1)
  {
    ADMUX=(1<<REFS1)|(1<<REFS0)|0; // Interne 2.5V Ref, ADC Eingang 0
    ADCSRA=(1<<ADPS2)|(1<<ADPS0)|(1<<ADEN)|(1<<ADSC); // start 
conversion
    while(ADCSRA&(1<<ADSC)) ;
    wert=ADCW; // 0=0V, 1023=2.56V, 99 = 0.25V
    if(wert>99)
    {
      PORTD=PORTB=0x40; // -- in die Anzeige
    }
    else
    {
      PORTB=segmente[wert/10]; // 10er Stelle
      PORTD=segmente[wert%10]; // 1er Stelle
    }
  }
}

Vielleicht funktioniert's sogar ungetestet
mit einen 2.5 Ohm shunt an A/D-Eingang 0.

von Volker S. (volkerschulz)


Lesenswert?

MaWin schrieb:
> Vielleicht funktioniert's sogar ungetestet
> mit einen 2.5 Ohm shunt an A/D-Eingang 0.

Vielleicht sollte uns der TO mal sagen, ob es tatsaechlich um 
Gleichstrom geht. Und bei einem Aufbau so ganz ohne Verstaerkerschaltung 
waere auch die Spannung nicht uninteressant, bzw. der Spannungsabfall, 
den die Last noch mit macht... ;)

Volker

von Anja (Gast)


Lesenswert?

GregorB. schrieb:
> Wüsste da eventuell jemand was?

Früher hat man da einen CA3161 + CA3162 genommen.
(die 3. Stelle kannst Du ja leer lassen).

Eventuell gibt die noch irgendwo als Restposten.

Gruß Anja

von Paul Baumann (Gast)


Lesenswert?

Anja schrob:
>Eventuell gibt die noch irgendwo als Restposten.

Schüttelreim:
Kaufe keine Restposten
weil die mannchmal wie die Pest rosten!

Man könnte auch einen C520 benutzen, der ist kompatibel zum CA3162.

MfG Paul

von GregorB. (Gast)


Lesenswert?

Schönen Tag zusammen,
also
@ Volker, ja Gleichstrom, Spannungsfall naja, sagen wir mal wechselnd.
Mal genauer beschreiben. Versorgungsspannung der ganzen 
Weltherrschaftsorgel werden 5V.

Das ganze soll mit einer KSQ auf Basis des LM 317 verheiratet werden.
Eingestellt werden sollder Strom per Poti, Regelbereich wären so 
angedacht zwischen 2 und 25mA.
Da man ja wenns drauf ankommt wenig Lust hat, den für den gewünschten 
Strom benötigten Widerstand zu berechnen und dann einzustellen, wollte 
ich den Strom messen können.
Naja, wird jetzt vermutlich doch die Lösung mit Mega8.

Grüße
Gregor

von Anja (Gast)


Lesenswert?

GregorB. schrieb:
> Das ganze soll mit einer KSQ auf Basis des LM 317 verheiratet werden.
> Eingestellt werden sollder Strom per Poti, Regelbereich wären so
> angedacht zwischen 2 und 25mA.

Du weißt aber schon was beim LM317 unter dem Parameter
"Minimum Load Current" steht?

Gruß Anja

von chris (Gast)


Lesenswert?

Anja schrieb:
> GregorB. schrieb:
>> Das ganze soll mit einer KSQ auf Basis des LM 317 verheiratet werden.
>> Eingestellt werden sollder Strom per Poti, Regelbereich wären so
>> angedacht zwischen 2 und 25mA.
>
> Du weißt aber schon was beim LM317 unter dem Parameter
> "Minimum Load Current" steht?
>
> Gruß Anja

Das ist aber nur bei 40V Vin, steht auch da.
Wenn du den von Farchild nimmst, da sind es 4mA minimum.
Beim 317 von National sind es 1.5mA bei 13V vin und steigt dann linear
bis zu max 3.8mA bei 40V, die 3.5mA sind nur typical values, 3.8mA wird
garantiert. Für 2mA kannst du bis 17V raufgehen, Vin.
Wenn du zwei hintereinandernimmst, damit du 1.25V als Vin hast, dann
kannst du bis zu µA runtergehen. Dies in Theorie, in der Praxis nimmt
man 3x LM317 hintereinander und dann kann man runter bis zu µA gehen
bei Spannungen von 2.5 - 37V, und die Led nach dem zweiten PSU nicht
vergessen mit mindestens 10mA damit nichts schwingt.

von Volker S. (volkerschulz)


Lesenswert?

GregorB. schrieb:
> Schönen Tag zusammen,
> also
> @ Volker, ja Gleichstrom, Spannungsfall naja, sagen wir mal wechselnd.
> Mal genauer beschreiben. Versorgungsspannung der ganzen
> Weltherrschaftsorgel werden 5V.

Ich meinte schon den Spannungsabfall am Messwiderstand. Der ist 
proportional zum Strom. Bei dem vorgeschlagenen 2,5 Ohm Widerstand 
waeren das 2,5 mV pro mA. Bei 25mA Last, stuenden somit an der Last nur 
noch 4.9375 V zur Verfuegung. Klingt zwar nicht nach viel Verlust, aber 
2,5 mV pro mA Spannungsabfall sind fuer den ADC viel zu wenig. Zumindest 
bei 10 Bit und solange Vref=Vcc (=5 V) ist. Die kleinste zu messende 
Groesse waeren dann knapp 5 mV und auf das LSB wuerde ich mich in diesem 
Falle auch nicht unbedingt verlassen. Also Steigerung um mindestens 
Faktor 4 noetig. Sofern der µC keinen internen Teiler fuer Vref hat und 
Du keine zusaetzliche externe Spannungsreferenz basteln moechtest, 
bleibt nur die Erhoehung des Widerstandswertes auf 10 Ohm. Das ergibt 
dann einen Spannungsabfall von 10 mV pro mA am Messwiderstand. Bei 25mA 
Last stuenden der Last aber dann nur noch 4,75 V zur Verfuegung.

Zusammenhaenge soweit klar?

Volker

von MaWin (Gast)


Lesenswert?

> solange Vref=Vcc (=5 V) ist. Die kleinste zu messende
> Groesse waeren dann knapp 5 mV

Vref war vorgesehen auf interne 2.56V zu stellen.

von Volker S. (volkerschulz)


Lesenswert?

MaWin schrieb:
>> solange Vref=Vcc (=5 V) ist. Die kleinste zu messende
>> Groesse waeren dann knapp 5 mV
>
> Vref war vorgesehen auf interne 2.56V zu stellen.

Wenn die Last den Drop-Out verschmerzen kann, wuerde ich dann auf 
mindestens 5 Ohm setzen um ein "Flattern" zu minimieren. Wenn Vref unter 
Vcc liegt, sollte man sich vielleicht noch ueber eine generelle 
Strombegrenzung des Lastkreises Gedanken machen, damit der ADC-Eingang 
keinesfalls ueber Vref rutschen kann...

In erster Linie ging es mit aber darum, dem TO das Ganze auch zu 
erklaeren, da er schrieb:
>@ Volker, ja Gleichstrom, Spannungsfall naja, sagen wir mal wechselnd.

Volker

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.