Click on the diagram above to get a larger PDF version, which allows you to see more details.
The Fluke interface diagram is an example of a typical micro controller circuit. There is not really much to see, apart from the micro controller itself. Nevertheless I'll try to explain what's happening here, because not everything is as obvious as it may seem at first glance.
I chose the CCU3000 micro controller from Intermetall/Micronas for this project for a few important reasons.
First of all it has more than the required number of I/O lines.
All the input pins are really floating, which is also one of the requirements (I'll explain why later).
And last, but not least, it has a quite modest current consumption, which is important because the power supply of the Fluke 8010/8012 is quite small and may not be loaded to heavily with extra circuitry.
By running the CCU3000 at 1MHz I could reduce the current consumption of the total circuit down to about 3mA.
Oh, and there's another good reason why I chose that processor back then.
It was available to me, free of charge.
Those were the days when you couldn't buy just about any fully featured micro controller for next to nothing you know.
The CCU3000 operates on a 4 MHz crystal oscillator, which is connected between the pins 3 and 4. Internally this frequency can be divided down to an appropriate value. I chose a division factor of 4 to reduce the power consumption, resulting in an internal clock frequency of 1 MHz, which is more than sufficient for our application.
The reset circuit is also an example of simplicity. A simple RC network connected to pin 6 will do the trick. A diode is added across the resistor to achieve a fast discharge of the capacitor when the power fails, which will guarantee a proper restart if the power supply is interrupted only briefly. The diode will start conducting as soon as the power supply voltage drops below the charge level of the capacitor, effectively discharging the capacitor.
It is important to pull pin 17 high with a resistor to make the CCU3000 fetch its mode control byte from external memory, for there is no internal memory to fetch it from.
I do admit that the EPROM is a bit over sized with its 32kB, for the program is just about 6kB long. I had ample 32kB EEPROMs in stock, and they are almost always made in CMOS technology, which is a requirement to achieve low power consumption. It is hardly possible to reveal any more secrets about the connection of the EPROM in this circuit. Except that the OE line of the device is permanently tied to ground, making it active all the time. This is no problem because the EPROM is the only device connected externally to the address/data bus of the CCU3000. The address bus is ignored by the CCU3000 when addressing internal memory or I/O peripherals.
Again nothing special here.
The power supply consist mainly of the linear regulator LM2936-5, which excels in a very low quiescent current which also contributes to the low overall power consumption.
You may also use a normal 78L05 if you can't get the LM2936-5, at the expense of a slightly increased consumption.
It is very important to de-couple the input and the output of the LM2936-5 with capacitors of at least 22µF, otherwise you risk a heavily oscillating power supply!
It goes without saying that the connection between these capacitors to the LM2936-5 must be as short as possible.
Apart from these capacitors I advice you to add 100nF capacitors as close as possible to the power supply connections of all the ICs.
The X24C02 is an I²C controlled NVM, with a data capacity of 256 bytes.
Many different manufacturers exist on the NVM market, so there should be plenty compatible ICs to choose from.
It is even possible to put in a larger memory, eg the X24C16.
This little EEPROM is a bit over sized for it has only 2 things to remember, the SB-Bus address and the meter model.
The SB-Address is only 7 bits wide, and the meter model can be represented by only 1 bit.
I've added 2 identification bytes to verify the validity of the data, which adds up to a total of 3 bytes used of the available 256.
The SB-Bus connection shown in the upper right hand corner of the diagram shows all that is needed to make the interface connect to the outside world.
The two opto-couplers take care of the necessary galvanic insulation between the SB-Bus and the meter.
Please bear in mind that the ground level of the meter may be raised up to 500V above the normal ground level.
I guess that I don't have to emphasize that this would be very unhealthy without these opto-couplers!
The open drain output of the CCU pin 14 can pull the base of the PNP transistor low, which makes it conduct, which makes the opto-coupler to start conducting as well.
The receiving opto-coupler can pull input pin 13 of the CCU low.
Normally this input is held high by a 1kΩ resistor.
Pins 13 and 14 are connected internally to 2 of the 3 available timer circuits in the CCU.
These versatile timers can be programmed to perform like a normal serial interface.
The two 100kΩ resistors speed up the transitions of opto-couplers, making the ramps somewhat steeper.
Now we come to the most important property of the CCU3000, which makes it so suitable for this project. Most of the available I/O lines are needed to connect to the segment information of the display. But this is not always as easy as it may seem.
The segments of an LCD are controlled by a 50 Hz square wave (or 60 Hz in the US), with an amplitude switching between +3V and -3V.
The inputs of the CCU3000 aren't allowed to be taken lower than -0.3V.
A series resistor of 100kΩ should actually be enough, because the internal substrate diodes will limit the negative voltage automatically.
I wasn't too satisfied about this idea, not knowing what the long term effect would be on the chip.
So I decided to take a somewhat different approach.
I took a load of diodes, which all should limit the lowest voltage to about 0V.
To achieve this I had to raise the common anodes to approximately +0.6V
The 100kΩ resistors are large enough to limit the consequences for the voltage levels of the LCD to a minimum.
According to the specifications of the CCU3000 a voltage on an input above +3.6V is considered 'high' level. Lucky for us this is a very pessimistic value, for it appears that the CCU3000 is perfectly happy with voltage levels of only +3V on its inputs. Because of this relatively low voltage, and the fact that this voltage may not be influenced by the interface, it is inevitable that the input lines of the micro controller really must be floating. Internal pull-up resistors can not be allowed here, for they will raise the LCD voltage, resulting in an added DC component to the LCD which could kill the display in the long term. The CCU3000 is quite unique in this very important property.
In order to read the display we have to read a total of 20 segments.
Per 7-segment digit we need only 5 segments to uniquely identify what digit is shown.
Furthermore we have to read the status of the left most 1, the - sign, and the 3 decimal points.
The segments of the 3 complete digits are connected in a neatly ordered way to minimize software overhead to decode them.
One of the decimal points has gone astray, while the others are connected to the remaining pins of P6.
The third decimal point could have been connected to P6 too (pin 68), but I deliberately connected it to P8 bit 7 instead because this pin can also serve as an interrupt input.
This way it is very easy to synchronize the interface with the meter.
The meter takes 2.5 readings per second, and the display is clocked with exactly 50 Hz.
We may safely assume that a reading is completed every 20 clock pulses.
In order to use such a signal successfully we have to use the most stable signal.
The most stable signal is the Back Plane, but that is not connected to the circuit.
The next best thing is one of the decimal points, for they will remain stable for as long as we don't switch to a different range.
And if we do switch to a different range, we may safely say that the first reading won't be valid anyway.
Not connecting the Back Plane will present us with another problem.
How do we know what segments are on, and what segments are off?
Remember that all signals constantly show a 50 Hz square wave, whether the segment is on or off.
It's the phase of this square wave in respect to the Back Plane which tells us what segments are on or off.
But as we can see in the diagram, the Back Plane is not connected to the interface.
The solution is very simple: The software checks the phase of all 3 decimal points.
If it finds that only one of them is different, it knows that that one should be on, and so are all the other segments with the same phase.
If it finds that 2 or more decimal points are on, it knows that this can not be true and that they are actually off, and so are all the other segments with the same phase.
A simple, yet effective, solution to save one input pin.
Remark: Digit 1 is the left most complete digit, while digit 3 is the right most digit. The corresponding decimal points are always located left of these digits.
There's only one thing left to be mentioned, and that is pin 56 of the CCU. The transistor connected to this pin is used to drive the BT indicator on the display. The 6k8 resistor together with the on-board 20kΩ resistor form a voltage divider. This will prevent the voltage on pin 8 of U6 on the main board from raising above +3V.
Part | Qtty | Remarks |
CCU3000 | 1 | |
27C256 | 1 | Programmed with software |
X24C02 | 1 | Or equivalent |
LM2936-5 | 1 | Or 78L05 |
4N35 | 2 | Safety part! |
Crystal 4MHz | 1 | |
Resistor 390Ω | 2 | |
Resistor 1kΩ | 1 | |
Resistor 4k7 | 1 | |
Resistor 6k8 | 1 | |
Resistor 22kΩ | 6 | |
Resistor 100kΩ | 22 | |
Capacitor 100µF/16V | 1 | |
Capacitor 22µF/10V | 1 | |
Capacitor 10µF/10V | 1 | |
Capacitor 100nF | 3 | |
Capacitor 22pF | 2 | |
Diode 1N4148 | 26 | |
Transistor BC557 | 2 | Or any other PNP transistor |
4 way mini-DIN connector | 2 | |
Socket PLCC68 | 1 | |
Socket 40 pin | 2 | Twisted contacts! |
Socket 28 pin | 1 | |
Socket 8 pin | 1 | |
20 pin boxed header | 1 | |
20 way connector | 1 | |
20 way flat cable | 1 | About 15cm long |
3 pin header | 1 | |
3 pin connector | 1 |