The modular ECUs all have a built-in scope function. This is mainly to aid in diagnostics, but can also be used for tuning some functions which happen very quickly.
Firstly let’s have a bit of an introduction of what an oscilloscope is and how to use one, and then we can show some examples of applications that you can use it for.
In the olden days, it used to be called a CRO – Cathode Ray Oscilloscope, and this is what I grew up with when I was a little engineer. It usually has 2 channels, and basically gives you a graph of voltage against time for each of the two channels. Each channel has a probe, and you attach the probe to the voltage that you want to measure. Because the tool can be used for a wide range of applications, from milliVolts to hundreds of Volts, you need to be able to adjust the vertical scale. Similarly because you may be watching things that happen in very short time domains, for example microseconds, out to very slow events which happen over a period of hundreds of milliseconds, you need a way to adjust the time scale.
Traditionally the screen has been divided up into a 10 x 10 grid. The vertical scale can be adjusted and is measured in Volts per division. For example if you set the vertical scale of a channel to 1V/div and you see a waveform that’s 1 division high, that means the peak to peak amplitude of the waveform is 1V, and the maximum range you can measure is 10V. The timebase is also measured in time per division, for example if a pulse is 2 divisions wide and your timebase is set to 1ms/div, then the pulse is 2ms in duration. In case you’ve ever wondered, this is why people talk about the duration of a pulse being a “pulse width” – obviously it’s the duration of the pulse, but when you look at it on a scope, the width of the pulse on the screen tells you how long it lasts. So it’s a bit of a silly term but our industry is full of those.
In our ECUs, because the scope is not electrical but done in programming instead, you can look at any variable in the ECU, not just voltages of the trigger inputs or some other predefined functions. We also support 4 channels, which can be useful to capture and watch certain things happening.
Let’s do a quick example, which is probably the most common one that people will use the scope for. Let’s use the scope to look at the crank and cam input waveforms during cranking, of a real engine.
Firstly we’ll set the channels so we’re looking at the CAS1 voltage and CAS2 voltage. We’ll also watch the RPM, and a fourth channel we’ll watch is the current engine angle. This is a variable which the ECU uses to remember where the engine is up to in its rotation; zero is defined as TDC cylinder 1 ignition, and it has the range of -360 to +360 (being measured in degrees). As the engine rotates, the number increases, so you can consider it to be the angle ATDC of cylinder 1. We’re going to watch while the engine is cranking, so we’ll want the waveform to fill the screen. Engines normally crank around 180 – 240 RPM. 180 RPM means 3 revolutions per second, which means that 2 crank revolutions (ie 1 cam revolution) would take up to 700 ms. So we’ll set the timebase to 100ms / division, and that way a full screen of data will correspond to 1 second of time.
If you set the triggering mode to “auto”, the scope will be constantly triggering so it will just continue to update with new data. I’ll explain how to set the scope to trigger later. Make sure the “pause” is turned off.
In this case we’ve set CAS1 and CAS2 to be 5/division, which means 5 Volt per division, and the current engine angle to 100/division which means 100 degrees per division. Therefore the current engine angle should move over a range from -3.6 to +3.6 divisions.
Thanks by the way to Shawn Christenson from Turbosource for this scope picture.
If you haven’t seen reluctor waveforms on a scope before, here’s what they look like. The voltage goes positive as the tooth comes closer to the sensor, and then it falls through zero. When the tooth is in the middle of the sensor is when the voltage is actually at zero. Then as the tooth goes away from the sensor, the voltage is negative, and slowly climbs back to zero. So the first useful application of the built-in scope is to confirm if the sensors are connected with the correct polarity; if the positive and negative are reversed, this waveform will appear upside down.
For this reason, the reset event, which is the single tooth on the cam, is timed to happen almost mid-way between crank trigger teeth on the factory system, because this gives the most scope for timing belt slap or stretch, wear, adjustable cam gears and so on. If the reset event happens mid way between the crank trigger events, which happen every 30 crank degrees, then the cam has to move by 15 crank degrees before there’s a problem.
You can see on this scope waveform that the negative zero crossing of the cam trigger does occur approximately mid-way between the negative zero crossings of the crank trigger, so this is how you know the polarity on the crank trigger is correct. If the polarity of the crank was inverted, then the waveform would be upside down, and the negative zero crossing of the cam would happen at about the same time as on the crank trigger. This means that the cam would only need to move slightly one way or the other to change the order of events, and for the timing to skip by 30 degrees.
On VVT engines, the intake cam normally moves by much more than 30 degrees, which means that you can’t have such a trigger setup on a VVT engine. Usually a VVT engine has a missing tooth on the crank, which we’ll come to shortly, or a much lower tooth count on the crank trigger.
Another thing is that because the reluctor sensor generates a voltage proportional to the engine speed, it means that you can’t see the tooth at all if the engine is stopped. That means you can’t count the teeth on a crank trigger by turning the engine over by hand with a reluctor trigger. It also means that looking at the scope picture, you can see when the engine speeds up and slows down by the amplitude of the signal. For example during cranking, the engine slows down as each cylinder gets to the end of its compression stroke. Therefore a 6 cylinder engine which is cranking with good compression will show 6 little humps in the waveform over a 720 degree cycle.
If you just wanted to see something that’s free-running, then that’s pretty much all you need to know. However in other cases you’ll want to trigger the scope off a particular event to look for something happening. For example, if you want to see the intake cam angle change when you move the VVT, you would want to trigger the scope so that the waveform stays relatively still on the screen. To trigger the scope in the normal way, you need to pick a variable which will be used to trigger the scope. If you’re trying to watch engine synchronous events, the best one to use is the “current engine angle”, which as we said before is zero at TDC cylinder 1 ignition. So if you select the trigger mode as normal, rising, set the trigger source to current engine angle and the threshold to zero, then the trigger point, which by default is in the middle of the screen horizontally, represents TDC cylinder 1 ignition.
You can move the trigger point side to side – for example if you want to see what happens after a trigger then you would want it at the left.
One example of this would be triggering off pedal position to see how quickly the electronic throttle and manifold pressure readings respond. If you want to see what happens before the trigger event, then you would need to put the trigger point towards the right of the screen. An example of this would be a trigger error detection.
Let’s look at a common VVT engine; in this case the Toyota 2JZ. The trigger pattern is different from the non-VVT version of the same engine; as I mentioned before, you can’t have a crank tooth every 30 degrees and a single tooth reset on the cam with a VVT engine, because such a system would only be tolerant of a maximum of 30 degrees of cam movement, allowing zero margin for error. So the way Toyota got around this was to use a missing tooth system on the crank, which is 36-2, or 36 teeth with 2 missing. So each tooth spacing is 10 degrees, with a gap of 30 degrees at one point in the engine revolution.
During the missing tooth gap, the voltage should rise up through zero, because falling through zero indicates the presence of a tooth. So with the built-in scope, you can check that this is correct. If the waveform is inverted, then it means your polarity on the crank sensor is incorrect.
Secondly you can see the teeth on the cam trigger still generate a pulse that goes positive, then down through zero and the back up to zero from the negative side. But in this case there are 3 pulses per cam revolution rather than 1.
This picture, thank you again to Shawn from Turbosource, shows what you can see from a built in scope when a trigger is incorrectly configured. This is what happens when you have a non-VVT 2JZ trigger configuration in the ECU, but the engine itself is a 2JZ VVTI. You can see all sorts of things from this scope picture. So I’ll point these out; they are in no particular order.
Firstly, you can see one thing I mentioned earlier which is that the amplitude of the waveform tells you how fast the engine is spinning. You would probably know if you’ve tried this before that if you fire the ignition at the wrong time in the cycle during cranking, you can really slow down or even stall the starter motor, and this is what we see at this point in the cycle. We see firstly that the amplitude decreases, and also the time between each tooth increases at the lower speed, as we’d expect.
This section is where the missing tooth is, and you can see that although there’s a gap in the teeth, it’s not due to the engine suddenly slowing down here because the ampliture is somewhat consistent. You can also see that because the voltage rises through the missing tooth gap, the polarity is correct.
The third thing we’re going to look at is the current engine angle. We know that the non-VVT engine has 12 teeth on the crank, no missing, so the angle increment or tooth spacing is 30 degrees. On the VVT engine, it’s a 36-2 so the tooth spacing is 10 degrees. The current engine angle is set to a scale of 100 degrees per division, so 30 degrees is about a third of a division. The fact that the engine angle jumps by about 30 degrees with every crank tooth instead of every 10 degrees should be one clue that the trigger settings are wrong.
The other thing about the non-VVT engine is that the tooth on the cam tells the ECU that the next crank tooth is at 5 degrees BTDC. We have a cam tooth for every 24 crank teeth on the non-VVT engine. The VVT engine has 3 teeth on the cam, and if your mental arithmetic is good you’ll realise that that also means that we have a cam tooth for every 24 crank teeth, except for when there’s a missing tooth. So if we didn’t have the missing tooth, the current engine angle staircase would be continuous – but the RPM would be indicated as three times the correct value.
We can see however that there’s a jump in the engine angle every time there’s a missing tooth, because the ECU isn’t looking for a missing tooth; it’s only looking for the cam reset. So the jump in the engine angle, which will also case an incremement of the trigger error counter, is a giveaway that we have the wrong ECU settings.
As well as the current engine angle, there are two more variables which are available to help with trigger debugging, both related to an internal function called the trigger error detector. I’ve described in trigger articles the way that the ECU tracks the current engine angle; you have a set of trigger events on the input with the most triggers, which is many cases is mounted on the crankshaft, and then either features on that for example missing teeth or different length teeth on the LS1, which are used as “resets” or absolute position fixes. There can also be triggers on other input channels which do the same thing. Now, once the ECU has synchronized to the engine, from that point on, if you get a reset event, that should just tell you what you already know. By that I mean that even if you don’t get a reset event, the next tooth should take you to the correct angle anyway, so long as you account for extra angles for missing teeth and so on. So what the ECU does is it calculates the position of the next tooth, assuming that we didn’t have the reset event, and subtracts from that the actual new angle as dictated by the reset event. That difference, or trigger angle error, should be zero all the time, except for when the ECU first synchronizes with the engine rotation during cranking. Any time it’s non-zero means that we have a jump in the engine angle, and that means a trigger error. If we do get a non-zero value, that causes a second variable called the trigger error counter, to increment – or count up by 1. When the engine is stopped, the trigger error counter is set to -1, which displays as a dash. Normally you’d get either 1 or 2 trigger errors during synchronization, so if the trigger error stays at 0 or 1 while the engine is running, that’s OK. But if it increases, or keeps increasing, then you know there’s a problem.
Because the trigger error counter increments when it finds the error, which could have occurred anywhere in the last 720 degrees, you can use this to trigger the built-in scope. If you then look at the current engine angle, CAS1 and CAS2 and maybe the trigger angle error on the scope then you can see the problem that caused it. For example if there’s an increase in the current engine angle and there’s no clean pulse then you know it was noise. If there’s a runt of a pulse but no increase in the engine angle then you know the sensor may just need a stronger pullup or something like that. Make sure you set the horizontal trigger position towards the right, eg +4 divisions, to give you the maximum useful width of the screen.
I mentioned before that the scope can be used to watch anything in the ECU, so I’m going to show you another example of the built-in scope. In this one I wanted to see how quickly the electronic throttle would move in response to the accelerator pedal input. So the channels I chose were the actual pedal position, the actual throttle position, the manifold pressure and engine speed, which is updated every crank revolution which is why it looks blocky. I wanted to see how the electronic throttle responded to a step change from 0% to 100% on the pedal, to see how quickly it responded and how long it took to go to wide open. So to see that, I set the trigger for the scope to be the pedal position. I set the timebase to 50ms per division because previously I’ve seen other electronic throttles take 100ms to go from idle to wide open. You can see in this graph that it takes me, the driver, about 50ms to get the pedal from fully up to fully down, and the throttle itself follows very quickly; it only lags the pedal position by about 25ms. So another use of this tool is for someone that complains about the lag inherent in electronic throttles, you can show them this and challenge them to move the pedal faster instead
Of course you could use this for all kinds of events; the main requirement is that you have some variable you can trigger off. You can use it for high speed events such as looking at when the async injection pulse is delivered relative to the throttle movement, or low speed events such as the idle dip / control in response to thermofan activity. It’s a very powerful tool, is much faster than logging data and reviewing and can be used for all sorts of applications.
Thank you and happy learning!