Before having this, I used some screw terminals to power the stuff I've been working on. That wasn't that bad, but still, I wanted something better, easier, with extra feature, current measurement.
After two weeks of debugging, soldering, and repairing, I can finally see some results: though, it isn't very precise, currents are measured, the menu system I wrote, is working good,
I've had luck (and bad luck) with some switch mode power supplies I bought some time ago, I used those as main power supplies. However, if anyone wants to build that part too, I can suggest building a symmetrical power supply with simple LM317 and LM337 adjustable regulator stages. I made three of those a few years ago, they're really useful for op-amp circuits for example, where positive and negative rails are needed, in respect to ground.
What you're gonna need, is a lot of patience, really. If you have some experience with making PCB-s, and soldering, none of the steps should give you any headaches.
Let's see what this idea of mine is all about, and how it was built.
Step 1: The Power Supplies
The DIY version of a power supply can be seen on the second image. These come in handy, but you have to buy a symmetrical transformer for each.
Step 2: Current Measurement Unit
At the heart of the measurement unit there's the LM324 quad operational amplifier. The op-amps in it (intend to) scale the voltage read on the shunt resistors to the voltage that can be read by the ADC of my processor. This means, an amplifying module needs to be added.
First, we need to know some details about our power supply, like the maximum output current at a given output. Luckily, the PSU-s I own, had this printed on the casing: 12V @ 2.5 A, and 5V @ 15A. That settled it, the maximum currents were considered to be 2.5A, and 15A, respectively. I had some 20W, 0.1R resistors hanging around, I decided to use those.
Let's see the calculations for the 5V current sensing part:
Uout = 5V; Imax = 15A; Rs = 0.1R;
The maximum current, that could ever go through that resistor, is 2.5A. According to Ohms law, the maximum voltage on it will be 15 * 0.1 = 1.5V. Now, we need to scale that to 5V to get the best resolution, so we're going to amplify it by 5 / 1.5 = 3.33.
We look up the gain formula of the op-amp (shunt voltage is on the non-inverting input of the op-amp), which is:
Vo = Vs * ( 1 + ( Rf / Ri ) )
So, if we're looking for an amplify of 3.33, our feedback resistor / input resistor ratio has to be 2.33. In other words, Rf should be Ri * 2.33. I used a 22K and a 10K resistor for this job. Based on these calculations, the maximum ever measured on the ADC input will be 1.5 * 3.2 = 4.8V. So, at 4.8V on the ADC, we have 15A flowing.
Let's calculate the resolution of our ADC module:
5 / 1024 = 0.004882;
That gives us 983 steps between 0 and 4.8V.
15A / 983 = 15.25 mA, this is the minimum current we can measure with our setup. The current measurements will be multiple of this.
Now let's do the same for the 12V output:
Uout = 12V; Imax = 2.5A; Rs = 0.1R;
The maximum current flowing through Rs is 2.5A. The maximum voltage on it will be 2.5 * 0.1 = 0.25V. If we want to scale it to 5V (processor maximum voltage), we need to amplify it by: 5 / 0.25 = 20.
Again: Vo = Vs * ( 1 + ( Rf / Ri ) ), so our feedback resistor needs to be 19 times bigger, than the input resistor. A feedback resistor of 51k and an input resistor of 2.7k give me a pretty close 18.88 gain. There is probably a better match for this, i just ran the numbers on some more common resistor values.
The ADC maximum for this output will be 18.88 * 0.25 = 4,72V. The resolution in this case will be better: 2.5A / 966 = 2.58 mA.
I didn't put measuring modules for the negative power supply rails, I simply didn't had any op-amps left. Adding those later is simple, I calculate the resistors, and take care to put the shunt voltage on the inverting input pin.
A basic schematic of how one shunt should be connected to the circuit, is shown on my drawing.
Once we have the schematics done, we have to make a PCB design. I used Altium designer, that's the one I know the best, since the schematic was pretty simple, I finished in about a half hour. The op-amp and the feedback loop resistors are surface mount devices, the screw terminals and the power resistors are through-hole. Make sure you put the op-amp on the top side, so you don't get a mirrored PCB at the end.
Altium can export to pdf format, through an "Output Job" file. I set the scaling to be 1:1, i took off the mechanical, silkscreen, and keep-out layers, and made the exportation. You need to make sure, you select the "Page setup dialog" scaling option, when you click generate.
Just a brief description about how the PCB is made:
- print the artwork on transfer foil or shiny paper ( usually I rip these out of magazines )
- clean the PCB ( and cut it, however this can be done after the etching is done )
- put the artwork over the PCB, and melt the toner over to the PCB with an iron or a laminator
- wash off the paper with warm water
- put the board in the etchant, and wait for the copper to be eaten away
Mount the components on the board, starting with the one with the lowest profile. Test the board by measuring voltage on op-amp outputs while currents are flowing through the shunt resistors.
Step 3: Generator Unit
The AD9833 generator IC is a programmable waveform generator capable of generating sine, triangular, and square wave outputs. The output frequency and phase can be adjusted through SPI. Using 50MHz oscillator (not crystal), one could get resolution of 0.1 Hertz. The AD9833 has sleep mode, this allows minimization of power consumption. The one bad thing about it is the tiny package and footprint. I was able to solder it, but it took quite a few minutes to get it straight.
The maximum VOUT is 0.65 V, that needed amplification, so I included an AD8051 rail-to-rail operational amplifier.
The design was made in Altium, the PCB was made with UV exposure method. The clearance between the groundplane and the rest of the wires is 0.3 mm.
Assembling it is pretty straightforward, as usual, start with the component with the lowest profile. I recommend you to use a lot of flux when soldering the AD9833. After that, the SO8 package of the op-amp will be piece of cake.
Building it was pretty simple, getting it started is a whole other ballpark. Since I used a bit-banged SPI protocol to talk with the DDS, I've had plenty of problems until I got that to work reliably. I didn't had luck with the SPI devices, the display IC reacts at rising edge, the DDS generator clocks in data at falling edges. I managed to get out the waveforms, but changing the frequency doesn't work as expected, even though the analyzer shows valid SPI commands. There's still a lot of work that needs to be done on this, probably a new PCB, maybe a whole redesign.
Three menu points were assigned to this module, Frequency, Phase, and Waveform.
Frequency: 1 >> 50MHz
Phase: 0 >> 360 phase shift
Waveform: off, trianglewave, squarewave, sinewave
The frequency, phase and waveform can be adjusted through the rotary encoder. There is some added control, located under the display, those can be used to increase the value by tens, hundreds and thousands.
Step 4: The 8 Digit Display Unit
At the heart of it there's an SPI display controller, the MAX7219. This is a 24 pin IC, which uses a single resistor to set the current for the digits, that is the one external component you'll need to drive displays (The 10uF capacitor is optional, if you know you have a steady 5V ). I have one more MAX7219 left, I might be building another one, to see more info about the processes that are being monitored. It's a very useful tool for debugging, too.
Aside of some hardware problems (very thin cuts on the PCB traces), this module powered up almost the first try. I had two cuts, and a short between two traces, these were pretty easy to locate. Segment 'd' simply wouldn't light up on the first 6 digits at first start, I found a cut between the 6-th and 7-th digit with the multimeter. Once that was fixed with a little bit of solder, the problem disappeared. Again, using my multimeter, I located a short between segments 'e' and 'f', scratched it, everything went back to normal.
The user can change how many digits are displayed, the luminosity of the whole display module, and of course, the variables, that change the behavior of other modules.
For visualizing waveforms, I added another, graphical display on the front panel as well, the handler routines still need to be written for it. The GLCD also communicates through SPI, that part is already done, luckily.
Step 5: Input Devices, Buttons, Switches, Encoders
I used a pocket calculator and a spreadsheet to calculate the output voltages, and the ADC values.
The switches are only there to interrupt the circuit of the power supplies. Those don't connect directly to the PIC, so there's no feedback about their states on the display, at least not yet. A future development could be to connect these too, and make a clever algorithm to automatically pick the current measurement, if only one switch is turned on.
For now, there are only small 3 mm green LED-s, they light up, if the switch is active.
Instead of messing around with buttons only, I thought of a better way to build up a menu system. I salvaged this encoder out of a DVD player. That is the same DVD player, which has its front panel mounted on the low side of my cable cover. Connecting it is pretty simple, the A and B pins need to be pulled up to VCC, one goes to the interrupt, the other to a GPIO. The outputs are turning on and off with an offset of 90 degrees, when the shaft is turned. When an interrupt occurs, that GPIO is checked, if it's '1', the encoder turned to left, if it's '0', the encoder turned right. A variable is increased/decreased when the encoder turns in one, or the other direction. This variable helps us to find out, 'where' the encoder is.
The encoder has a button as well, that connects to another GPIO, and has a pull-up to 5 volts.
I made a drawing of the stuff I just told you. The image depicts the moment, when the encoder is turned right. If the encoder would turn left, the impulse on the INT pin would come first, surprising the GPIO in a '0' state. So, long story short, this is how you work with encoders.
The PIR sensor is powered from 12V, it has two pins, which connect/disconnect when motion is detected. I put one side to ground, and tied the other one - with a pull-up to five volts - to an input pin of the microcontroller.
Step 6: Main Control Board
This unit holds the program, thus controls the display, generator, reads the buttons, encoders, sensors, and makes measurements with the ADC module. Everything that needs to be known about the PIC can be found in the datasheet, or on the Microchip forums. There are friendly and smart users on there, if you know how to ask, they are very helpful.
Like many other boards before this, I made this one mirrored. And, of course, I only realized that when I was about to push the PIC into the socket. Don't forget to double check the PCB prints when they're ready.
Step 7: Cutting, and Drilling the Front Panels
The first try went good with the display panel, I thought to make the other one with the CNC mill too, to make it super-precise. Bad decision, I ran out of luck, and pressed the emergency button too late, the bit broke. At least I can show you how I made front panels, before I got the mill. I drill the holes first, then drill a contour of each rectangular shape, both actions with a 3 mm drill bit. After that I use a clipper to remove the center of the rectangles, and pile down the rest, to fit the switches. I used a switch and a caliper to test the cutouts.
Then I took a larger drill bit, and widened the holes by hand, using a mandrine.
Then, the panel was painted with black spray paint, and the switches, pots, banana plugs, and the encoder were mounted.
I have to say, I finished the second panel ( the one with the switches) faster than the mill finished the first. Since I am new at milling, I set a low feed rate, just to be sure. That slowed the whole thing down to a point where I almost fell asleep at the side of the machine, with my finger on the E-stop button. Second, I set the job to be cut from the inside, spiraling out to the edges. That took a lifetime too. Even this way, I forgot to zero the default 0.625 stock, so the holes were actually smaller with 1.3 mm, I had to pile down the rest by hand.
Step 8: Final Words, Cleaning the Table
My next project will be posted here too, in form of an other instructable, some water pump control will be added to the actual setup, along with a servomotor controller algorithm.
I didn't attach any sch or pcb file to this project, because I don't promote laziness. This is the reason why I didn't post the PIC18F4550 code either. However, I would be more than happy to help you out with sample code or questions, or just to share experiences.
I wish to thank you for reading through my first instructable.
Have a nice day!