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
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.
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
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
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.
>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.
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...
> 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.
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
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
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
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
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
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.
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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.