top of page


This is a short collection of random information regarding aftermarket WB sensors that I find myself discussing on a regular basis. Much of it will be pretty universal, but some is DSM specific. This is all based on my own experience using typical aftermarket WB O2 sensor kits since about 2001 and may differ from other people's experience.


Common problems when using the stock ECU and ECMlink

The most common issue that comes up is being able to log the correct values in ECMlink (a discrepancy between displayed AFR and logged AFR). This is most prevalent with the older AEM gauge style wideband units and certain ECU inputs (1g EGR Temp for example). The main issue is that the output drivers are often too weak to drive the input, or just not putting out the voltage they should be. If the whole output scale is just shifted evenly across the board, LinWB settings can sometimes correct for it. This requires the error to still leave the output linear, of course, since it's LinearWB afterall. If the error is non-linear, LinWB can not be expected to fix it. This is the key point, since many people seem to believe LinWB can fix all problems.

If the problem is a weak output, it won't properly drive some ECU inputs, like the 1g ECU's EGR Temp input. When this happens, output values near zero won't be logged correctly. You'll see voltage bottom out just under 1v, or around 11.5:1-12.0:1 AFR. There is some misconception about this on the internets. LinWB simply can not correct this problem, because the voltages for AFRs below that lower limit can not be achieved. In most cases it will still read correctly down to that value and no LinWB correction is needed. You just can't read richer than that 11-11.5 value. In some cases I've seen this problem COMBINED with the shifted output problem. In that case LinWB can correct the shift in the reading, but you're still limited to the 11.0-11.5:1 reading. If the output is still linear but shifted by ground offsets LinWB can be used to dial it in, but it's still best practice to fix the problem with the ground offset instead. More on this below.

ECMtuning used to sell an input buffer to correct this problem with weak output signals, but they are no longer available.


Ground Offsets

The single biggest cause of a shift in logged AFR values is a ground offset on the signal. The WB controller has one ground reference, the ECU has a different ground reference, and therefore they will read the same signal differently, which is a problem.

  • The easier way to correct this is to simply ground the WB controller at the same bolt the ECU is grounded to. This solves the vast majority of this offset for the least effort. 

  • The more elegant way to correct it is to use a wideband that has a differential output. This includes a signal + and a signal -. If you tie the signal - to the ECU's signal ground, it forces the ground reference of the WB controller to match that of the ECU and corrects all issues related to ground offsets. Not many WBs offer this. The original NGK AFX, now the Ballenger Motorsports AFM500 (both made by ECM), and the Tech Edge units are the first that come to mind. (You do NOT want to tie the WB's main ground to the ECU's sensor ground, the heater circuit will put too much load on the sensor ground circuit, which we don't want). 


Other WB Options

The newer AEM stuff, like the X Series gauge style wideband and the 4 channel wideband don't seem to suffer from the weak output issue like the older gauge style units did. 

The original NGK AFX, now available in updated form the Ballenger Motorsports AFR500v2, is the best wideband I've ever used in the usual enthusiast price range. They are made by ECM, the well recognized leader in exhaust O2 analysis equipment. The newer version of the NGK AFX is not made by ECM. When NGK switched to the newer design, BMS enlisted ECM to improve on and continue making this unit. ECM makes some serious lab grade equipment, and is used by the major auto OEMs and in all kinds of industrial and laboratory applications. To be able to get an affordable unit from this company is really a good thing. Even their lower end units like those available from BMS are exceptional, and can also make use of some nice lab grade sensors if you have the need. The AFR1000/1500 are the next step up ($1500-1900) for portable or dyno use, and the Lambda Pro is the go to unit for a lot of high end dyno shops ($3500, and still portable). For models above that, you can say things are getting pretty serious (not a bad way to spend 10 grand). These units have differential outputs and log perfectly in ECMlink. 

Tech Edge is another brand I've had great luck with over the last ~16 years. They are in Australia, so shipping and the exchange rate can be a problem for those of us in the US. But they're worth mentioning. They also offer differential outputs and log perfectly in ECMlink, and are just high quality units in general. With more readily available options in the same price range (like the BMS AFM500), they're not as popular as they were in the early 2000s when there weren't really any good alternatives. But still a great choice if one of their models catches your eye. 

Most of the other "budget" WB brands have given me enough issues that I simply avoid them. Sure, there are a couple nice products here and there, but it's not worth picking through all the shit to find the good ones. People tend to have their favorites and their horror stories across all of them. Most people have only used one or two WB kits and don't necessarily get the whole picture over time. If you've dealt with 100s of WB installations and tunes over a couple decades you likely have your own preferences here as well. Use whatever you like, as long as you're sure it works. 


Installation Considerations

Sensor location and installation is another thing to worry about. All of the major manufacturers give information on where and how to mount their sensors. I'm not going to recap all of that here, but in short, it's all about temperature exposure and keeping liquid water and fuel away from the heated sensor. Something that has worked very well for me over the years is to use the stainless steel AEM heat sink bungs in every sensor installation. It pulls the sensor back flush with the inside of the tube/pipe to keep it out of the hot exhaust, which prevents premature failure and false lean readings. This lets you run the sensor closer to the engine for quicker response (great for closed loop control) and to avoid the opposite issue of the sensor running too cool and stressing the heater circuit/controls, which also leads to premature failure. At about 10 bucks each, there's no good reason to not use them. These also let me run individual cylinder O2 sensors right off the head ports with no issues, despite the extreme exhaust gas temperature in this location. I've been using the same sensors for 3 seasons with no failures. 




















At this point it's worth mentioning that O2 sensors are pressure sensitive. All WBO2 kits are calibrated assuming a reasonable range of normal exhaust pressures. Outside of this range, the reading will be incorrect. In the case above the O2 sensors are seeing full turbine drive pressure, up to 90 psi on this car. The AEM 4 Channel WB kit has an option for a 0-100 psig pressure sensor to correct the readings automatically, which I make use of. Without this pressure correction the readings will be exaggerated. That is, richer than stoich readings will appear much richer, and leaner than stoich readings will appear much leaner. If you intend to read O2 upstream of the turbine, you need to account for both the increased temperature and the nonstandard pressure. If you can find the right datasheets for your specific sensor, you can often find the pressure correction equations, which could be used in a math channel in your ECU or logger, allowing you to use other WB kits in this way. 


There are a couple of other issues that can mess with O2 sensor readings. Most are related to atmospheric O2 dilution. Exhaust leaks upstream of or near the sensor can allow atmospheric O2 to be drawn in between pulses at low loads. Generally at higher loads (higher exhaust pressure) this isn't an issue. And actuation air leaks at the diaphragm (top port) or valve (bottom/side port) of a recirculated wastegate will also introduce O2 into the exhaust and cause a leaner than actual reading. These things can drive you nuts or result in a poor tune if they go undiagnosed. 


Do O2 sensors read oxygen or fuel?

O2 sensors primarily read oxygen, hence the name. The common situation where this comes up is during misfires. When an unburned mixture of fuel and air passes the sensor, some people think it will read rich due to all of that raw fuel, and it's understandable why they think this. But the O2 sensor will actually sense the oxygen instead and read lean. The sensor is much more sensitive to the oxygen than to the fuel. Over the last 5-10 years the internet has begun to understand this. 

Unfortunately, it has now lead to a new internet myth that O2 sensors don't read fuel at all. This, of course, cannot be the case. By definition, a mixture richer than stoich has no oxygen in it to measure. So how does the O2 sensor know just "how rich" a rich mixture is? With a rich mixture, oxygen from outside the sensor will move into the element to bring the mixture back to stoich. How much oxygen moves through the element is measured and is an indicator of how much excess fuel was in the exhaust. So it is still using oxygen to measure the fuel, but this is how it "senses" how rich a rich mixture is. 

If you're the type that likes to experiment, try the following. With a wideband sensor exposed to:

Free air: It will read max lean, as expected. 

Inert gas, such as Argon from a TIG torch: Most people think this will read full rich. In fact, it will read stoich. Of course, by definition, stoich means no excess fuel or oxygen is available, and an inert gas simulates this nicely. 


Hydrocarbon fuel, such as raw propane from a torch:  It will read full rich. It does indeed sense the fuel. 


Feel free to try it for yourself. There are plenty of good papers and manufacturer's literature out there explaining how these sensors work, but sometimes a simple experiment sums it up more easily.


Calibrating the logged value in ECMlink:

If you're running a WB that does not have a simple drop down option in ECMlink, or you just want to verify that your WB is logging correctly in the software for any reason, there are a couple of things you can do. Keep in mind that the whole point here is to ensure that the logged value in ECMlink is the same as the displayed value from the WB gauge/display. 

LinWB setup with known values:

To do a basic Linear Wideband setup, grab your documentation for your WB kit and find the table that shows AFR vs analog voltage output. To use the AEM X Series as an example (it does not have a drop down option in ECMlink, so you must use LinWB), minimum voltage is 0.5v, minimum lambda is .58, maximum voltage is 4.5v, maximum lambda is 1.23. This is straight from the table in the manual, shown here for reference. You can then verify this setup using the procedures below.  









Verifying logged values:

If your WB has the same AFR range for the display as it has for the 0-5v output (you'll have to check your WB kit's documentation), you can simply do the free air/propane test shown above to force the WB to full lean and full rich. Then, make sure the displayed value in ECMlink matches the gauge. If the two do not have the same range, you can't use this method, of course. You can however use this if you don't go full lean or full rich. Play with the propane torch a bit and get the AFR to something that is near the limit of the gauge, but still within range of the gauge (not maxed out). If you can get it to stay steady enough to verify, you can use this method. It probably only makes sense if the engine is not running yet. If it's too much of a moving target, and the car runs, move on to the next method.


Most WB kits will have a different range for the display and the analog 0-5v output. In these cases, or for a car already assembled and running, a simple method is as follows.

  1. Get the engine to a warm idle.

  2. Lock the ECU in Open Loop on the Misc tab.

  3. Make a note of your current Global Deadtime on the fuel tab.

  4. Adjust Global Deadtime for 14.7:1 AFR.

  5. With data streaming in the logger, be sure the displayed value matches the gauge/display. In open loop it will be a lot less jumpy than in closed loop, making it easier to verify that the displayed value in ECMlink reads the same as the gauge.

  6. Then, temporarily increase Global Deadtime until AFR is around 11.0. Note that you don't want to let the engine idle too long this rich. 30 seconds max perhaps. You're just trying to quickly verify that the displayed values matches the WB gauge/display. 

  7. Set Global Deadtime back to what it was when you started, and unlock open loop on the Misc tab. 


If things match up on both ends of that spectrum (14.7:1 and 11.0:1) you can be reasonably sure it will display correctly in actual logs. It's much easier to simulate WOT AFRs (~11.0:1) like this than it is to try to verify the displayed value matches the WB display while actually at WOT, of course. For a more robust test, check it every 0.5 AFR in between (see AEM non-linear issue section below).

If things don't match up, you'll have to make some adjustments and re-verify. If you're using a predetermined setup from the drop down options, you'll need to switch to Linear WB. If you're already using Linear WB, you're ready to make some adjustments. If the lower end is off, adjust the Min Lambda. If the upper end is off, adjust the Max Lambda. If you're able to get things all lined up at several AFR points, congrats, you can now trust your displayed values in the datalogs. 

If you can't get them to match up (AEM gauge style WB on 1g EGR Temp input, at very rich AFRs, is a common case), something may be wrong. Most reasons for this have already been covered on this page. You can attempt to find the cause of the problem, check the wiring as described, or switch to a WB kit that just works. It's worth the effort. AFR is a very important value in tuning, it's worth getting it right. If you simply try to correct for it at 11:1 and 14.7:1 as commonly suggested, you'll end up with an error across the whole AFR range (see later section on this). 


Setting up LinWB Properly:

The only proper use of LinWB is to set up a good but unknown (not a drop down option) WB kit that has a good linear analog output. It can also be used to correct for a ground offset, but this only works well if the offset is always there and never changes and the analog output is still linear. 

People will often set up their LinWB settings at idle, and with the logged value matching the WB gauge at idle, call it calibrated. This doesn't work of course. How far off is it at 11:1?  Could be a mile off, and this is a major problem in tuning. 

According to basic geometry, 2 points determine a line. Same goes for linear I/O. The preferences window for LinWB in ECMlink provides two voltage:AFR points for this reason. To correctly setup LinWB, choose two points to calibrate to, as far apart as possible. Using the procedure outlined above to briefly idle the engine at 11.0:1, and normal idle at 14.7:1, provides enough span to get a good result, and covers the range of operation that we are generally concerned with. If the WB gauge matches ECMlink at those two extremes, and we assume your WB kit's analog output is indeed linear, you're in good shape. 

Don't assume that the analog output covers the same range as the display either, that can really throw things off. It's best to choose actual operating AFRs. 

















Potential issues with trying to correct for a non-linear analog output with LinWB:

It's commonly believed that you can correct for the non-linear output problem with some AEM widebands on some cars (usually a 1g using the EGRtemp input). But let's take a look at what that does. We'll assume an AEM gauge with a 0-5v output that represents a 10.0-20.0 AFR range. In this example, the output won't log below 0.8v at the ECU. This is a fairly common value, but it does vary a little case to case.










In this chart you can see that output voltage is linear on the X axis, and AFR is on the Y axis. 

The blue line represents the AFR that the gauge will display. 

The yellow line is what you would see in the log with the AEM WB setup as normal. In this example, everything below 11.6:1 just reads as 11.6. The analog output voltage just won't go below 0.8 (in this example). This is a common problem. As you can see, it's not a straight line, it's non-linear. However, above that floor of 11.6 that it won't read below (in this example), it tracks the gauge correctly.

The green line shows what happens when you follow the many online tutorials for using LinWB to try to correct for this problem. You set the AFR to 11.0 temporarily at idle, it will read 0.8v (in this example), and you then call that your 11.0 Min voltage point. Then you do the same at 14.7 to set the high point.  What you get is an error introduced into the entire AFR range, as seen in the green line. At 11.0 and 14.7:1 on the gauge, the logger will match. Everywhere else, it's wrong. You would have to test multiple AFR points to spot the issue. Note that it still won't read below 11.0, since the analog voltage can not go lower than 0.8 (in this example), and you've set that as your 11.0 point. 

As you can see, this is not a good solution. Either keep it correct across the whole range but limited to 11.6:1 as the richest it will read (in this example), or get a WB that doesn't suck. 

bottom of page