Nothing is simple, right?. I ran into a minor "gotcha" with regard to my Bodacious Acoustic Diagnostic Astoundingly Superior Spectromatic (BADASS) display project. As you may recall from my previous blog on this topic, I'm planning on implementing a 16 x 16 array of tri-colored LEDs using NeoPixel Strips from Adafruit. I'm also planning on controlling these little beauties using an Arduino Mega 2560 R3 microcontroller development board.
When it comes to processing the audio stream from my iPad to extract its frequency data, which will subsequently be handed over to the Arduino Mega to be displayed, I'm planning on experimenting with a variety of approaches. (See also Selecting interface for linking MCUs.) A couple of these approaches will involve a chipKIT Max32 microcontroller prototyping platform.
The NeoPixel strips require a 5V power supply. Each LED can draw as much as 60mA if all three of its RGB channels are full-on. In reality, it will be rare indeed for all 256 LEDs to be fully on, but I prefer to design for worse-case scenarios. In this case, this would be 60mA x 256 = ~15.6A. In order to accommodate this, I ended up purchasing a 26A highly-regulated power supply as shown below.
Now, the Arduino Mega and the chipKIT Max 32 both require an external supply of between 7V and 12V. When this supply is fed into the board, it is first regulated down to give a constant 5V supply and then regulated down again to provide a 3.3V supply. Alternatively, these boards can also be powered from a USB programming cable, which can provide a 5V supply.
The problem is that things tend to get messy if you are powering each unit from a different supply. Quite apart from anything else, I really don’t want three power cables coming out of the display. Also, if you are using different supplies, then you can't be sure which sub-unit will power up first and you can end up with one unit back-driving another, which is not generally considered to be an ideal situation.
The bottom line is that I really want everything to be driven from my 26A supply. That way I cut down on the cables and on the power supplies, things are neat and tidy, and everything will power up together.
WARNING: The following describes some modifications that I decided to make to my microcontroller boards. Please understand that I am not recommending that you do this to your own boards, because you could easily damage them and invalidate any warranties that came with them. (Yes, these are the obligatory weasel words, but it always pays to remember the old saying: "Eagles may soar, but weasels rarely get sucked into jet engines.")
Modifying the Arduino Mega
This is the point where my techno-weenie chum Ivan Cowie leaps into the center of the stage with a cloud of smoke and a fanfare of trumpets. Ivan, whose office is in the next bay to mine, is a diva when it comes to power supplies and their wily ways.
Ivan first looked at the PDF schematic diagram for the Arduino Mega. You can access the entire schematic by clicking here, but the relevant portions are shown below:
Within just a couple of seconds, Ivan had determined what was required. Since he was jabbing his finger at different parts of the schematic and chattering away at the same time, it was easy to see how he came to his conclusions. The following is pretty much the way he explained it on the fly…
As we see, the external power supply comes in at the top left-hand side. First it is passed through diode D1, which is used to prevent the USB port from back-driving the main power supply (we'll come back to this later). The output from this diode is VIN, which is fed into the regulator IC1. It's the output of IC1 that drives the +5V signal.
But wait, look here… In the bottom of the schematic we see signal USBVCC. This is the five volt supply from the USB cable. This signal is passed to transistor T1, and the output from T1 is also connected to the +5V signal. Thus, the +5V signal may be driven from the external power supply via the voltage regulator, or it may be driven from the USB port.
Now look at the resistor divider formed from two 10KΩ resistors in the bottom left-hand corner of the schematic. This is fed by VIN. If no external supply is connected, then the output from the resistor divider, the CMP signal, will be 0V. This is fed to one of the inputs to comparator IC7B. The other input to IC7B is fed from the +3V3 supply. This means that if no external supply is connected, then the output from comparator IC7B will turn transistor T1 on, thereby allowing the USBVCC supply to drive the +5V line.
By comparison, suppose we have a 9V supply. The voltage drop across diode D1 could be anywhere from 0.3 to 1.0V, depending on the type of diode. If we assume a worse-case value of 1V, then VIN will be 8V. When this is fed into the resistor divider, the signal CMP will be 4V. This will cause the output from comparator IC7B to disable transistor T1, thereby blocking the USBVCC supply and allowing the output from the regulator to drive the +5V signal.
Now, we want to drive the Arduino Mega from an external 5V supply. Even if diode D1 has a voltage drop of only 0.3V, this is still too much, so we are going to short it out. Next, we are going to remove voltage regulator IC1 and connect its input (pin 3) to its output (pin 2). This means our 5V supply is now connected directly to the +5V rail.
But now we have a problem. We are now feeding 5.0V into the resistor divider, which means the CMP signal will be only 2.5V. This is less than the value on the +3V3 rail, which means the comparator IC7B will turn transistor T1 on, thereby allowing the USBVCC supply to drive the +5V rail as well. In order to get around this, what we're going to do is to solder a 5.6K resistor in parallel with the upper resistor in the network.
Ivan further noted that he picked a value of 5.6KΩ because he happened to have some of these resistors handy. Also, that we had to solder this on top of the upper resistor, because both of these resistors were presented in a four-resistor pack. So what we now have is a 10KΩ resistor in parallel with a 5.6KΩ resistor. Using the formula RP = (R1 * R2) / (R1 + R2), this gives us a combined resistance of ~3.6K. In turn, when our 5V supply is now used to drive the resistor divider network, the CMP signal will be ~3.7V. This is higher than the +3V3 signal, so the comparator IC7B will disable transistor T1. Et voila! (Ivan didn’t actually say Et voila! But I could hear it in his voice.)
Suiting his actions to his words, Ivan went on to make the changes to my Arduino Mega as illustrated below. As soon as he'd finished, we tried powering the board only from my 5V supply. Everything worked perfectly. (Hurray!) Next, we tried powering the board only from the USB cable. Once again, everything worked as expected. (Double hurray!)
Finally, we connected the board to both the 5V power supply and the USB cable. As we expected, the CMP signal was high enough to cause comparator IC7B to disable transistor T1. (Triple hurray!)
Ivan also noted that there's one thing to be careful of here. If the 5V power supply is connected to the board, then it must also be plugged into the wall before one connects the USB cable. This is because we removed diode D1. If the 5V supply is connected to the board but it's not plugged into the wall, then when the USB cable is connected it will back-drive the power supply. The resulting current surge might cause the USB port to turn itself off, which wouldn’t be a disaster, but would be jolly annoying.
Modifying the chipKIT Max32
Our next step was to take a look at the PDF schematic diagram for the chipKIT Max32. Once again, you can access the entire schematic by clicking here, but the relevant portions are shown below.
The external power supply enters the upper left-hand side of the schematic via connector J2. By default, jumper JP1 is set to connect pins 2 and 3. This means that the external supply is fed to diode D2. The output from diode D2 feeds the input to the voltage regulator IC4, the output of which drives the VCC5V0 rail. This rail is fed to voltage regulator IC3, the output of which drives the VCC3V3 rail.
In the bottom right-hand corner of the schematic we see a comparator IC5G1. The output from this comparator is used to control transistor Q1. In turn, this transistor either enables or disables the USB5V0 supply coming from the USB cable.
In this case, it looks as though the designers of the chipKIT Max32 have largely anticipated our needs. At first glance, it would appear that all we have to do is move jumper JP1 such that it connects pins 1 and 2 instead of 2 and 3. This simply bypasses diode D2 and regulator IC4, and connects our external 5V supply directly to the VCC5V0 rail.
Sad to relate, however, there is a small "gotcha." Note the resistor divider network formed from resistors R13 and R14 in the upper left-hand corner of the schematic. This is similar to the Arduino Mega. The VCMP signal from the resistor divider is used to feed the input to comparator IC5G1.
There won’t be any problem if we use only our external supply to power the board. Similarly, there won’t be an issue if we use only the USB cable to power the board. The problem arises if both the external supply and the USB cable are plugged in at the same time. In this case, our 5V supply being fed into the resistor divider will leave VCMP at 2.5V, which means transistor Q1 will be turned on and the 5V supply coming through the USB cable will end up fighting our external supply.
If only the designers of the chipKIT Max32 had thought to provide another jumper allowing us to change the value of R13, but they didn't (sad face).
When you are in a prototyping situation, you very often want to connect the USB cable to tweak your program. Now, I could make the decision only to have the external supply or the USB cable plugged in at any particular time. With the best will in the world, however, I'm sure I would forget. As before, the solution is to solder a 5.6KΩ resistor in parallel with resistor R13 as illustrated below:
Once again, we tested the result first with the 5V external supply on its own, then with the USB cable on its own, and finally with both the external supply and the USB cable plugged in. In all three cases, everything worked as planned (happy dance).
So, there you have it. I'm now able to power my 256 LEDs, my Arduino Mega, and my chipKIT Max32, all from the same 5V 26A supply. All I have to do now is finish my BADASS display…
文章评论(0条评论)
登录后参与讨论