mikrocontroller.net

Forum: Projekte & Code Frequenz- und Spannungspanelmeter mit ATtiny44 und TM1637


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Ralph S. (jjflash)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Entstanden um ein "Experimentierbrett" für Schüler und Auszubildende in 
der Funktion zu erweitern.

Das Projekt wird noch auf eine 80x80 PCB geroutet werden um es auch auf 
dem Brett in Betrieb nehmen zu können.

Vorrangig soll es dazu dienen, die Frequenz die ein Frequenzgenerator 
(mit XR2206) bei Versuchen mit aktiven und passiven Filtern erzeugt, 
anzuzeigen.

Weiters wird es versuche mit Wheatstonscher Meßbrücke und mit 
Operationsverstärker realisierten Reglern geben.

Das hier vorliegende Panelmeter ist sehr einfach gehalten und kann daher 
nur relativ wenig:

- Frequenzzähler 0 bis 200 kHz
- Voltmeter 0 bis 15 V

Ist JP2 bei Spannungsanlegen oder nach einem Reset in Stellung 1-2 wird 
das Modul als Voltmeter verwendet, ist Stellung 2-3 gewählt, wird das 
Modul als Frequenzzähler verwendet.

Das im Archiv enthaltene Makefile erzeugt eine Hexdatei für einen 
ATtiny44, nach Abändern des Makefile, ist das Programm (aufgrund der 
kleinen Codegröße) auch in einem ATtiny24 (oder in dem "großen" 
ATtiny84) lauffähig.

Ursprünglich hatte ich einen (wirklich sehr dummen Fehler von mir) in 
der Initialisierung des ADC's, der behoben ist.

Aufgrund fehlender Bedienelemente und des kleinen Codespeichers ist die 
"Kalibrierung" des Voltmeters etwas "frickelig":

In Zeile:
#define  u_in                 1666000              // 17.27 entsprechen Digitalwert 1023 (0x400)

ist angegeben, welcher Spannungswert vor dem Spannungsteiler dem 10-Bit 
ADC-Wert 1023 entspricht. Rechnerisch müsste hier eine Spannung von 
17,27V angelegt werden, damit der Spannungsteiler diesen Wert auf 1,1V 
(entspricht der internen Referenz des ADC) herunterteilt. In meinem Fall 
ist ein Wert von 16,66V nötig um diesen auf 1,1V herunterzuteilen.

Das Kalibrieren erfolgt hier wie folgt:

- Spannung anlegen und mit einem (guten) Multimeter kontrollieren
- diese Spannung so lange erhöhen, bis auf der 7-Segmentanzeige der Wert 
16,66 erscheint.
- den Wert des Multimeters notieren und diesen in der #define Zeile 
eintragen (wurde hier bspw. 17,15V gemesen ist dort 1715000 einzutragen)

Verwendete 7-Segmentanzeige (benötigt werden 3 Stück, ich habe 10 
gekauft):

2821BS: 2 Bit / 0.28" Inch Common Anode

Ebay-Artikel Nr. 123797908325

7-Segment Anzeigentreiber:

TM1637

Ebay-Artikel Nr. 183227717995

von Guest (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Impedanzwandlung um den ADC anständig zu treiben wird überbewertet?

von Karl K. (karl2go)


Bewertung
1 lesenswert
nicht lesenswert
Guest schrieb:
> Impedanzwandlung um den ADC anständig zu treiben wird überbewertet?

Ja. Bei den ATmegas / ATtinys regelmäßig.

Da der S/H Kondensator sich aus dem 10n Kondensator bedienen kann, ist 
das so völlig in Ordnung, wenn man mäßig schnell messen will. Gibt auch 
eine alte AppNote von Atmel dazu.

Der 10n Kondensator am ADC ist allerdings wichtig, ohne diesen gehts 
schief.

von Michael U. (amiga)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ralph S. schrieb:
> Das hier vorliegende Panelmeter ist sehr einfach gehalten und kann daher
> nur relativ wenig:
>
> - Frequenzzähler 0 bis 200 kHz
> - Voltmeter 0 bis 15 V

auch wenn es schon antik ist mehr als Hinweis zur Unterhaltung:
Beitrag "Multimeter"
Ist das schon lange her und wird immernoch bei mir genutzt...

Gruß aus Berlin
Michael

von Ralph S. (jjflash)


Bewertung
0 lesenswert
nicht lesenswert
Guest schrieb:
> Impedanzwandlung um den ADC anständig zu treiben wird überbewertet?

Das geschieht auf einer anderen PCB (wie auch die Impulsformung für den 
Zählereingang) und ist u.a. Bestandteil der Experimente auf dem Brett.

Gruß, JJ

von Ralph S. (jjflash)


Bewertung
0 lesenswert
nicht lesenswert
Michael U. schrieb:
> auch wenn es schon antik ist mehr als Hinweis zur Unterhaltung:
> Beitrag "Multimeter"

Wieviele Multimeter hättest du denn gerne?
Einsatzzwecke für Panelmeter gibt es viele, immer da, wo ein analoger 
Wert in einem Gerät genau eine Größe anzeigen soll. Ich habe noch nie 
gesehen, dass in einem Gerät ein Multimeter verbaut ist (aber Panelmeter 
schon).

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich finde es schade, daß die Frequenzmessung nicht den Stand der Technik 
widerspiegelt. Gerade im Frequenzbereich <= 200 kHz wäre ein reziproker 
Zähler angesagt. Selbst der ATtiny44 hat dafür einen ICP-Eingang.
Und auch der extra Displaytreiber wäre überflüssig, wenn der µC die 
Anzeige gleich mit ansteuern würde. Ein Atmeg88 hat genug Pins für alle 
Aufgaben.

Aber gut, vielleicht gibt es ja noch eine Version 2 ;-)

von Ralph S. (jjflash)


Bewertung
0 lesenswert
nicht lesenswert
Hm, der Zähler hier (die Spannungsmessung war das Demonstrationsbonbon 
für den Auszubildenden) gibt es vom Zählen her (einfache Torzeit von 1 
Sekunde und zählen der Impulse) hier schon für einen ATmegaxx8 OHNE den 
Displaytreiber mit 7-Segmentanzeige.

Hier ging es darum, das auf einem kleineren Chip umzusetzen. Abgesehen 
davon war die Anzeige im Multiplexbetrieb an einem ATmega OHNE 
Treibertransistoren nicht in der Helligkeit wie gewünscht, es wurden 
also zusätzliche 6 Transistoren benötigt. Von daher war der 
Displaytreiber schon nicht so verkehrt(abgesehen davon, dass die 
Kombination Tiny44 und TM1637 preiswerter ist und auf dem PCB wie 
erwartet einfacher zu routen ist).

Zudem bedarf es, da das multiplexen im ATmega entfällt auch keinen 
Eingriff in einen Timerinterrupt was die ganze Sache sehr vereinfacht.

Von daher versteht den Code auch so ziemlich jeder der ihn ansieht und 
versteht, wie DIESER Zähler funktioniert.

Einen reziproken Zähler habe ich einmal mit einem STM32F103 gemacht und 
vom Ansatz her ist das vllt. reizvoll zu versuchen das auf einem Tiny44 
umzusetzen.

Weiß ich nicht ob ich dazu komme, aber wenn, wird das dann vllt. doch 
eine Version 2 geben.

Für die vorliegende Anwendung (die Frequenz eines 
XR2206-Frequenzgenerators mit Ausgangsfrequenz max. 100 kHz) reicht die 
Lösung völlig.

Aber wie gesagt, reziproke würde mich reizen, weil wie ich glaube, auch 
die Torzeit dann unter 1 Sekunde liegen kann (im Bereich ab 2 Hz) und 
bspw. das Einstellen eines Frequenzgenerators komfortabler ist.

In diesem Thread werde ich jedoch sicherlich nicht eine Schaltung mit 
gemultiplexter Anzeige in einem anderen Chip posten (da würde ich dann 
eher einen neuen Thread aufmachen).

von Ralph S. (jjflash)


Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich etwas "herumgespielt" und sagt mir, ob ich mit meinen 
Überlegungen falsch liege, ganz sicher bin ich mir nicht (aber eben doch 
gut sicher, eine Frequenzzählung reziproke bis 60000 Hz hat gleich 
funktioniert):

Um eine Frequzenzzählung redziproke komplett machen zu können (und somit 
einfach) habe ich den Input-Capture-Interrupt.

- Wenn ich jetzt eine Auflösung von 1 Hz haben möchte, dann habe ich das 
Problem, dass der TCNT1 ein 16 Bit Register ist und dieses 
logischerweise nur bis 65535 zählen kann. Eine Auflösung von 1 Hz wäre 
mit der Lösung ICP und TCNT1 somit nur bis 65535 Hz möglich.

- Oberhalb von 65535 Hz muß ich somit die Taktfrequenz des 
Timer/Counter1 herabsetzen, damit er mir bei Frequenzen größer 65535 
nicht überläuft. Eine Takthablbierung würde somit eine Frequenzzählung 
bis 13170 Hz bei Auflösung von 2 Hz ergeben.

- Bei höheren Freqenzen wird die Auflösung somit stetig kleiner.

- Ich muß eine Erfassung machen in welchem Frequenzbereich ich mich 
gerade befinde um die Taktfrequenz des Timer/Counter 1 einzustellen.

--------------------------------------------------

Jetzt kreist es im Kopf, wie ich einen reziproken Zähler mit dem 
gegebenen Controller ohne zusätzliche Hardware mit einer Auflösung von 
1Hz realisieren kann. Erst dachte ich, das ist nicht gaaaanz so 
schwierig, aber ein paar Konzepte im Kopf haben sich als Irrtum 
herausgestellt. Wenn da jemand einen Weg für mich hat, höre ich mir das 
gerne an (im Moment bin ich glaube ich angetriggert).

Mit den Überlegungen werde ich jetzt dann mal an der Matraze horchen 
gehen!

von m.n. (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Ralph S. schrieb:
> Erst dachte ich, das ist nicht gaaaanz so
> schwierig, aber ein paar Konzepte im Kopf haben sich als Irrtum
> herausgestellt.

Du denkst zu kompliziert ;-)
Auch wenn Timer1 nur 16 Bit breit ist, er meldet seine Überläufe, sodaß 
man ihn einfach auf 32 Bit "aufpusten" kann. Da er die Auflösung für die 
Messung liefert, sollte er auch immer mit höchster Taktfrequenz laufen.

Für eine reziproke Messung braucht man zwei Zähler. Der eine zählt die 
Eingangsimpulse in einem Meßintervall und der andere die exakte Zeit des 
Intervalls. Das ganze gibt es schon in Kurzform zum Nachlesen: 
http://mino-elektronik.de/fmeter/fmeter.htm#funk

Für eine 6-stellige Auflösung mit max. 200 kHz Anzeige bei 16 MHz 
Taktfrequenz braucht man eine minimale Messdauer von 1/16000000 s * 
200000 = 0,0125 s. Oder anders ausgedrückt: max. 80 Messungen sind bei 
dieser Auflösung erreichbar. Beschränkt man sich auf 5 - 10 Messungen/s, 
ist damit volle Auflösung bei jeder Messung und Meßfrequenz gegeben.

Während die Zeitmessung per Hardware-Timer läuft, müssen die 
Eingangsimpulse per ISR in Software gezählt werden. Wie schnell die ISR 
zählen kann, hängt vom verwendeten Compiler ab. Als Richtwert für C-Code 
kann man 10 kHz Zählfrequenz pro 1 MHz CPU Frequenz bei einem AVR 
ansetzen. In Assembler programmiert etwa Faktor 5 mehr.
Mit 16 MHz Takt wird die obere Grenzfrequenz bei ca. 160 kHz liegen. 
Wenn Das zu knapp ist, könnte man entweder die Taktfrequenz auf 20 MHz 
erhöhen, oder einen kleinen Vorteiler /2 bzw. /4 einfügen, was die 
Auflösung nicht verschlechtert. Lediglich muß /2 oder /4 skaliert werden 
und Messungen im unteren Hz-Bereich laufen entsprechend langsamer.
Bei einfachen Quarzen mit +/- 50 ppm ist eine Fein-Skalierung oder ein 
Ziehkondensator für einen genauen Abgleich sehr sinnvoll!

Ein Beispiel für eine reziproke Frequenzmessung mit einem ATtiny44 
findest Du hier: http://mino-elektronik.de/fmeter/fm_software.htm#bsp11
Die Variable count in ISR(TIM1_CAPT_vect) könnte auf uint16_t verkürzt 
werden, da selbst bei 200 kHz und 5 Messungen/s nur 40000 als 
Zählerstand erreicht werden. Das beschleunigt die ISR.

Was noch fehlt, ist die Ausgabe auf's Display. Hier reicht eine Anzeige 
in Hz, die durch einen "wandernden" Dezimalpunkt von 0.12345 - 200000 
den ganzen Meßbereich abdeckt.

Im Grunde mußt Du Deine vorhandene Schaltung nicht verändern. Lediglich 
die Umschaltung von Spannungs- und Frequenzmessung muß auf einen anderen 
IO-Pin (PA0 oder PA4 - PA6) verschoben und Fin an PA7 gelegt werden.

Die Ausgaberoutine kannst Du vielleicht hier entnehmen: 
http://mino-elektronik.de/progs/avr/Drehzahl_4_45_float/Drehzahl_4_45_float.c 
Das Programm läuft auf einem ATtiny45 und zeigt 4-stell. Ergebnisse auf 
LCD mit wanderndem Punkt an. Es sollte kein Problem sein, die Wandlung 
auf 6-stellig anzupassen.

Vielleicht spielst Du ein wenig herum. Gerade beim Abgleich oder 
Einstellen von NF-Oszillatoren ist eine schnelle Meßwertausgabe von 
Vorteil. Man erkennt dabei auch, wie stabil das Signal ist.
Ich denke, das reziproke Verfahren wird Dir gefallen.

von Ralph S. (jjflash)


Bewertung
0 lesenswert
nicht lesenswert
m.n. schrieb:
> Ich denke, das reziproke Verfahren wird Dir gefallen.

Ich weiß, dass mir das gefallen wird, weil ich das mit einem STM32 schon 
einmal gemacht habe...

m.n. schrieb:
> Für eine reziproke Messung braucht man zwei Zähler. Der eine zählt die
> Eingangsimpulse in einem Meßintervall und der andere die exakte Zeit des
> Intervalls.

Das wußte ich auch

m.n. schrieb:
> Auch wenn Timer1 nur 16 Bit breit ist, er meldet seine Überläufe, sodaß
> man ihn einfach auf 32 Bit "aufpusten" kann. Da er die Auflösung für die
> Messung liefert, sollte er auch immer mit höchster Taktfrequenz laufen.

Da hängt jetzt meine Crux und das werde ich noch mal überdenken.

m.n. schrieb:
> Während die Zeitmessung per Hardware-Timer läuft, müssen die
> Eingangsimpulse per ISR in Software gezählt werden.

Das ist sehr klar.

m.n. schrieb:
> Ein Beispiel für eine reziproke Frequenzmessung mit einem ATtiny44
> findest Du hier: http://mino-elektronik.de/fmeter/fm_software.htm#bsp11

Das schaue ich mir garantiert an.

Danke für deine Infos

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Bei Bedarf könnte ich Dir die Timer1-ISR noch beschleunigen, damit der 
benötigte Eingangsfrequenzbereich ohne jeden Vorteiler abgedeckt wird. 
Aus Gründen der Transparenz habe ich meist darauf verzichtet.

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.