Integrating a Fan-Driven Smoke Unit with QSI DCC Decoders

I have come across QSI decoders for some O-Scale Sunset 3rd Rail (2-rail) locomotives, including the beautiful D&RGW L-105. QSI decoders produce fantastic sound and provide highly flexible control of locomotive behavior, but at the price of a steep learning curve.

During the dead-rail conversion of the L-105, I could not figure out initially how to integrate a fan-driven smoke unit with the QSI “Titan FX-DO” decoder found in the tender of the Sunset L-105. But the decoder’s sound was so good that I persisted in my research and finally came across Greg Elmassian’s excellent post on integrating fan-driven smoke units with the standard QSI “Titan” (but NOT the Titan FX-DO that I was dealing with) decoder, which gave me an excellent start. Still, it did not provide the entire solution.

This post will provide all the details of integrating a QSI Titan FX-DO decoder with a fan-driven smoke unit.

Background Information

For each of their decoders, QSI defines a large number of “Features” that are configured by “indexed CVs” that define the Feature’s behavior. Based on Elmassian’s post, the Firebox Feature (F=122) controls the Smoke Unit Fan, and Rear Cab Lights Feature (F=118) controls the Smoke Unit Heater. 

The specifics of Feature F‘s behavior are defined by several “characteristics” or “attributes” (A=0, 1, etc.), such as maximum output, output duration, etc., that are given specific values V via CV 55.F.A = V.

QSI also defines several “Port numbers” P as fixed outputs on the decoder that control physical devices such as lights and our Smoke Unit. To tie all of this together, QSI then “maps” a Feature F to a Port P to convey the Feature’s behavior (via the values V of its attributes A) to a physical device using CV 115.F.0 = P. The Firebox Feature (Fan) F=122 will be “mapped” to output Port 9, and the Rear Cab Lights Feature (Heater) F=118 will be “mapped” to output Port 12.

I will NOT discuss how to set or reset the configuration variables (CV) of a QSI decoder with the Quantum Programmer. These details can be found in the documents here!

I strongly urge you to familiarize yourself with the QSI decoder’s QSI DCC Manual. Greg Elmassian’s site is also essential for understanding some features of QSI decoders that are confusing or not mentioned in the official documentation. Greg’s site is extensive, so use the site’s navigation features to find helpful information on QSI decoders. This site also provides essential information on how to program QSI decoders. These decoders are highly flexible: they produce fantastic sound and offer an extensive range of locomotive behavior control. But configuring them is complex. 

In summary:

  • CV 115.F.0  = P: Map Feature F to Port P
  • CV 55.F.A = V: For Feature F, set Attribute A to Value V

Initial Review

Warning: this section is somewhat technical, and you can skip down to the section on Decoder Programming.

The initial connections for the FX-DO decoder found in the L-105 are shown below.

The original FX-DO pinouts with future expansion for the fan-driven smoke unit

I also noticed the decoder had a “SMOKE” plug (see photo below). How do I use it?

View showing the FX-DO’s smoke plug

I connected the smoke unit’s heater to this plug. The sound came on as expected upon initial power-up, but no power was applied to the smoke unit’s heater. Disappointing.

While fiddling around some more, I quickly toggled the track power off and back on – wonder of wonders, the heater fully activated, and it was boiling! None of the information I could find discussed this method for activating a smoke unit’s heater in this fashion – it was just serendipity that I discovered this Feature.

Next are photos showing how I tracked down the connections that would control the output from this “SMOKE” plug.

First, I looked at what connects to the SMOKE plug’s “-” and “+”. The photo below shows that SMOKE “-” connects to the Rectifier’s “-“, which acts as a ground, and power transistor Q7’s drain D7 connects to the SMOKE “+”. The transistor’s source S7 connects to the Rectifier “+”, a high-power DC voltage source.

Q7’s gate G7 “opens”/”closes” source S7 (powered by Rectifier +) that sends current to drain D7, which is directly connected to Smoke +.

What control’s this power transistor’s gate G7? A bottom view of the same board reveals that Q7’s gate G7 is directly connected to transistor Q15’s collector C15. This transistor’s emitter E15 connects to a resistor R12 connected to the “ground” provided by the Rectifier “-” and Q15’s base B15 controls whether collector C15’s voltage is shorted to the Ground through emitter E15 or acts as an open circuit; i.e., this is a low-power switch controlling the turn on/turn off of the power transistor Q7.

Q15’s base B15 “opens”/”closes” emitter E15 that sends current through collector C15, which is directly connected to Q7’s G7 (photo above).

What controls Q15’s base B15? The photo below shows part of the surprising answer that a pin on the top board is directly connected to Q15’s base B15. There might be other electronics that set the voltage on base B15 (and this pin), and this pin did not seem to be connected to anything else on the top of the board.

The top board shows a pin’s connection to transistor Q15’s base B15, which turns on/off the smoke unit’s heater.

At this point, I verified that after the decoder was turned off for an extended period and then turned back on, the smoke unit’s heater was off, and the voltage on this newly-discovered pin was held at ground voltage. Quickly toggling DCC power to the decoder off and back on revealed the voltage on the pin was 5V, and the smoke unit’s heater was on. Something in the rest of the electronics was setting this voltage, almost surely through a “pull-up” resistor, connecting Q15’s base B15 to a switched 5V/ground source that the decoder was controlling – I didn’t find it.

And, when I shorted this pin (and Q15’s base B15) to the Ground, the smoke unit would turn off! No harm, no foul if I ground/unground this pin to turn the smoke unit’s heater off/on. Now we can control how long the smoke unit’s heater is on and off!

For reference, the figure below is a guess at the QSI Titan FX-DO’s smoke unit heater control electronics. This guess circuit satisfies the requirement it reproduces in simulation the results I have measured, as shown in the next section.

QSI Titan FX-DO smoke unit heater control electronics

Next, we program the decoder to control the turning on/off of this newly-found heater switch.

Decoder Programming

Following Greg Elmassian’s superb post, I reprogrammed the Titan FX-DO as follows to activate the decoder’s outputs (called ports) that will ultimately be physically connected to wiring that controls the power to the smoke unit’s heater and fan:

Fan: Feature: F=122 (Firebox), Port: P=9

  • CV115.122.0 = 9 (Default: 9): Map Feature F=122 (Firebox) to Port P=9
  • CV55.122.11 = 100 (Default: 0): For Feature F=122, set Min Attribute A=11 to Value V=100. Tune this. Chuffing is less evident if this value is too large, and the fan will not spin if this value is too small.
  • CV55.122.12 = 255 (Default: 255): For Feature F=122, set Max Attribute A=12 to Value V=255.
  • CV55.122.13 = 100 (Default: 0): For Feature F=122, set Mid Attribute A=12 to Value V=100. Tune this. Chuffing is less evident if this value is too large, and the fan will not spin if this value is too small.
  • CV55.122.17 = 1 (Default: 1): For Feature F=122, set Rise Time Attribute A=17 to Value V=1. Tune this.
  • CV55.122.18 = 22 (Default: 1): For Feature F=122, set Fall Time Attribute A=18 to Value V=22. Tune this.

Heater: Feature: F=118 (Rear Cab Lights), Port: P=12. Several of the following CV values are very important to set correctly. Otherwise, you might burn out the smoke unit! During testing, please ensure sufficient smoke fluid is loaded into the smoke unit and be prepared to turn off power to the locomotive quickly should the smoke unit get too hot and produce excessive Smoke!

  • CV115.118.0  = 12 (Default: 12): Map Feature F=118 (Rear Cab Lights) to  Port P=12
  • IMPORTANT!!! CV55.118.0 = 1 (Default: 0): For Feature F=118, set Rear Cab Lights Initial State Attribute A=0 to Value V=1: activate Feature. This setting was NOT discussed in Elmassian’s post. You want the modulation function ON at startup to prevent smoke unit heater burn-out.
  • CV55.118.1 = 85 (Default: 85): For Feature F=118, set Active Conditions Attribute A=1 to Value V=85: active for all conditions: FOR; REV; Neutral From Forward, NFF; and Neutral From Reverse, NFR
  • IMPORTANT!!! CV55.118.12 = 200 (Default: 255): For Feature F=118, set Max Attribute A=12 to Value V=200. A value of 255 fully turns the heater OFF, and a value of 0 fully turns the heater on! It is essential to tune this value to prevent burn-out of the Smoke Unit Heater!!! See the calculation in the section below.
  • IMPORTANT!!! CV55.138.2=253. The indexed CV55.138.2=Value sets the “Multiple Automatic Lights #3” controlled by the same function key, which by default is F12. When Value=253=1111101b, the Firebox (=> Fan, Feature F=122) is controlled by F12 (bit 4=1 of Value), but the Rear Cab Lights (=> Heater, Feature F=118) have no F# control (bit 1 = 0 of Value). This prevents the turn-off of the smoke unit’s heater modulation, preventing burn-out. This table from the QSI DCC Manual shows which bits activate which Feature.

The upshot is that F12 activates the smoke unit fan, and the power to the smoke unit heater is ALWAYS modulated to prevent burn-out.

Now that we have programmed the decoder’s control for the smoke unit’s fan and heater, we need to connect these decoder outputs to the rest of the circuitry on the decoder.

Decoder Board Modifications

With the proper decoder output ports L12 (for the heater) and L9 (for the fan) properly configured, the photo below shows the simple wiring connections from these two ports to physically control the smoke unit’s fan and heater.

Modifications to the decoder’s top board to control the smoke unit’s heater and fan

The top board’s physical modifications were the following:

  • Added a wire (Brown) connecting Port 12 (sometimes designated L12) to the pin indicated in the photo above. This allows L12 via Feature 118 (Rear Cabin Light) to modulate the voltage applied to the smoke unit’s heater. The smoke unit heater is activated by powering off and quickly back on: I have never seen this Feature discussed.
  • Spliced +5V (Purple wire) to the smoke unit’s Fan “+” (Blue wire), and added a wire (Grey) connecting Port 9 (sometimes designated L9) to the smoke unit’s Fan “-“. This allows L9 to modulate the power applied to the Smoke Unit Fan via Feature 122 (Firebox).
  • Note that the smoke unit’s heater is already connected to the SMOKE plug.

I think you will agree that these modifications are easy!

Tuning for a Particular Smoke Unit

For my testing, I used a small MTH smoke unit with a heater resistor value of 8 ohms. The rectified track voltage is about 14.8V (about the battery voltage I use for my dead-rail applications). Experience indicates that good smoke output requires about 6 W. A value CV 55.118.12 = 0 will deliver full power to the heater: (14.8V*14.8V)/(8ohms) = 27.4W, which is far too high. We fix this problem by reducing the percentage of time the power is ON to the smoke unit heater.

Typically, decoders do this by repeatedly fully turning ON the device, such as a light, for a short period by actively connecting the “-” of the device to the Ground and allowing current to flow, and then turning the device OFF by open circuiting the device’s “-” to prevent current flow for a short period. This scheme is called Pulse Width Modulation (PWM), and the percentage of time the device is fully ON (grounding) is called the Duty Cycle (D). A decoder’s CV value of 255 corresponds to a duty cycle of D=100%, 128 corresponds to about D=50% (really 128/255), etc.; i.e., D=(CV_Value)/255.

The next part is a little confusing. If the decoder’s heater control (L12) is ON (grounding), then our smoke unit heater is turned off OFF. When the decoder’s control (L12) is OFF (open-circuit), other electronics in the QSI decoder “take over” and pull the heater’s control voltage ON (+5V), turning ON the heater! So if the duty cycle of the decoder’s control (L12) is D (percentage of time it GROUNDS), the duty cycle of the smoke unit’s heater Dheater = (1-D) = (1-CV_Value/255) = (255-CV_Value)/255.

Relationship between the decoder heater control (L12) duty cycle, D, and the heater’s duty cycle, Dheater. The measurement point is at the pin connected to decoder port L12 by the Brown wire shown in a previous photo.

One of the simplicities of the Pulse Width Modulation (PWM) delivered by DCC decoders to modulate power to lights, smoke units, and other devices is that the average power delivered, designated Pavg, is equal to the maximum power, Pmax, times the “duty cycle.” For our smoke unit heater Pavg = Pmax * Dheater = Pmax * (1-D) = Pmax * (255-CV_Value)/255.

So let’s determine the value of CV 55.118.12, which ranges from 0 (D=0% -> Dheater=100%) to 255 (D=100% -> Dheater=0%) to produce a “safe” average power of 6W.

  • Average Power: Pavg – example: Pavg=6W. I don’t recommend much more than this value.
  • Track/Battery Voltage: Vmax – example: 14.8V. This value is typical of DCC command stations and “4s” (4 cells in series) LiPo batteries.
  • Heater Resistance: R – smoke unit’s resistance generally ranges from 8 to 27 ohms. My MTH smoke unit’s heater resistance is 8 ohms. Some Lionel smoke unit heaters have a resistance as high as 27 ohms.
  • Maximum Power: Pmax – the maximum power that can be delivered to the heater by track/battery voltage. Pmax = Vmax * Imax = Vmax * (Vmax/R) = (Vmax*Vmax)/R.

Using ohms law for a resistor I=V/R and how CV_Value corresponds to duty cycle D=(CV_value)/255, the average power is Pavg = Pmax * Dheater = Pmax * (1-D) = (Vmax*Imax) * (1-D) = (Vmax*Vmax/R) * (255-CV_value)/255. Rearranging the deck chairs to solve for CV_Value: (255-CV_Value) =(Pavg*R*255)/(Vmax*Vmax) or CV_Value = 255*(1-(Pavg*R)/(Vmax*Vmax)).

For our example CV_Value = 255*(1 – (6W*8ohm)/(14.8V*14.8V) ) = 200; i.e., CV55.118.12 = 200. You can, of course, tune this value should the smoke unit produce too much or too little Smoke. Please ensure the smoke unit is properly loaded with smoke fluid before testing.

Just remember that CV55.118.12=255 fully turns OFF the smoke unit heater, and CV55.118.12=0 fully turns it ON.

Addendum: Using an Inverter to Control the Smoke Unit Heater

One of the defects of directly connecting the output of L12 to the pin connecting to Q15’s gate G15 is control is inverting: when the decoder turns OFF the heater control, the heater is ON, and vice versa. We can fix this problem by using a small, 3-component transistor inverter as shown below.

The inverter circuit provides non-inverting control of the smoke unit heater.

With the inverter, there is no longer the possibility of burning the heater out should the decoder’s L12 control be OFF.

New settings with the inverter:

  • CV55.118.0 = 0 (Default: 0): For Feature F=118, set Rear Cab Lights Initial State Attribute A=0 to Value V=0: Feature NOT active at start-up. When the controlling port (L12) is OFF, the inverter keeps the heater OFF. 
  • CV55.118.12 = 55 (Default: 255): For Feature F=118, set Max Attribute A=12 to Value V=5. A value of 0 fully turns the heater OFF, and a value of 255 fully turns the heater on! It is essential to tune this value to prevent burn-out of the Smoke Unit Heater! The inverter now matches the duty cycle of the controlling port L12.
  • CV55.138.2=255. The indexed CV55.138.2=Value sets the “Multiple Automatic Lights #3” controlled by the same function key, which by default is F12. When Value=255=1111111b, the Firebox (=> Fan, Feature F=122) is controlled by F12 (bit 4=1 of Value), and the Rear Cab Lights (=> Heater, Feature F=118) is also controlled by F12 (bit 1 = 1 of Value). The inverter now allows us to turn ON/OFF the heater with L12 because port L12’s OFF state turns the heater OFF.
Using an inverter now allows non-inverting control of the smoke unit heater.


Below is the “proof-in-the-pudding” video. Track DCC was on (no smoke) while moving backward, and after stopping, quickly toggled off/on to activate the smoke unit. F12 was on to activate the fan.

Preliminary demo showing a QSI FX-DO decoder interfaced with a fan-driven smoke unit
Final demo showing a QSI FX-DO decoder interfaced with a fan-driven smoke unit


This is a difficult and technical post, but if you want to use a fan-driven smoke unit with a QSI Titan FX-DO decoder found in some Sunset 3rd Rail 2-rail locomotives, I think you will be rewarded with an excellent decoder to control your locomotive!