Epiphyte Sorbent Heating System: First prototype results

A key element of the Epiphyte Direct Air Capture (DAC) system is the sorbent heater, since the capture cycle uses heat to release (desorb) the captured CO2 and regenerate the sorbent:

Before testing the heating system in the actual Epiphyte, I built a prototype version to check out the design concept and understand its behavior.

Heating System Requirements

The main requirement is for the system to be safe from electrical hazards and fire risks. It needs to heat the sorbent to the required temperature, without getting so hot that the sorbent is damaged. It needs to be able to transfer the heat to the sorbent by direct conduction, since it may need to operate in a vacuum.

Design Choices

In the interests of size, cost, and flexibility, I selected resistance wire (Nichrome) as the heating element. Since in the Epiphyte system this wire will be in physical contact with the metal mesh containing the sorbent, it needs to be electrically insulated. Only bare Nichrome wire is readily available, so I cover the bare wire with a braided fiberglass sheathing; this material is able to withstand high temperatures while being a relatively good thermal conductor.

I chose an 18AWG nichrome wire from Remington, with a resistivity of 0.4 ohms/foot.

For safety reasons, I power the system from a 24-VDC supply; any line voltage (110VAC) connections are confined to an electrical box. A pulse-width modulation (PWM) scheme is used, in which the DC supply is switched on and off at about 1kHz, and the exact amount of power delivered to the heating wires is controlled by the processor by varying the duty cycle (width) of the pulses. The basic electrical schematic is shown here (drawn using LTspice):

The processor controls the heat by applying the PWM switching signal from a GPIO output (represented by source V2) to the base of the NPN transistor; the collector drives the gate of a high-power P-channel MOSFET, which alternately connects and disconnects the 24V power (V1) and the heater wire R1; and R2 is a current sensing resistor (not used yet).

The heating wire used in Epiphyte will be about 6 feet long, arranged in a zig-zag pattern across each face of the sorbent, as pictured here:

With the above information, we can calculate the maximum power available from the heating wires as

P = V^2 / R = (24V)^2 / (0.4 ohms/foot * 6 foot) = 240W

which will be reduced in practice proportionally to the duty cycle applied.

Construction of the Heater Prototype
To replicate the actual arrangement that will be used in Epiphyte, I built a rough prototype of the heater on a piece of plywood, using the same amount of wire, and not in contact with the wood. Note the two themocouples that will be used in testing.

The box containing two standard 24VDC, 12A supplies is shown here before installing the lid:

The complete setup, including the processor and the electronics described above, is shown here:

An oscilloscope view of the waveforms is shown. The top trace shows the control signal from the processor, at 2V/division; this is a standard 3.3-V GPIO output. The bottom trace is the voltage across the heating wire, at 5V/div.


The measurements consist of operating the heating system with a specified duty cycle (10%, 20%, 30%, and 40%) and logging the temperature as it rises from ambient. Thermocouples are placed at two points: in contact with the bare wire (but insulated electrically with Kapton tape); and on the outside of the sheathing. The chart shows the results of the four cases, where we can see the temperature ramping up until it levels off at a maximum value; for each case, the upper trace represents the bare wire measurement, the lower trace is the temperature on the outside of the sheathing. Note: I didn’t go beyond 40% because I didn’t want to start a fire!


The shape of the curves looks well-behaved and should be easy to model theoretically for designing the temperature control algorithm. Clearly the specific results will be different in the actual system owing to the presence of the sorbent, frame, and metal elements, so the same measurement will need to be repeated after installation. However, the current data is useful for suggesting ideas for the algorithm, which will probably be a software PID control system with continuous temperature measurements for feedback.

The temperature drop through the fiberglass sheathing is an unfortunate inefficiency, and we need to reconsider the use of it in favor of a better heat-conductive high-temperature insulator.

Testing Sorbent Heaters IN Epiphyte: Results

This is a followup to the previous testing with the heater prototype. In this case, I used the actual heating system that has been built into the Epiphyte Sorbent Panel. This system consists of a pair of Nichrome heating wires, each with a total length of about 65 inches, zig-zaged across each outer surface of the sorbent.

One of the wires can be seen in this picture, taken before the sorbent was poured into the well on top of the wire.

Thermocouples were attached to the heater wires at several locations, and two more were embedded in the middle of the sorbent. Although ideally the embedded thermocouples were intended to be located right in the center of the sorbent, these sensors in practice had to be left to float in the sorbent, so there’s no guarantee they were still dead center after the panel was installed in the system and the testing had begun.

The entire sorbent panel (2 ft. square, with an 8-inch square sorbent container in the middle) was installed in the Epiphyte plenum.

Since we don’t have a proper hole drilled in the faceplate yet, I had to route the wires through the gap between the faceplate and the plenum opening, so it didn’t close completely. Since we are not testing CO2 capture yet, that doesn’t really matter.

Test Procedure

The heating system is under the control of the processor, with a PC as the user interface. There is also a small optical panel for moment-by-moment monitoring of the temperatures, but all the data was captured by the PC and stored in a file for plotting and analysis.

Three tests were done: (I) Only Heater 1 activated; (II) Only Heater 2 activated; (III) Both heaters activated. In each case, the heaters were driven with a PWM control waveform (see post above for more information) at 1kHz and 80% duty cycle. During each test, thermocouples on each wire and in the middle of the sorbent were read at 5-second intervals.

After the wire temperature reached 150C, power to the heater(s) was shut off and the system was allowed to cool, with or without the fan.

For Case I, Heater 1 was active. After the heater was turned off, the system was allowed to cool for a few minutes, then the fan was turned on at speed level 3 to finish cooling faster. Results are plotted here:

Some interesting observations are immediately apparent. Compared to the earlier testing with the prototype heater operating in open air, the heaters in the system took much longer to heat up. This is likely due to absorption of the heat by the sorbent, combined with a (parasitic) absorption by the metal mesh, grid, and frame of the panel. This latter effect is important to keep in mind when designing the next system, as it affects the efficiency.

The other observation is that the sorbent heats up much more slowly than the wire. This is evidently due to a combination of the material’s heat capacity and relatively low heat conduction. In order for the sorbent to reach and maintain a high-enough temperature for desorption, the heater would have to be on for longer, but a more sophisticated control system is required to allow the wire temperature to reach a maximum safe temperature and then stay there while the sorbent heats.

Case II is shown here, with only Heater 2 on; in this and the following case, the fan was turned on as soon as the heater was turned off, which is why the time scale of this graph is shorter than the first:

This result is qualitatively different from Case I. Although the active wire behaves similarly, the sorbent heats much more slowly, and in fact its temperature stays very close to that of the inactive heater wire. My guess is that the sorbent thermocouple has shifted so that it is much closer to heater wire 1 than to wire 2; but the only way to verify this would be to painfully disassemble the whole panel and rebuild it.

In Case III, both heaters are on:

It can be observed that the sorbent heats somewhat faster than in Case I but not as fast as might be expected for double the heating power; this appears to be more evidence that the sensor is not ideally located.

Next Steps

The next step is to modify the control software to heat the sorbent to its desorption range (100-120C) in a controlled and efficient manner without exceeding a safe temperature anywhere. This will likely entail a software PID controller; and the different time scales for the heater wire compared to the sorbent would indicate the need for a cascade control design.

In my experiences with PID controlling in recent Biochar work, I found that the D-derivative aspect of PID control in these heating applications can be ignored so that is a little easier maybe. I saw that there were some PID-control libraries for arduino, but I could not make them work for me (inexperience may have played a part), but on the other hand the coding to incorporate PID control directly in my own code was relatively straightforward.

Given a setpoint temperature, you choose a heater duty cycle that will vary from some maximum which you have already determined, I think, to a progressively lower duty proportional to the error between setpoint and actual temperature. This gradually reduces the duty cycle to a point where the setpoint can never be attained (heating rate eventually matches heat loss).

Tracking the sum of error x time over many controller cycles gives you a weighting factor for applying some additional heat even when proportional response is insufficient. I found that integral response needed to look back only a relatively short time - a few minutes at most, and I think you will be in a similar situation since the thermal response after heater disconnect is in this time interval (I capped integral response factor at 2 minutes x 100 degrees of error - somewhat arbitrarily; your temperature error magnitude is less, so you may want an even smaller cap) If you have a longer integral span, the response factor builds up to a large value (due to early operation large error magnitude) before the proportional response has time to do the heavy-lifting part of the controller response. As a result, the controller overshoots the setpoint and it takes a long time for the response factor to regularize. Differential control would only come into play if there were ways for temperature to change rapidly, but I think that can’t really happen in this case.

Cade, thank you for the advice! I’ve decided not to use the Arduino PID libraries that I have found, partly because it seems to be easier to just roll my own custom functions. I will likely implement the equations provided in this exhaustive Wikipedia article, particularly this section.
I will include the derivative terms because it’s simple enough to leave them in, but for now I will just leave the user-selectable D term to zero.

just be prepared to limit the Ki-containing term. During the ramp-up to steady-state, that term gets large, but it can’t get small again without a long time passing, because even if you pass the setpoint, you won’t pass it by tens of degrees, so the error x time on the high side takes lots of time to balance the early low-side error, unless you constrain it.

1 Like

I managed to make the system behave pretty well by limiting the integral term to values that would keep the resulting calculated duty cycle within the range from 0 to 95%. I also found by experimentation that including a small derivative term made the temperature more stable.

That looks good! reducing Ki a little might also work. Excellent control outcome!