TonOhmMeter

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

by Rolf Bulla

Motivation

Das fertige Tonohmeters

Jeder kennt das Problem, dass Schaltungen oder Verdrahtungen schon mal aufgrund von Kurzschlüssen oder Unterbrechungen nicht funktionieren. Dafür bietet das heimische Multimeter einen Durchgangsprüfer, der akustisch eine niederohmige Verbindung entlarvt. Schwierig wird es nur, wenn sich die Stelle des Kurzschlusses nicht gleich offenbart. Für solche Fälle kann man dann ein Tonohmmeter heranziehen. Damit wird der gemessene Widerstand in der zugehörigen Tonhöhe abgebildet. Je kleiner der Widerstand je höher der Ton. Ist der Messbereich empfindlich genug, kann man sich so dem Verursacher nähern.

Das Gerät aus der Studienzeit hat leider den heiligen Siliziumhimmel erreicht und weilt nicht mehr bei mir. Warum also nicht ein neues mikroprozessorgesteuertes Gerät auf Basis eines AVR bauen.

Features

Die folgenden Ansprüche hat das Gerät zu erfüllen:

  • Akkubetrieb (LiPo) mit Ladezustandsanzeige
  • Aufladung durch Mini-USB Buchse
  • drei Messbereiche (0.1, 1 und 10Ohm)
  • Mehrere Tage Dauerbetrieb und mehrere Monate Stand-by mit einer Akkuladung
  • kleines, handliches Gehäuse
  • gängige Bauteile

Messprinzip

Messsignal

Der Widerstand wird über den Spannungsabfall gemessen. Um auch Messungen innerhalb von Schaltungen durchführen zu können wird ein Rechtecksignal mit ca. 340mV (da machen die üblichen ESD Strukturen der ICs nicht auf) auf den unbekannten Widerstand losgelassen. Der resultieren Spannungsabfall wird dann über OpAmps verstärkt und gleichgerichtet. Der AVR übernimmt die AD-Wandlung und Tonausgabe.

Hardware

Schaltplan des TonOhmMeter
Die Hardware des Tonohmeters

Spannungsversorgung

Zentrum der Spannungsversorgung ist ein LiPo mit nominal 3.7V. Geladen wird er mit maximal 4.2V und 500mA. Die gesamte Ladekontrolle übernimmt eine MAX1811 (IC5). Der AVR wird über einen Regler (IC1) stabil mit 3.0V versorgt. Für die OpAms benötigte negative Spannung (-2V) kommt auch der Charge Pump C6/D1. Der analoge Teil kann im Ruhezustand über Q1 abgeschaltet werden. Der Ladestand wird durch den Spannungswert am LiPo abgeschätzt (R25/R26).

Nachtrag

Konstruktionsbedingt kann es zur Tiefenentladung und damit zur Zerstörung des LiPos kommen. Der AVR stellt zwar die Unterspannung fest und startet nicht aber der LiPo wird durch den Ruhestrom weiter entladen. Abhilfe schafft da nur ein zusätzliches Batteriemanagementsystem (PCB Schutzschaltung), die es beim LiPo Lieferanten für kleines Geld gibt (z.B. PCB 2,5 A 1 Zelle Lipo Li-ION -259). Durch die kleine Bauform (15.0 x 4,0 x 2.5 mm) passt das PCB noch nachträglich ins Gehäuse. Damit kann dann dem LiPo nun nichts mehr passieren.

Messschaltung

Das Rechteckgrundsignal von ca. 1KHz erzeugt der AVR an PA6. Die Pegelwandlung vollzieht IC3A und die Schottkydioden (D2) begrenzen den Spannungshub. Da wir ja an Milliohm heran wollen, muss die Messleitung kompensiert werden. Daher erfolgt der Anschluss der Messklemmen jeweils über 2.5mm Klinkenbuchsen an denen das zweipolige Messkabel erst verbunden wird. Danach folgt eine zweistufige Verstärkungsschaltung mit Tiefpass. Die zweite Stufe ist über einen programmierbaren Widerstand (IC4) in ihrer Verstärkung steuerbar. Der AVR kann über eine bidirektionale SPI den Widerstandswert und damit die Verstärkung bestimmen. Das so verstärkte Signal wird am Ende von IC3D gleichgerichtet und dem AVR zwecks AD Wandlung zugeführt.

Bedienung

Das Gerät wird nur über eine Taste (U1) bedient. Die Hardware-Entprellung (C8/R3/R4) vermeidet die sonst nötige Software. Die Messbereichsanzeige erfolgt über drei LEDs (LED2-4) und die Tonausgabe übernimmt ein kleiner Lautsprecher der kapazitiv an den Digitalport angeschlossen ist. Das reicht für einfache Töne aus. Schließlich wollen wir ja kein MP3 ausgeben.

Platine

Die Platine des Tonohmeters

Da es mir das Handheld-Gehäuse von HAMMOND angetan hatte, war es schwierig einen von den Dimensionen her passenden LiPo zu finden. Leider fand ich nur einen für die Vorderseite, so dass die Platine etwas eng wurde und beidseitig bestückt wird. Am einen Ende sind die beiden Klinkenbuchsen für die Messstrippen und an der Unterseite die Ladebuchse mit Ladeanzeige. Die unbenutzte Routingfläche ist als Massefläche ausgelegt. Links ist der AVD-ISP Anschluss zuerkennen, der uns das On-Board-Programming ermöglicht.

Software

Das Programm benötigt unter 2K weshalb ein ATTINY24 ausreichen würde. Wegen dem - man weiss ja nie - hab ich trotzdem den ATTINY44 genommen. Die Programmentwicklung wie üblich in C auf AVR Studio6 und debugged mit AVR-DRAGON.

Ein wenig Arbeit hat die SPI Schnittstelle zum programmierbaren Widerstand (POT) gemacht. Zum einen erfordert der POT einen bidirektionalen Datenpin (SDI und SDO zusammen) und zum anderen konnte ich die USI nicht missbrauchen, da sie auf ungünstigen Ports lag. Die S/W Emulation sieht dann so aus:

// SPI write emulation (with SDI/SDO multiplexing)	
void SPI_write(uint8_t addr, uint16_t data)  {
	TIMSK0 &= ~(1<<OCIE0B); 		// Stop 1KHz (PA6)
	TCCR1B = 0;					// stop timer (no tone signal)
	
	PORTA |= (1<<PA6) | (1<<PA4);	// SCK=SDIO HIGH
	DDRA |= (1<<PA6) | (1<<PA4);	// SCK+SDIO to output

	PORTA &= ~(1<<PA2);			// CS low
	
	// Address AD0..3 (bit15...12)
	for (i=3;i>=0;i--) {
		PORTA ^= (1<<PA6);		// SCK = LOW
		if ((addr & (1<<i)) == 0)
		PORTA &= ~(1<<PA4);
		else
		PORTA |= (1<<PA4);
		PORTA ^= (1<<PA6);		// SCK = HIGH
	}
	
	// Command C1,C0 (bit11,10)
	PORTA ^= (1<<PA6);			// SCK = LOW
	PORTA &= ~(1<<PA4);			// Data = LOW
	_delay_us(5);
	PORTA ^= (1<<PA6);			// SCK = HIGH
	_delay_us(5);
	PORTA ^= (1<<PA6);			// SCK = LOW
	_delay_us(5);
	PORTA ^= (1<<PA6);			// SCK = HIGH
	
	// Data D9..0 (bit9..0)
	DDRA |= (1<<PA4);				// set SDIO to output
	for (i=9;i>=0;i--) {
		PORTA ^= (1<<PA6);		// SCK = LOW
		if ((data & (1<<i)) != 0) {
			PORTA |= (1<<PA4);
		} else {
			PORTA &= ~(1<<PA4);
		}
		PORTA ^= (1<<PA6);		// SCK = HIGH
	}
	
	PORTA |= (1<<PA2);			// CS to HIGH
	DDRA |= (1<<PA4);				// SDIO to output
	
	TIMSK0 |= (1<<OCIE0B);			// Restart 1KHz (PA6)
	TCCR1B |= (1<<WGM12) | (1<<CS11);	// Restart TIMER with CLK/8
}

Das vollständige Programm liegt im Downloadbereich weiter unter.

Bedienung

Durch einen Druck des Tasters wird das Gerät eingeschaltet. Die ersten zwei Sekunden zeigt sich der Ladezustand des Akkus an den drei gelben LEDs (3 LEDs an >75%, 2 LEDs >50% und eine über 25%). Ist die Akkukapazität unter 25% muss erst nachgeladen werden. Die Schaltung bleibt im Ruhemodus. Nach erfolgreichen Start erfolgt für 2 Sekunden ein Quittungston und das Gerät ist einsatzbereit. Der gemessene Widerstandswert wird gewandelt in eine passende Frequenz von 500Hz bis 2 KHz - sofern er sich im Messbereich befindet - ausgegeben. Durch weitere Tastendrücke wird der Messbereich gewechselt. Hält man die Taste mehr als 2 Sekunden gedrückt wechselt das Gerät in den Ruhemodus und schaltet ab.

Herstellung

Obwohl wegen dem Platzmangel hauptsächlich SMD Bauteile verwendet werden, lässt sich die Platine einfach löten. Die Rückseite mit den SMD Bauteilen habe ich über die Pizzapfannenmethode der c't Hacks gelötet. Die Vorderseite mit den Bedienelementen dann halt von Hand. Um ins Gehäuse zu passen muss der 2x3 Pfostenstecker von Hand gekürzt werden. Für das Gehäuse ist einwenig Bohren und Feilen angesagt. Als Hilfe liegt eine Bohrschablone im Downloadbereich.

Ausblick

Getreu dem Motto: eine fertige Software ist eine veraltete, hat die aktuelle S/W Version zwar die beschriebenen Grundfunktionen lässt sich aber sicher immer verbessern. Übrigens der Strombedarf im Arbeitsbetrieb ohne Tonausgabe beträgt ungefähr 13mA, mit Tonausgabe 23 mA. Der Stand-by haut mit 215uA rein. Ein halbes Jahr kann man also ohne Nachladen auskommen. Im Dauer-Betrieb kommt man wohl so auf 2-3 Tage. Der heimische Praxistest wird das hoffentlich bestätigen.

Downloads

Siehe auch

Links

Die Platine kann zum Selbstkostenpreis von 7,- EUR bei mir bezogen werden (so lange der Mustervorrat reicht).