The saga of the dual axis solar panel controller continues. As an R&D project I couldn’t put a lot of time into this design this week. Here is what I did get accomplished.
I finally received the PCB for this design. And in general it turned out okay. There were a couple of shortcoming in my design that will force me to to re-spin the PCB, so it’ll be a while before I can finish everything up. But having the PCB gives me the ability to debug my firmware and test the overall concept for this solar panel tracker.
Last week I discussed my latest project, an accelerometer based dual axis solar tracker (that blog is here). When starting a project its easy to get lost in the details. For example, this project has a whole host of possible control functions and interfaces. I’ve always found it useful to start my work on the schematic and hardware. So that’s what I did.
Since this is an R&D project I decided to use some components I haven’t used before. This design will control a 24VDC brushed motor, and a 12VDC brushed motor. I’m going to use two St Microelectronics PN: VNH3SP30-E. They’re rated for 40V and 30A (although there’s no way they can handle 30A without melting off the PCB). One feature I like about these controllers is that they only need a single PWM channel for proportional control. Two other digital channels are used to provide direction. Here’s a section of the schematic that shows the connections between a PIC16F1789 and two of the motor controllers (click the image for a better view).
In the end, this control system will be used to control our dual axis controller that uses a worm gear for horizontal movement, and a linear actuator for vertical movement. Here’s a photo of the assembly in front of the old college text books we could never bring ourselves to throw away. Both the worm gear and linear actual came with feedback. The worm gear was very expensive and has an encoder on the motor. the linear actuator was pretty cheap and came with a potentiometer that failed in about a month. That was one catalyst for attempting that has the position feedback on the control board via an accelerometer.
The circuit board ended up being about 2.5” x 3.5”. Here’s what the top copper layer looks like. The 6 dots on the upper and lower right-hand side of the board are for mounting automotive style blade fuses.
Here is the column from my bill-of-materials.
There are a couple of interesting findings. First, I have an 8MHz oscillator on the design that has the smallest range of operation (-20C to 70C). I’m actually going to use the internal oscillator available in the microcontroller, and I don’t see clock timing to be an incredibly important issue in this design. I added the oscillator part to the schematic as kind of a back-up plan but don’t plan on using it. So I’ll ignore that problem for now.
The next lowest temp. range part is the PDV-P7002, a photocell I will be using to detect daylight. For a part like this, whose resistance changes with light, I would guess that it goes “out-of-specification” outside of its operating range. I doubt it quits working. I’ll have to research that some more, but since I’m using the photocell as a yes/no type input I can accommodate a wide resistance variance.
That leaves me with some ceramic caps that don’t meet my operating temperature range, and I can certainly select a similar part with an extended temperature range, so I’m probably good there.
I guess there was one other issue. The small metal buttons I have on this design (E-Switch parts) had no temperature rating. I thought that was interesting. These are not the kind of buttons you would use in an outdoor design, but no temperature rating?
And now for a sanity check. Am I really going to run this design between –40C and 85C. Nope. This is R&D, it’ll spend its life in my office. If this were a consulting contract we would design for this temperature but suggest our clients place test fixtures in the intended environment to collect operating data and/or make use of a temperature chamber for extended temperature testing.
That’s as far as I was able to get this week. I’ll try to take some time over Christmas break to order the circuit board. I need to panelize it with some other designs so it doesn’t cost an arm and a leg. Hopefully I can begin writing code in January.
A few weeks ago I posted about a design where I would try a motor drive technique called “phase-drive”. You can read that post at Phase Drive a DC Motor.
In summary, “phase-drive” runs a motor at its stall point. To stop the motor you run it 50% forward and 50% reverse, switching back and forth over short periods of time. To move the motor forward you would begin increasing the forward percentage and decreasing the reverse percentage of the drive signal. For example, 51% forward, 49% reverse is the slowest forward speed you could have. 100% forward and 0% reverse would be the fastest. You might run the pulse-width-modulation (PWM) at around 15KHz to keep the switching sounds less audible, and update the forward/reverse percentage every millisecond.
This is hard on the circuit as well as the motor. Why do this? We had a customer that was running an ungeared motor in a position control system and the load was overpowering the torque the motor could provide. Since it was a position control design there was no electrical “push” resisting the motor’s load when the system was “in position” (PWM was 0 when PID output was 0). I wanted to see if this method could provide some resistance to the load by driving the motor even when it was in position. The eventual solution was to use a geared motor, but I added circuitry to test the phase drive technique on our design out of curiosity.
In the end phase-drive did provide additional resistance to the load. And if that was the end of it, I might have used it. But I never really got to the point of quantifying how much better the load resistance was using phase-drive. The motor was extremely hot to the touch after just 10-15 minutes of hitting it with phase drive. Within a half hour of testing I was back at the solder station reconfiguring the board to drive it in the standard fashion. Phase drive was just not cool.
What was cool was the H-bridge circuit we were using. A pair of Infineon BTN8960TA high current half-bridges with some external spike protection components seemed to work very well (there’s a schematic of the h-bridge on the post linked above). The picture above shows the H-bridge portion of the circuit, top and bottom. This circuit regularly drew 6-7A without generating any fault conditions or getting warm. The BTN8960TA are rated for much more current than that, something like 30A. However, thermal issues always seem to be the key to providing large currents to the load and you can see that our footprint for the design is pretty small. I was happy with the efficiency we got from the parts. We used a 10-bit PWM drive signal with a period of 7.8KHz.
In fact, I liked the BTN8960TA so much that I had extra parts ordered so I could put them on a breakout module. I’m looking forward to experimenting with these parts and using them in new designs.
During the design of various motor control systems I’ve run into a few ICs that allow for a peculiar drive method. I’ve seen it referred to as phase drive and direction drive. I’ve never implemented it in a product that’s been produced, but lately I have decided to give it a shot. The traditional method I’ve used for driving a DC motor in a closed-loop application is, simply stated, to drive it forward or reverse. At a direction change the drive signal is typically small. This is particularly true if you implement step limits on the PWM signals change from update-to-update. Doing it this way reduces inductive voltage spikes from high speed reversals, saving your circuit from from death and destruction.
An Arduino motor position controller can be built using an Arduino Uno and our Motion Mind 3 motor controller. This example describes how to interface an Arduino Uno with a Motion Mind 3 to create a closed loop motor position controller. This example and the associated code can be downloaded from our web site as Application Note 1008 (AN1008).
I’ve been working on this design on and off for the last couple of months. The idea came about when I was trying to build a robot that needed to read servo pulses, write servo pulses, and control two motors. I tried using an Arduino, but it really wasn’t up to it.