www.mikrocontroller.net

Forum: Codesammlung ADC mit Multiplexanzeige

Autor: peter dannegger (Gast)
Datum: 24.07.2005 23:31
Dateianhang: voltmeter.zip (10,7 KB, 891 Downloads)

Anbei ein Beispiel für eine 4-stellige Multiplexanzeige, die einen
ADC-Wert ausgibt.

Es werden insgesamt 13 IO-Pins benötigt, d.h. ein ATTiny26 reicht
vollkommen aus.

Um die Messung nicht zu beeinflussen, wird die Anzeige während der
Messung dunkelgetastet.

Als Multiplextakt wird 1Mhz  4  256 = 980Hz verwendet.

Um ein ergonomisches Ablesen zu gestatten, wird nur jede 256. Wandlung
ein neuer Wert dargestellt (4 Werte/s).

Außerdem wird der Mittelwert über 256 Messungen gebildet.

Zusammen mit der Dunkeltastung steht dadurch der Meßwert wie ne Eins.

Für ein einfacheres Platinenlayout wurden Digit 0,2 und 1,3
unterschiedlich beschaltet, deshalb werden zur Ausgabe 2
7-Segmenttabellen benutzt.

Die Digit- und Segmentzuweisungen erfolgen über Defines, lassen sich
also an beliebige Verdrahtungen anpassen.

Das ganze ist in C geschrieben.


Peter
Autor: Tobias Schneider (tobias)
Datum: 25.07.2005 06:32

Hi,
waere es nicht sinnvoll, den Transistoren einen Vorwiderstand zu
bescheren? Sind ja keine FETs sondern normale bipolare Typen.


Gruss Tobias
Autor: Benedikt (Gast)
Datum: 25.07.2005 09:30

@Tobias
Wiso Widerstände ? Die sind als Emitterfolger geschaltet und daher
fließt nur der Strom, der zum Schalten der Transistoren erforderlich
ist (Strom durch die Anzeige durch Spannunsgverstärkung des
Transistors, vermutlich wenige mA oder sogar noch weniger).

@peter dannegger
Super Projekt, wollte gerade anfangen dasselbe zu machen, aber das
brauche ich ja jetzt nichtmehr...
Gibt es dafür eigentlich ein Platinenlayout, wenn du schon schreibst
dass deshalb die Anschlussbelegung geändert wurde ?
Autor: Tobias Schneider (tobias)
Datum: 25.07.2005 14:24

Benedikt:
Mein Fehler hab da garnicht drauf geachtet ...

Peter Danneggers Ehre soll nicht berührt werden :)

Gruss Tobias
Autor: peter dannegger (Gast)
Datum: 26.07.2005 21:56

@Benedikt,

Das Layout kann ich leider nicht rausgeben, da ist auch viel mehr
drauf.


Peter
Autor: cdg (Gast)
Datum: 27.07.2005 12:04

Hallo Peter,
die Widerstandsbezeichnung der Segmentwiderstände
332R soll wohl für SMD Widerstände stehen.

Das wären dann aber 3,3KOhm !!

Ich kenne die verwendeten Anzeigen HDSP-K121 zwar nicht,
aber sind 3K3 nicht ein bisschen !sehr! hoch
für eine Multiplex-Anzeige ?

Ich denke da mehr an 33Ohm (für gemultiplexte übliche 7-Seg.Anzeigen).

MfG cdg
Autor: cdg (Gast)
Datum: 27.07.2005 12:46

Habe mir mal das Datenblatt der Anzeige angeschaut.

Danach denke ich mal, es sind 330Ohm Widerstände.

Bei 33Ohm wäre der ATMEL auch überfordert.

Ich werde die Schaltung mal aufbauen,
nur scheitert es am fehlenden ATtiny26.

Danke für die nette und nützliche Schaltung/Software.

MfG cdg
Autor: cdg (Gast)
Datum: 27.07.2005 12:55

Meine Annahme mit 330 Ohm ist wohl richtig,
denn in der E96 Reihe gibt es den Wert 332 Ohm !!

Naja, 1% Genauigkeit für Segment-Widerstände aus der E96 Reihe,
da muss man erstmal drauf kommen.

Ich nehme dann die erwähnten 330 Ohm.

cdg
Autor: Peter Dannegger (Gast)
Datum: 27.07.2005 13:39

Ja, 330 Ohm oder 332 Ohm ist egal.

Ich nehme immer 1%/50ppm Metallschicht, weil das einfacher ist, als für
jeden Wert 1% und 5% zu kaufen. Und der Preisunterschied ist ja nicht so
groß.

In Schaltplänen ist es üblich, R für Ohm zu schreiben.
Für 3,32kOhm hätte ich geschrieben 3k32.


Wenn man keine high efficiency Anzeigen nimmt, kann man die Widerstände
auch noch verringern.


Peter
Autor: Norbert Lukoski (Gast)
Datum: 19.01.2006 17:39
Dateianhang: besser.c (1,7 KB, 296 Downloads) | formatierter Code

Hallo. Hab ein kleines Problem. Arbeite zum ersten mal mit dem AVR
Atmega8 und möchte über den ADC0 Eingang eine Spannung einlesen und
über 7-SegmentAnzeige ausgeben lassen. Spannung kommt am Eingang an und
ich denke das der ADC im frei laufenden Betrrieb läuft, aber er spuckt
komische Zahlen auf der Anzeige aus. Meine MEinung ist, dass es an der
Ergebnisroutine liegt. Wenn wir in meine VAriable "value" einen Wert
definieren rechnet er den entsprechenden Wert aus und gitb ihn auch
richtig auf der Anzeige aus. Aber wenn er sich die Werte über den
Eingang ADC0 holen soll und diese dann in ADCL und ADCH reinschreibt
kommt nur Null raus. Kannst du mir vielleicht helfen?
Autor: peter dannegger (Gast)
Datum: 20.01.2006 09:30

@Norbert

"Aber wenn er sich die Werte über den Eingang ADC0 holen soll und
diese dann in ADCL und ADCH reinschreibt kommt nur Null raus."


Was aus dem ADC rauskommt, schmeißt Du weg.

Du setzt value3 einmalig auf 0 und gibst es aus.

Es ist also voll korrekt, daß nur 0 angezeigt wird.


Peter


P.S.:
Du hast Dir meinen Code überhaupt kein bischen angesehen, stimmts ?
Autor: Norbert Lukoski (Gast)
Datum: 20.01.2006 11:55
Dateianhang: besser0_3.c (1,8 KB, 289 Downloads) | formatierter Code

Sory hatter die falsche Version vom Quellcode. Da muss ich dir recht
geben das hat man auf dem ersten Blick gesehen das da Null raus kommt.
Ichhab jetzt eine andre Methode angewendet. Könntest du mal bitte
darauf schauen. Aber eine Frage stellt sich mir, warum schaut der ADC
nicht die ganze Zeit (frei laufender Modus ist aktiviert) die Werte auf
der BCD Anzeige aus. Eigentlich sollte er wie eine Multimeter arbeiten
ud die Spanung ausgeebn die im ADC reinkommt. Ich habe die Messmethode
ja in der while bzw. for Schleife drin so dass er eigentlich dauernd
arbeiten muss.Ach noch eine andre Frage, wir hatten schon mal mit nem
andren Microkontroller gearbeitet und das war etwas einfahcer da man
dort ein Ergebnisregister hatte und es einfach in ne andere Variable
schreiben konnte. Des Weiteren hatte wir dort mit Interruprroutinen
gearbeitet und mit Timern. Kann ich das so wie es im ANhang zu sehen
ist machen und einfach über Methoden starten? Würde mich auf eine
baldige Antwort von DIr sehr freuen. Bis dann
Autor: Norbert Lukoski (Gast)
Datum: 20.01.2006 12:34

So ich hab jetzt nochmal getest und es liegt an der Routine um das
Ergebnis aus den beiden Registern ADCL und ADCH zu bekommen. Meine
Routine ist laut dem Programm ICC AVR Wizzard:

 float value2=0;
 value=ADCL;            //Read 8 low bits first (important)
 value|=ADCH << 8; //read 2 high bits and shift into top byte
 //value=200;
 value2=((5*value)/20.46);
 value=((int)value2);
 hunderstel=((value*10)%10);
 einer=(value%10);

Du siehst das ich zum testen value mal auf 200 stelle und schmweißt das
richtige aus. Das PRoblem ist ja das ich ne 16Bit Zahl habe und nun aus
dieser Zahl die Spanungswerte rausfiltern muss. Kannst du mir beim
herausfiltern der jeweils 8-Bit Werte helfen. Weil anscheinend meine
vom Wizzard eigentlich falsch ist?
Autor: Simon K. (simon) Benutzerseite
Datum: 20.01.2006 17:03

Hm?

1. Muss man nicht zuerst ADCH auslesen?
2. Geht in deinem "ICC Wizard" (?) nicht einfach 16bitvariable = ADC
statt aufwendigem zusammenführen?
3. / 20.46? Wofür ins das?

4. für integer nach ascii (einer/zehner/hunderter) umwandlung gibts
auch itoa(...);
Autor: Uwe (Gast)
Datum: 20.01.2006 19:38

Hallo Peter!
>Um die Messung nicht zu beeinflussen, wird die Anzeige während der
>Messung dunkelgetastet.

Ist da nicht ein leichtes flackern zu sehen?
Habe soetwas vor kurzem auch gemacht und die Anzeige bei Wandlung
angehalten(weniger Spannungssprünge) aber die Anzeige flackert leider
etwas.

MFG Uwe
Autor: peter dannegger (Gast)
Datum: 20.01.2006 21:27

@Uwe,

die Bildfrequenz (Zeitdauer für alle 4 Digits) ist etwa 200Hz, da
flackert nichts mehr.


Peter
Autor: Uwe (Gast)
Datum: 21.01.2006 19:32

@Peter,
Die Bildfrequenz spielt da keine Rolle, ausschlggebend ist ja wie oft
du Wandelst. Wenn die Wandlung fast synchron mit der Anzeige ist, wird
fast an der selben Stelle ausgesetzt. Diese Aussetzer werden dann
sichtbar. Habe gerade überlegt ob ich nicht ein 5.Scheindigit
einfügen sollte und da die Wandlungen laufen lasse.

Schönen Tag noch, Uwe
Autor: peter dannegger (Gast)
Datum: 21.01.2006 20:28

@Uwe,

probier meinen Code doch mal aus, da flackert nichts.

Und daß die Wandlung synchron zur Anzeige sein muß, habe ich doch
erklärt.

Ob nun ein extra Zyklus oder bei jedem Digit ist egal, Hauptsache
schneller als 100Hz, damits nicht flackert.



Peter
Autor: Marcel (Gast)
Datum: 17.06.2008 20:57

Sorry fürs ausgraben, aber ich habe folgendes Problem:

Digits 0 und 2 zeigen Bullshit an (irgendwelche Segmente, aber keine
sinnvollen Zahlen), die Dezimalpunkte werden nicht korrekt angezeigt.
Aufbau ist genau nach Schaltung, Source das originale Codebeispiel.

Ich weiß nicht mehr weiter...vielleicht hat jemand einen Tip für mich?

Marcel
Autor: Marcel (Gast)
Datum: 17.06.2008 21:18

Äh, nee, is ja peinlich - wer lesen kann ist glatt im Vorteil ! Die
beiden Anzeigen sind ja tatsächlich anders layoutet ...

Problem gelöst.

Marcel
Autor: 65432 (Gast)
Datum: 18.06.2008 14:25

Peter, mit welchem Programm hast du den Schaltplan erstellt? Sieht
sauber aus! Gibt es das kostenlos?
Autor: Peter Dannegger (peda)
Datum: 18.06.2008 19:55

65432 wrote:
> Peter, mit welchem Programm hast du den Schaltplan erstellt? Sieht
> sauber aus! Gibt es das kostenlos?

Ne, das hatte mal richtig Geld gekostet.
Ist Protel 99SE.
Die Bauteile definiere ich mir meistens selber.


Peter
Autor: Andreas L. (andreasl)
Datum: 29.06.2008 18:59

Hallo, ist richtig interessant dieser Thread. Nun bin ich noch nicht
Sattelfest mit uPC, möchte Euch aber gerne ein paar Fragen stellen:

1. Wäre es möglich das ich als Anfänger es hinbekomme statt des Tiny26
einen Mega88 zu verwenden und den Rest der Schaltung so zu lassen wie
sie jetzt ist? Ich müßte doch die richtige defination Datei einbinden
(io.h) und mir die richtigen PORT´s aus den Datasheet raussuchen?

2. Ist es möglich eine LCD Anzeige zu verwenden? Ich habe hier in der
Codesammlung irgendwo ein LCD.h gesehen. Aber da  stoße ich
wahrscheinlich an meine Grenzen.

3. Wie, oder kann man das erweitern auf 4 Messwert anzeigen?
Autor: Jan (Gast)
Datum: 23.07.2008 07:39
Dateianhang: vorteiler.jpg (6,4 KB, 26 Downloads)
preview image for vorteiler.jpg

Hallo,

habe mal auf Anregung eines Kollegen versucht dieses nette Projekt auf
Wechselspannungsmessung aufzubohren, aber einige Problemchen damit. Vor
den MC habe ich einen Vorteiler auf URef/2 und kopple dann die
Wechselspannung ein. Vorberechnet sollte das eigentlich funktionieren.
Im Code habe ich eine Peak2Peak- Erkennung ergänzt, welche nach meiner
Meinung eigentlich funktionieren sollte:




SIGNAL( SIG_ADC )
{
   static u32 adc_sum;
   static u32 MIN;
   static u32 MAX;
   static u32 TEMP_ADC;

   static u8 count;
   u8 i;

   TEMP_ADC= ADC;
   adc_sum += ADC;

if( TEMP_ADC > MAX ){

   MAX=TEMP_ADC;
   }

if( TEMP_ADC < MIN ){

   MIN=TEMP_ADC;
   }


   count++;

   if( count == 0 ){      // 4 values/s
     adc_val = adc_sum >> 8;    // average über 256 samples
     adc_sum = 0;
     Peak2Peak= MAX-MIN;


  MIN =512;
  MAX =512;

   }


sowie in der Anzeige dann:

 dec_out( (Peak2Peak * SCALE) >> 16 );


Aber irgendwie tut das nicht so wie es soll. Zeigt nicht das an was es
soll (zu wenig). Hat jemand Verbesserungsvorschläge? Ist die Peak-
Erkennung doch zu langsam (zu wenige Abtastungen)? Irgend ein anderer
Fehler?

Jan

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net