<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BlownByTwins</title>
	<atom:link href="https://blownbytwins.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>https://blownbytwins.co.uk</link>
	<description>Just a tale of one man and his cars...</description>
	<lastBuildDate>Sat, 10 Oct 2026 10:40:22 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blownbytwins.co.uk/wp-content/uploads/2023/05/cropped-wp20128381-1-32x32.jpg</url>
	<title>BlownByTwins</title>
	<link>https://blownbytwins.co.uk</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Boost Control on the Emtron KV12: Where the Target Really Comes From</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/boost-control-emtron-kv12/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Sat, 17 Oct 2026 07:00:00 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[boost control]]></category>
		<category><![CDATA[emtron]]></category>
		<category><![CDATA[feedforward]]></category>
		<category><![CDATA[wastegate]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1208</guid>

					<description><![CDATA[<p>How boost is controlled on the Supra's Emtron KV12: a base table that never asks for boost, a user offset that does, a deliberate clamp, and a PID kept on a short lead so the feedforward does the work.</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/boost-control-emtron-kv12/">Boost Control on the Emtron KV12: Where the Target Really Comes From</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/boost-control-emtron-kv12/">Boost Control on the Emtron KV12: Where the Target Really Comes From</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">There is nothing exotic about the boost control on this car. It is Emtron&#8217;s standard closed loop strategy. SRD Tuning built the base, and I have refined the duty cycles from logs since.</p>



<p class="wp-block-paragraph">What is worth showing is how the pieces fit together. Where the boost target actually comes from, which tables do the real work, and how the PID is kept out of the way.</p>



<p class="wp-block-paragraph">Each section is marked. <strong>Verified</strong> means it comes straight from the calibration. <strong>Theory</strong> means it is my reasoning, not something I have measured. <strong>Observed</strong> means it is how the car behaves on the road.</p>



<h2 class="wp-block-heading">Configuration</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<ul class="wp-block-list">
<li>2JZ-GTE VVTi, 3.4 litre, Pulsar G42-1200, pump fuel</li>



<li>Turbosmart 60 mm wastegate, 15 psi spring, which gives 18 psi as installed</li>



<li>Single Link boost control solenoid</li>



<li><a href="https://emtron.world/products/kv12" target="_blank" rel="noopener">Emtron KV12</a>, closed loop, absolute target, manifold pressure as the control input</li>
</ul>



<p class="wp-block-paragraph">Who did what matters here, so to be clear: the structure, the lockouts and the base duty cycles are SRD&#8217;s. My changes are to the initial position table, made from logged corrections, and none of them is more than 3 percent.</p>



<h2 class="wp-block-heading">Where the target comes from</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">Emtron builds the boost target from a base table, adds a stack of offsets, then clamps the result. Here is the base table:</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Pedal demand</th><th style="padding:6px 8px">0 to 2,500 rpm</th><th style="padding:6px 8px">3,000 rpm and above</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">0%</td><td style="padding:6px 8px">40</td><td style="padding:6px 8px">40</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">10 to 30%</td><td style="padding:6px 8px">70</td><td style="padding:6px 8px">70</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">40 to 98%</td><td style="padding:6px 8px">80</td><td style="padding:6px 8px">100</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Boost Target Table 1, kPa absolute, against throttle area demand from the pedal. Identical rows and columns are merged.</figcaption></figure>



<p class="wp-block-paragraph">Look at the biggest number in it. 100 kPa absolute is atmospheric. The base table on its own never asks for any boost at all.</p>



<p class="wp-block-paragraph">The boost comes from the first of the user offsets:</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Manifold pressure</th><th style="padding:6px 8px">Offset, every rotary position</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">0 and 50 kPa</td><td style="padding:6px 8px">0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">100, 125 and 150 kPa</td><td style="padding:6px 8px">+200</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">User 1 Target Offset Table, kPa, indexed on manifold pressure against the steering wheel rotary (CANRx Vehicle Mode 1). All eight rotary columns are identical.</figcaption></figure>



<p class="wp-block-paragraph">Once the manifold reaches atmospheric, 200 kPa is added to the target. So with the pedal past 40 percent:</p>



<ul class="wp-block-list">
<li>Below 3,000 rpm: 80 + 200 = <strong>280 kPa</strong> absolute</li>



<li>From 3,000 rpm: 100 + 200 = <strong>300 kPa</strong> absolute</li>
</ul>



<p class="wp-block-paragraph">And then the clamp. The Boost Target Clamp is <strong>300 kPa absolute</strong>, roughly 2.0 bar of boost at sea level. Whatever the offsets add up to, the target cannot go past it. That is deliberate. The car runs on pump fuel, and the clamp is the safety switch that stops anything else in the stack asking for more than the fuel will take.</p>



<p class="wp-block-paragraph">The rotary columns being identical is also deliberate. Every traction setting gets the same boost ceiling, and the torque model decides how much of it is actually used. Boost is not the throttle on this car. Torque is, and that is covered in <a href="https://blownbytwins.co.uk/cars/mk4-supra/traction-control-feedforward-pid/">Traction Control on 1,114 whp</a>.</p>



<h3 class="wp-block-heading">Why the offset can look on manifold pressure</h3>



<p class="wp-block-paragraph"><strong>Status: Theory</strong></p>



<p class="wp-block-paragraph">An offset indexed on manifold pressure is a feedback loop: as pressure rises from 50 to 100 kPa, the target rises with it. That would be a problem if the solenoid were active through that range. It isn&#8217;t, which is the next table.</p>



<h2 class="wp-block-heading">When the solenoid is allowed to work</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Lockout</th><th style="text-align:right;padding:6px 8px">Value</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Throttle</td><td style="text-align:right;padding:6px 8px">10%</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Engine speed</td><td style="text-align:right;padding:6px 8px">1,800 rpm</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Manifold pressure</td><td style="text-align:right;padding:6px 8px">110 kPa</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Engine temperature</td><td style="text-align:right;padding:6px 8px">60 &deg;C</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Boost OL/CL Lockouts, set by SRD. Below any of these the solenoid is switched off and the wastegate runs on its spring.</figcaption></figure>



<p class="wp-block-paragraph">The solenoid stays off until the manifold is already 10 kPa above atmospheric. By then the user offset has finished ramping in and the target is fixed. Off boost, cold, or at a whisker of throttle, the wastegate simply does what its spring tells it.</p>



<h2 class="wp-block-heading">What takes boost away</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">Three offsets pull the target down. Two are protection, and both are indexed against the target itself, so the higher the target, the more they take.</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Target vs engine temp</th><th style="padding:6px 8px">up to 100 &deg;C</th><th style="padding:6px 8px">110 &deg;C</th><th style="padding:6px 8px">120 &deg;C and above</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">180 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">200 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">-10</td><td style="padding:6px 8px">-20</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">220 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">-40</td><td style="padding:6px 8px">-40</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">240 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">-50</td><td style="padding:6px 8px">-60</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">260 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">-50</td><td style="padding:6px 8px">-80</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">280 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">-50</td><td style="padding:6px 8px">-100</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Engine Temperature Target Offset Table, kPa. Every column from -50 to 100 &deg;C is zero.</figcaption></figure>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Target vs inlet air temp</th><th style="padding:6px 8px">up to 40 &deg;C</th><th style="padding:6px 8px">50</th><th style="padding:6px 8px">60</th><th style="padding:6px 8px">70</th><th style="padding:6px 8px">80</th><th style="padding:6px 8px">100</th><th style="padding:6px 8px">120</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">100 and 150 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">200 to 300 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">-3</td><td style="padding:6px 8px">-10</td><td style="padding:6px 8px">-20</td><td style="padding:6px 8px">-30</td><td style="padding:6px 8px">-40</td><td style="padding:6px 8px">-50</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Air Temperature Target Offset Table, kPa. Identical rows are merged.</figcaption></figure>



<p class="wp-block-paragraph">The third is by gear, and it is there for the gearbox rather than the engine:</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:center"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px">Gear</th><th style="padding:6px">R, N, 1 to 5</th><th style="padding:6px">6</th><th style="padding:6px">7</th><th style="padding:6px">8</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px">Offset, kPa</td><td>0</td><td>-10</td><td>-20</td><td>-30</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Gear Target Offset Table.</figcaption></figure>



<p class="wp-block-paragraph">Sixth, seventh and eighth lose 10, 20 and 30 kPa to protect the ZF&#8217;s clutches from slip. Where that gearbox runs out of capacity is covered in <a href="https://blownbytwins.co.uk/?p=1093">Where the Stock ZF 8HP70 Gives Up</a>.</p>



<h2 class="wp-block-heading">The table that does the work</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">Everything above decides what boost to ask for. This decides how to get it. The initial position table is the feedforward: the solenoid duty the ECU applies before the PID has done anything at all.</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.8rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:5px 6px">Target vs rpm</th><th style="padding:5px 6px">1,000 to 1,500</th><th style="padding:5px 6px">2,000 to 3,500</th><th style="padding:5px 6px">4,000</th><th style="padding:5px 6px">4,500</th><th style="padding:5px 6px">5,000</th><th style="padding:5px 6px">5,500</th><th style="padding:5px 6px">6,000</th><th style="padding:5px 6px">6,500</th><th style="padding:5px 6px">7,000</th><th style="padding:5px 6px">7,500</th><th style="padding:5px 6px">8,000</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:5px 6px">125 to 200 kPa</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:5px 6px">220 kPa</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">100</td><td style="padding:5px 6px">26.5</td><td style="padding:5px 6px">20.0</td><td style="padding:5px 6px">13.0</td><td style="padding:5px 6px">10.5</td><td style="padding:5px 6px">8.0</td><td style="padding:5px 6px">5.0</td><td style="padding:5px 6px">2.5</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:5px 6px">240 kPa</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">100</td><td style="padding:5px 6px">28.0</td><td style="padding:5px 6px">22.5</td><td style="padding:5px 6px">17.0</td><td style="padding:5px 6px">16.5</td><td style="padding:5px 6px">15.0</td><td style="padding:5px 6px">13.0</td><td style="padding:5px 6px">11.5</td><td style="padding:5px 6px">9.5</td><td style="padding:5px 6px">10.5</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:5px 6px">250 kPa</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">100</td><td style="padding:5px 6px">29.0</td><td style="padding:5px 6px">24.0</td><td style="padding:5px 6px">18.5</td><td style="padding:5px 6px">18.0</td><td style="padding:5px 6px">17.0</td><td style="padding:5px 6px">16.5</td><td style="padding:5px 6px">15.5</td><td style="padding:5px 6px">14.5</td><td style="padding:5px 6px">16.0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:5px 6px">260 kPa</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">100</td><td style="padding:5px 6px">29.5</td><td style="padding:5px 6px">25.0</td><td style="padding:5px 6px">20.5</td><td style="padding:5px 6px">19.5</td><td style="padding:5px 6px">19.5</td><td style="padding:5px 6px">19.5</td><td style="padding:5px 6px">19.5</td><td style="padding:5px 6px">19.5</td><td style="padding:5px 6px">21.0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:5px 6px">280 kPa</td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">100</td><td style="padding:5px 6px">31.0</td><td style="padding:5px 6px">28.0</td><td style="padding:5px 6px">24.5</td><td style="padding:5px 6px">23.0</td><td style="padding:5px 6px">24.5</td><td style="padding:5px 6px">26.0</td><td style="padding:5px 6px">27.5</td><td style="padding:5px 6px">29.0</td><td style="padding:5px 6px">31.5</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:5px 6px"><strong>300 kPa</strong></td><td style="padding:5px 6px">0</td><td style="padding:5px 6px">100</td><td style="padding:5px 6px"><strong>32.5</strong></td><td style="padding:5px 6px"><strong>30.5</strong></td><td style="padding:5px 6px"><strong>28.0</strong></td><td style="padding:5px 6px"><strong>26.0</strong></td><td style="padding:5px 6px"><strong>26.0</strong></td><td style="padding:5px 6px"><strong>30.0</strong></td><td style="padding:5px 6px"><strong>32.0</strong></td><td style="padding:5px 6px"><strong>36.5</strong></td><td style="padding:5px 6px"><strong>42.0</strong></td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Initial Position Table, % duty, boost target against engine speed. Bold is the row the car lives on at full demand. The table also has 320 and 340 kPa rows, which the 300 kPa clamp means are never used.</figcaption></figure>



<p class="wp-block-paragraph">Read the 300 kPa row from left to right and it tells the story of a pull.</p>



<p class="wp-block-paragraph"><strong>2,000 to 3,500 rpm: 100.</strong> Hold the wastegate shut and let the turbo spool. In practice this is 80, not 100, because the Max Duty table clamps the output at 80 percent everywhere. The 100 in the table is a way of saying &#8220;as much as you&#8217;re allowed&#8221;.</p>



<p class="wp-block-paragraph"><strong>4,000 rpm: 32.5.</strong> The turbo is lit. Drop straight to the duty that holds 300 kPa, so the gate opens instead of letting boost run past the target.</p>



<p class="wp-block-paragraph"><strong>5,500 to 6,000 rpm: 26.</strong> The lowest duty in the row.</p>



<p class="wp-block-paragraph"><strong>6,500 to 8,000 rpm: 30 rising to 42.</strong> More duty is needed to hold the same target as rpm rises.</p>



<p class="wp-block-paragraph">The lower rows show the spring at work. The spring holds 18 psi as installed, about 225 kPa absolute. So at a 220 kPa target the duty falls away as rpm rises, and by 7,500 rpm it is zero: the spring alone is enough. Every row above that is the solenoid adding pressure on top of the spring.</p>



<h3 class="wp-block-heading">Why the duty rises at the top</h3>



<p class="wp-block-paragraph"><strong>Status: Theory</strong></p>



<p class="wp-block-paragraph">A wastegate valve is pushed open by exhaust pressure acting on its face, as well as by boost pressure acting on its diaphragm. As rpm rises, exhaust manifold pressure rises with it, and the valve gets more help opening. To hold the same boost, the solenoid has to fight harder, so the duty goes up. I don&#8217;t measure exhaust manifold pressure on this car, so that is the mechanism I&#8217;d expect rather than one I have logged.</p>



<h3 class="wp-block-heading">How I refined it</h3>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">If the initial position were perfect, the PID would have nothing to correct. So the logs tell you where it is wrong. Wherever the closed loop consistently added or removed duty in the same cell, the feedforward was out by about that much.</p>



<p class="wp-block-paragraph">I moved those cells towards what the PID was asking for. None by more than 3 percent. It&#8217;s refinement, not a rebuild. The aim was to take work away from the closed loop wherever the data said it was doing work it shouldn&#8217;t have to.</p>



<h2 class="wp-block-heading">The PID: kept on a short lead</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">The loop runs at 35 Hz, against Emtron&#8217;s typical 25, with a deadband of ±0.1 kPa and no input or target filtering. Emtron&#8217;s own note on the control rate is worth repeating: change it and the gains need re-tuning, because every gain is effectively per calculation.</p>



<p class="wp-block-paragraph">All three gains are scheduled on boost target error. Negative error means boost is above target.</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Error, kPa</th><th style="padding:6px 8px">-50</th><th style="padding:6px 8px">-25</th><th style="padding:6px 8px">-10</th><th style="padding:6px 8px">-5</th><th style="padding:6px 8px">-2</th><th style="padding:6px 8px">2</th><th style="padding:6px 8px">5</th><th style="padding:6px 8px">10</th><th style="padding:6px 8px">25</th><th style="padding:6px 8px">60</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">Proportional</td><td style="padding:6px 8px">0.50</td><td style="padding:6px 8px">0.50</td><td style="padding:6px 8px">0.20</td><td style="padding:6px 8px">0.20</td><td style="padding:6px 8px">0.10</td><td style="padding:6px 8px">0.10</td><td style="padding:6px 8px">0.50</td><td style="padding:6px 8px">0.50</td><td style="padding:6px 8px">0.50</td><td style="padding:6px 8px">0.50</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">Integral</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0.018</td><td style="padding:6px 8px">0.025</td><td style="padding:6px 8px">0.025</td><td style="padding:6px 8px">0.018</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">Derivative</td><td style="padding:6px 8px">3.00</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">3.00</td><td style="padding:6px 8px">3.00</td><td style="padding:6px 8px">0</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Proportional, Integral and Derivative Gain Tables combined. The three tables use slightly different breakpoints; where a column is beyond a table&#8217;s axis, its end value is shown. Derivative is 0 from -40 to +5 kPa. Proportional also has a dMAP axis, flat apart from one cell, covered below.</figcaption></figure>



<p class="wp-block-paragraph">The integral is clamped as well: the Positive and Negative Integral Limit tables hold it to <strong>±5 percent duty</strong> at every rpm. Overall output is held between a 5 percent minimum and an 80 percent maximum.</p>



<p class="wp-block-paragraph">One cell in the proportional table stands out. At -25 kPa of error, with manifold pressure rising at 5 percent per second, the gain is <strong>10.00</strong> instead of 0.50. That is the overboost catch. Boost well over target and still climbing is the one situation where the controller is allowed to hit hard.</p>



<h3 class="wp-block-heading">Why it is shaped this way</h3>



<p class="wp-block-paragraph"><strong>Status: Theory</strong></p>



<p class="wp-block-paragraph">Proportional gain is smallest near target. Once the boost is where it should be, small errors are corrected gently, so the solenoid isn&#8217;t hunting.</p>



<p class="wp-block-paragraph">Integral only works within 5 kPa of target and is zero beyond 10. During spool the error is enormous, and an integrator running through that would wind up and then overshoot when the turbo arrives. Here it simply doesn&#8217;t run until boost is close. Add the ±5 percent clamp and the integrator can trim the feedforward but never replace it.</p>



<p class="wp-block-paragraph">Derivative is active between 10 and 25 kPa below target. That is boost on its final approach, rising fast towards the target. Derivative reacts to rate of change, so it starts opening the gate before the boost gets there, taking the edge off the arrival rather than correcting an overshoot afterwards.</p>



<p class="wp-block-paragraph">It&#8217;s the same philosophy as the <a href="https://blownbytwins.co.uk/cars/mk4-supra/traction-control-feedforward-pid/">traction control</a>. Feedforward does the work. The closed loop is soft near target, gated where it could do harm, and clamped so it can never take over.</p>



<h2 class="wp-block-heading">Housekeeping</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">Two things in the file worth knowing if you are reading your own:</p>



<ul class="wp-block-list">
<li>The Boost Solenoid Deadtime table is zero from 10 to 20 V, so solenoid duty isn&#8217;t corrected for supply voltage.</li>



<li>The Boost Overall Target Trim is zero. It&#8217;s a single number that shifts every target at once, which makes it a quick way to test a change without touching the tables.</li>
</ul>



<h2 class="wp-block-heading">Does it work?</h2>



<p class="wp-block-paragraph"><strong>Status: Observed</strong></p>



<p class="wp-block-paragraph">Spooled by 3,400 rpm. On target by 4,200. And from there it pulls, hard, all the way to 8,400.</p>



<p class="wp-block-paragraph">That lines up with the table. The 100 percent hold ends at 3,500, the duty drops to 32.5 at 4,000, and the car is on target 200 rpm later.</p>



<h2 class="wp-block-heading">The principle</h2>



<p class="wp-block-paragraph">Get the feedforward right and the PID has almost nothing to do. Then let the logs tell you where it isn&#8217;t right: wherever the closed loop is consistently correcting, the initial position is wrong by that much.</p>



<p class="wp-block-paragraph">Every number here is specific to this turbo, this wastegate, this spring and this fuel. <strong>The data is not transferable, but the principle is.</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<p class="wp-block-paragraph"><em>How the torque model decides how much of this boost is actually used is in <a href="https://blownbytwins.co.uk/cars/mk4-supra/traction-control-feedforward-pid/">Traction Control on 1,114 whp</a>. Why the top gears lose boost is in <a href="https://blownbytwins.co.uk/?p=1093">Where the Stock ZF 8HP70 Gives Up</a>. The fuel system feeding all of it is in <a href="https://blownbytwins.co.uk/?p=1194">Staged Injection on the Emtron KV12</a>. Full specification is on the <a href="https://blownbytwins.co.uk/toyota-supra-mk4-delta/">Supra project page</a>.</em></p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/boost-control-emtron-kv12/">Boost Control on the Emtron KV12: Where the Target Really Comes From</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/boost-control-emtron-kv12/">Boost Control on the Emtron KV12: Where the Target Really Comes From</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Staged Injection on the Emtron KV12: A Blend, Not a Switch</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/staged-injection-emtron-kv12/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Sat, 10 Oct 2026 07:00:00 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[emtron]]></category>
		<category><![CDATA[fuel system]]></category>
		<category><![CDATA[injectors]]></category>
		<category><![CDATA[staged injection]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1194</guid>

					<description><![CDATA[<p>How the Emtron KV12 stages twelve CP1000 injectors on the Supra: every table that controls the handover, what the logs show, and where the secondaries sit uncomfortably close to their minimum pulse width.</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/staged-injection-emtron-kv12/">Staged Injection on the Emtron KV12: A Blend, Not a Switch</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/staged-injection-emtron-kv12/">Staged Injection on the Emtron KV12: A Blend, Not a Switch</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">In <a href="https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/">Twelve Small Injectors Instead of Six Big Ones</a> I explained why this car runs two injectors per cylinder. I finished by saying the handover between primaries and secondaries was the part I knew least about, and where I&#8217;d expect the problems to live.</p>



<p class="wp-block-paragraph">This is the follow up. How the Emtron KV12 actually stages twelve injectors, every table that controls it, and one thing I had described wrongly.</p>



<p class="wp-block-paragraph">Each section is marked. <strong>Verified</strong> means it comes straight from the calibration or the logs. <strong>Theory</strong> means it is my reasoning or arithmetic, not something I have measured.</p>



<h2 class="wp-block-heading">Configuration</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<ul class="wp-block-list">
<li>2JZ-GTE VVTi, 3,353 cc, flex fuel</li>



<li>Plazmaman intake manifold, twin fuel rails mounted on the runners</li>



<li>Twelve CP1000 injectors, rated 1,000 cc/min at 3 bar, high impedance</li>



<li>1:1 rising rate regulator, fuel pressure sensor fitted</li>



<li>Three Walbro 485 pumps</li>



<li><a href="https://emtron.world/products/kv12" target="_blank" rel="noopener">Emtron KV12</a>, every injector on its own channel</li>
</ul>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1600" height="1200" src="https://blownbytwins.co.uk/wp-content/uploads/2026/05/51187a24-0987-48db-b993-81482362b806.jpeg" alt="Supra 2JZ-GTE engine bay with a Plazmaman intake manifold and two black Plazmaman fuel rails running along the intake runners" class="wp-image-1025" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/05/51187a24-0987-48db-b993-81482362b806.jpeg 1600w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/51187a24-0987-48db-b993-81482362b806-300x225.jpeg 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/51187a24-0987-48db-b993-81482362b806-1024x768.jpeg 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/51187a24-0987-48db-b993-81482362b806-768x576.jpeg 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/51187a24-0987-48db-b993-81482362b806-1536x1152.jpeg 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><figcaption class="wp-element-caption">Installed. Two Plazmaman rails, six injectors each, running along the runners between the head and the plenum.</figcaption></figure>



<h2 class="wp-block-heading">How Emtron does it</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">Staging is an injection mode, not an add on. The KV12 offers seven:</p>



<ul class="wp-block-list">
<li>0: Off</li>



<li>1: Sequential</li>



<li><strong>2: Sequential/Staged Sequential</strong> (this car)</li>



<li>3: Sequential/Staged Group</li>



<li>4: Non Sequential</li>



<li>5: GDI Sequential</li>



<li>6: GDI Sequential/Staged, primary GDI and secondary port</li>
</ul>



<p class="wp-block-paragraph">Mode 2 fires the secondaries sequentially as well, each one timed to its own cylinder. Mode 3 groups them, which is what you would use on an ECU without enough channels. With twelve dedicated outputs there is no reason to group anything.</p>



<p class="wp-block-paragraph">Once staging is enabled, the secondaries get their own setup page, and it mirrors the primary one line for line:</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Setting</th><th style="text-align:right;padding:6px 8px">Primary</th><th style="text-align:right;padding:6px 8px">Secondary</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Reference injector size</td><td style="text-align:right;padding:6px 8px">1,190 cc/min</td><td style="text-align:right;padding:6px 8px">1,190 cc/min</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Reference static fuel pressure</td><td style="text-align:right;padding:6px 8px">400 kPa</td><td style="text-align:right;padding:6px 8px">400 kPa</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Injection timing</td><td style="text-align:right;padding:6px 8px">End of injection</td><td style="text-align:right;padding:6px 8px">End of injection</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Nozzle reference pressure</td><td style="text-align:right;padding:6px 8px">Manifold pressure</td><td style="text-align:right;padding:6px 8px">Manifold pressure</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Fuel pressure correction</td><td style="text-align:right;padding:6px 8px">On, sensor fitted</td><td style="text-align:right;padding:6px 8px">On, sensor fitted</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Injector max duty clamp</td><td style="text-align:right;padding:6px 8px">95%</td><td style="text-align:right;padding:6px 8px">n/a</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Minimum effective pulse width</td><td style="text-align:right;padding:6px 8px">0.200 ms</td><td style="text-align:right;padding:6px 8px">n/a</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Staging rpm lockout</td><td style="text-align:right;padding:6px 8px">n/a</td><td style="text-align:right;padding:6px 8px">1,000 rpm</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Staging ON, balance table above</td><td style="text-align:right;padding:6px 8px">n/a</td><td style="text-align:right;padding:6px 8px">5.0</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="padding:6px 8px">Staging OFF, balance table below</td><td style="text-align:right;padding:6px 8px">n/a</td><td style="text-align:right;padding:6px 8px">5.0</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Fuel Main and Fuel Secondary Setup, as configured. The separate secondary settings mean the two banks could be different injectors at different pressures. Here they are identical.</figcaption></figure>



<p class="wp-block-paragraph">Fuel pressure correction being on with a sensor fitted matters more than it looks. The ECU is not trusting the regulator to hold 400 kPa across the injector. It measures the differential and corrects flow for it. A 1:1 regulator gets you close, but close is not the same as measured.</p>



<h3 class="wp-block-heading">The channel map</h3>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:center"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px">Channel</th><th style="padding:6px">1</th><th style="padding:6px">2</th><th style="padding:6px">3</th><th style="padding:6px">4</th><th style="padding:6px">5</th><th style="padding:6px">6</th><th style="padding:6px">7</th><th style="padding:6px">8</th><th style="padding:6px">9</th><th style="padding:6px">10</th><th style="padding:6px">11</th><th style="padding:6px">12</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px">Primary, cylinder</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>&ndash;</td><td>&ndash;</td><td>&ndash;</td><td>&ndash;</td><td>&ndash;</td><td>&ndash;</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px">Secondary, cylinder</td><td>&ndash;</td><td>&ndash;</td><td>&ndash;</td><td>&ndash;</td><td>&ndash;</td><td>&ndash;</td><td>5</td><td>6</td><td>3</td><td>2</td><td>1</td><td>4</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Injection Channel Assignment. The secondaries are not in cylinder order.</figcaption></figure>



<p class="wp-block-paragraph">Channels 7 to 12 do not run 1 to 6. That is fine, as long as the map matches the wiring. Get one wrong and a secondary fires on the wrong cylinder&#8217;s timing. You will not see that on a single wideband, because the total fuel is still right. The only proper check is firing each channel individually.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="2048" height="1536" src="https://blownbytwins.co.uk/wp-content/uploads/2026/05/de67d480-a6d0-4a81-9476-154df154cc39.jpeg" alt="3.4 litre 2JZ-GTE on an engine stand with the Plazmaman intake manifold and both fuel rails fitted, before installation" class="wp-image-1008" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/05/de67d480-a6d0-4a81-9476-154df154cc39.jpeg 2048w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/de67d480-a6d0-4a81-9476-154df154cc39-300x225.jpeg 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/de67d480-a6d0-4a81-9476-154df154cc39-1024x768.jpeg 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/de67d480-a6d0-4a81-9476-154df154cc39-768x576.jpeg 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/de67d480-a6d0-4a81-9476-154df154cc39-1536x1152.jpeg 1536w" sizes="(max-width: 2048px) 100vw, 2048px" /><figcaption class="wp-element-caption">On the stand before installation. Twelve injectors means twelve connectors, and every one has to land on the right channel.</figcaption></figure>



<h2 class="wp-block-heading">Characterising the injector</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">The injectors are CP1000s, rated 1,000 cc/min at 3 bar. Scaled to the 400 kPa this car runs across the injector, that is about 1,155 cc/min each, roughly 13,860 cc/min across all twelve, the equivalent of six 2,310 cc injectors.</p>



<p class="wp-block-paragraph">The calibration doesn&#8217;t use 1,155. Its reference size is 1,190 cc/min at 400 kPa, taken from CP Fuel and Race data rather than scaled from the headline rating. The square root rule is a good approximation, not a measurement. Where the manufacturer has measured the injector at your pressure, use their number.</p>



<p class="wp-block-paragraph">The dead time table is identical for both banks, which is correct for identical injectors:</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Diff pressure vs supply</th><th style="padding:6px 8px">8 V</th><th style="padding:6px 8px">10 V</th><th style="padding:6px 8px">12 V</th><th style="padding:6px 8px">14 V</th><th style="padding:6px 8px">16 V</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">300 kPa</td><td style="padding:6px 8px">2.609</td><td style="padding:6px 8px">1.675</td><td style="padding:6px 8px">1.240</td><td style="padding:6px 8px">0.960</td><td style="padding:6px 8px">0.756</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">400 kPa</td><td style="padding:6px 8px">3.053</td><td style="padding:6px 8px">1.892</td><td style="padding:6px 8px">1.353</td><td style="padding:6px 8px"><strong>1.057</strong></td><td style="padding:6px 8px">0.836</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">500 kPa</td><td style="padding:6px 8px">3.659</td><td style="padding:6px 8px">2.086</td><td style="padding:6px 8px">1.484</td><td style="padding:6px 8px">1.125</td><td style="padding:6px 8px">0.910</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Injector Deadtime Table, ms, primary and secondary. Bold is roughly where the car lives: 400 kPa across the injector, 14 V supply.</figcaption></figure>



<p class="wp-block-paragraph">Dead time rises with pressure and falls with voltage. The solenoid has to pull the pintle open against the fuel pressure, and a higher supply voltage builds current in the coil faster. On a running car at 14 V and 400 kPa, the first 1.057 ms of every pulse is dead time: the injector is energised but not yet delivering its rated flow.</p>



<p class="wp-block-paragraph">Both banks run saturated drive, which is right for a high impedance injector. Peak and hold is for low impedance injectors that need a current limit.</p>



<h3 class="wp-block-heading">Flex fuel is handled underneath</h3>



<p class="wp-block-paragraph">The fuel model works in mass, so the ECU needs to know two things about whatever is in the tank: how much air it needs to burn completely, and how dense it is.</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Ethanol</th><th style="padding:6px 8px">0%</th><th style="padding:6px 8px">10%</th><th style="padding:6px 8px">20%</th><th style="padding:6px 8px">30%</th><th style="padding:6px 8px">40%</th><th style="padding:6px 8px">50%</th><th style="padding:6px 8px">60%</th><th style="padding:6px 8px">70%</th><th style="padding:6px 8px">80%</th><th style="padding:6px 8px">90%</th><th style="padding:6px 8px">100%</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">Stoich AFR</td><td style="padding:6px 8px">14.70</td><td style="padding:6px 8px">14.13</td><td style="padding:6px 8px">13.56</td><td style="padding:6px 8px">12.99</td><td style="padding:6px 8px">12.42</td><td style="padding:6px 8px">11.85</td><td style="padding:6px 8px">11.28</td><td style="padding:6px 8px">10.71</td><td style="padding:6px 8px">10.14</td><td style="padding:6px 8px">9.57</td><td style="padding:6px 8px">9.00</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Stoichiometric Custom Table. It also has an engine speed axis, but every column is the same, so only one row is shown.</figcaption></figure>



<p class="wp-block-paragraph">The table is a straight line between petrol and ethanol, by volume. Strictly, stoichiometry blends by mass, not volume, so I checked it. At E85, weighting by mass gives 9.81. The table interpolates to 9.86. Half a percent, well inside what the closed loop trims absorb. Not worth correcting.</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Ethanol vs fuel temp</th><th style="padding:6px 8px">-20 &deg;C</th><th style="padding:6px 8px">0 &deg;C</th><th style="padding:6px 8px">20 &deg;C</th><th style="padding:6px 8px">40 &deg;C</th><th style="padding:6px 8px">60 &deg;C</th><th style="padding:6px 8px">80 &deg;C</th><th style="padding:6px 8px">90 &deg;C</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">0%</td><td style="padding:6px 8px">0.773</td><td style="padding:6px 8px">0.759</td><td style="padding:6px 8px">0.745</td><td style="padding:6px 8px">0.731</td><td style="padding:6px 8px">0.717</td><td style="padding:6px 8px">0.703</td><td style="padding:6px 8px">0.690</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">50%</td><td style="padding:6px 8px">0.800</td><td style="padding:6px 8px">0.784</td><td style="padding:6px 8px">0.768</td><td style="padding:6px 8px">0.752</td><td style="padding:6px 8px">0.736</td><td style="padding:6px 8px">0.720</td><td style="padding:6px 8px">0.710</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">100%</td><td style="padding:6px 8px">0.825</td><td style="padding:6px 8px">0.807</td><td style="padding:6px 8px">0.789</td><td style="padding:6px 8px">0.771</td><td style="padding:6px 8px">0.753</td><td style="padding:6px 8px">0.735</td><td style="padding:6px 8px">0.720</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Fuel Density Table, g/mL, three rows of eleven and selected columns. Ethanol at 20 &deg;C reads 0.789, which is the textbook value.</figcaption></figure>



<p class="wp-block-paragraph">One small oddity: the step from 80 to 90 °C is steeper than every other step in the table, and the 90 °C column is rounded to two decimal places. It doesn&#8217;t matter here, because the fuel in this rail never gets near 90 °C. If yours does, that column is worth a second look.</p>



<h2 class="wp-block-heading">The balance table: a blend, not a switch</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">This is the table that decides who does the work. The value is the secondary bank&#8217;s share of total fuel. Zero means primaries only. Fifty means an even split.</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">MAP vs rpm</th><th style="padding:6px 8px">1,000</th><th style="padding:6px 8px">1,500</th><th style="padding:6px 8px">2,000</th><th style="padding:6px 8px">2,500</th><th style="padding:6px 8px">3,000</th><th style="padding:6px 8px">3,500</th><th style="padding:6px 8px">4,000</th><th style="padding:6px 8px">4,500</th><th style="padding:6px 8px">5,000+</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">20 to 100 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">15</td><td style="padding:6px 8px">20</td><td style="padding:6px 8px">25</td><td style="padding:6px 8px">30</td><td style="padding:6px 8px">35</td><td style="padding:6px 8px">40</td><td style="padding:6px 8px">45</td><td style="padding:6px 8px">50</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">120 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">26.5</td><td style="padding:6px 8px">30</td><td style="padding:6px 8px">33.5</td><td style="padding:6px 8px">36.5</td><td style="padding:6px 8px">40</td><td style="padding:6px 8px">43.5</td><td style="padding:6px 8px">46.5</td><td style="padding:6px 8px">50</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">140 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">38.5</td><td style="padding:6px 8px">40</td><td style="padding:6px 8px">41.5</td><td style="padding:6px 8px">43.5</td><td style="padding:6px 8px">45</td><td style="padding:6px 8px">46.5</td><td style="padding:6px 8px">48.5</td><td style="padding:6px 8px">50</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">160 to 180 kPa</td><td style="padding:6px 8px">0</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">200 to 240 kPa</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td><td style="padding:6px 8px">50</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Secondary Balance Table, percent of total fuel from the secondaries. Identical rows are merged. Every row is 50 from 5,000 rpm to the end of the axis at 11,500.</figcaption></figure>



<p class="wp-block-paragraph">Read the top row. At 1,500 rpm in vacuum, the secondaries supply 15 percent. By 2,000 it is 20. The share climbs 5 points every 500 rpm until it reaches an even split at 5,000.</p>



<p class="wp-block-paragraph">Add boost and the ramp gets steeper. At 140 kPa the secondaries are already at 38.5 percent by 1,500 rpm, and from 160 kPa upwards it is an even split everywhere above 1,000.</p>



<p class="wp-block-paragraph">Which means I described this wrongly. In <a href="https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/">Twelve Small Injectors</a> I wrote that at idle, around town, and at any low load, only the primaries fire. The table says otherwise. Around town at 2,000 rpm, a fifth of the fuel is coming from the secondaries. Only idle runs on primaries alone.</p>



<p class="wp-block-paragraph">This isn&#8217;t staging in the on/off sense. It&#8217;s a blend with a floor.</p>



<h3 class="wp-block-heading">Where the switch actually is</h3>



<p class="wp-block-paragraph">Two settings decide when the secondaries are allowed to fire at all.</p>



<p class="wp-block-paragraph">The <strong>staging rpm lockout</strong> holds them off below 1,000 rpm, whatever the table says. Above that, staging comes on when the interpolated balance value rises above 5.0 and goes off when it falls below 5.0.</p>



<p class="wp-block-paragraph">The table goes from 0 at 1,000 rpm to 15 at 1,500. Interpolating between them, it crosses 5 at about <strong>1,170 rpm</strong>, at every MAP up to 100 kPa. That is the real staging point for normal driving.</p>



<p class="wp-block-paragraph">And because ON and OFF are both 5.0, there is no hysteresis. The same threshold switches the bank in and out. Sitting at 1,170 rpm, the secondaries could in principle toggle on every fluctuation of engine speed.</p>



<p class="wp-block-paragraph">What keeps idle clean is the idle target. I moved it to 950 rpm, under the lockout, so at idle the secondaries are never asked to fire.</p>



<h2 class="wp-block-heading">What the secondaries are being asked to do</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">The whole reason for twelve injectors is to keep pulse widths out of the region where an injector stops being predictable. So it&#8217;s worth asking what pulse width the secondaries actually see at light load.</p>



<p class="wp-block-paragraph">I haven&#8217;t measured this directly. This is arithmetic from the fuel model, assuming 80 percent volumetric efficiency, 30 °C charge and lambda 1:</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><table style="border-collapse:collapse;width:100%;font-size:0.85rem;text-align:right"><thead><tr style="border-bottom:2px solid #333"><th style="text-align:left;padding:6px 8px">Condition</th><th style="padding:6px 8px">All fuel through one injector</th><th style="padding:6px 8px">Secondary at 5%</th><th style="padding:6px 8px">Secondary at 15%</th><th style="padding:6px 8px">Secondary at 20%</th></tr></thead><tbody>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">40 kPa, E85</td><td style="padding:6px 8px">1.36 ms</td><td style="padding:6px 8px">0.07 ms</td><td style="padding:6px 8px">0.21 ms</td><td style="padding:6px 8px">0.27 ms</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">40 kPa, petrol</td><td style="padding:6px 8px">0.95 ms</td><td style="padding:6px 8px">0.05 ms</td><td style="padding:6px 8px">0.14 ms</td><td style="padding:6px 8px">0.19 ms</td></tr>
<tr style="border-bottom:1px solid #ddd"><td style="text-align:left;padding:6px 8px">60 kPa, E85</td><td style="padding:6px 8px">2.05 ms</td><td style="padding:6px 8px">0.10 ms</td><td style="padding:6px 8px">0.31 ms</td><td style="padding:6px 8px">0.41 ms</td></tr>
</tbody></table><figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Effective pulse width, after dead time. Estimated, not logged. The minimum effective pulse width in the calibration is 0.200 ms.</figcaption></figure>



<p class="wp-block-paragraph">At 1,500 rpm in light cruise, the secondaries sit right on the 0.200 ms minimum on E85 and below it on petrol. At the moment staging switches on, with the balance at 5 percent, they are being asked for something like a third of the minimum.</p>



<p class="wp-block-paragraph">That is exactly the region <a href="https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/">Twelve Small Injectors</a> says staging exists to avoid. The primaries are comfortable. The secondaries are not.</p>



<p class="wp-block-paragraph">The calibration has no short pulse correction either. For very short pulses, the ECU is converting fuel mass to time using dead time and a straight line slope, and a straight line is exactly what an injector stops being down there.</p>



<p class="wp-block-paragraph">What the KV12 does with a request below its own minimum, whether it clamps up to 0.200 ms or drops the pulse, I don&#8217;t know. Either way, the secondary delivery in that window is not what the model thinks it is.</p>



<h2 class="wp-block-heading">What the logs say</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">Lambda control is good through the staging region. On the road the handover is transparent. I can&#8217;t feel it, and the wideband doesn&#8217;t show a step.</p>



<p class="wp-block-paragraph">Which looks like it contradicts the section above. I don&#8217;t think it does. Maybe we can refine this in the future.</p>



<h3 class="wp-block-heading">Why it holds up anyway</h3>



<p class="wp-block-paragraph"><strong>Status: Theory</strong></p>



<p class="wp-block-paragraph">Two reasons, and I suspect both apply.</p>



<p class="wp-block-paragraph">First, the error is a percentage of a small number. If a secondary at 15 percent share delivers 20 percent more or less than asked, the cylinder sees a 3 percent error in total fuel. That is inside what closed loop trims correct without anyone noticing.</p>



<p class="wp-block-paragraph">Second, the closed loop may be doing exactly that. Good lambda control in a region where the open loop model is weakest doesn&#8217;t prove the model is right. It may only prove the trims are working. The way to tell the difference is to log the trims, not lambda, through the 1,170 to 2,500 rpm band. Emtron logs the effective and actual pulse width of both banks separately, so the secondary pulse widths can be checked against the estimates above.</p>



<h3 class="wp-block-heading">Where the injectors are, and why it barely shows</h3>



<p class="wp-block-paragraph"><strong>Status: Theory</strong></p>



<figure class="wp-block-image size-full"><img decoding="async" width="1536" height="2048" src="https://blownbytwins.co.uk/wp-content/uploads/2026/05/31f6c2df-564c-42ed-ad76-ba52a0361695.jpeg" alt="Close-up of two Plazmaman fuel rails on the intake runners, each feeding six injectors, one row nearer the cylinder head than the other" class="wp-image-1010" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/05/31f6c2df-564c-42ed-ad76-ba52a0361695.jpeg 1536w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/31f6c2df-564c-42ed-ad76-ba52a0361695-225x300.jpeg 225w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/31f6c2df-564c-42ed-ad76-ba52a0361695-768x1024.jpeg 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/05/31f6c2df-564c-42ed-ad76-ba52a0361695-1152x1536.jpeg 1152w" sizes="(max-width: 1536px) 100vw, 1536px" /><figcaption class="wp-element-caption">The two rows. One sits close to the head, the other further out along the runners.</figcaption></figure>



<p class="wp-block-paragraph">Both rails sit on the runners, one row close to the head and the other further out along the runner. So the two banks do not take quite the same path to the valve. Fuel from the outer row travels further, wets more runner wall, and arrives slightly later. Calibrating a handover between two injector positions means accounting for two transport paths.</p>



<p class="wp-block-paragraph">On this manifold the gap between the two rows is short, far shorter than on layouts that put the secondaries up in the plenum or the intake tract. I&#8217;d expect the difference in transport and wall wetting to be small. It also matters least where the secondaries carry the smallest share of the fuel, which is exactly the light load region above. That is probably part of why the handover is transparent, but I haven&#8217;t measured it.</p>



<h2 class="wp-block-heading">What I&#8217;d change</h2>



<p class="wp-block-paragraph"><strong>Status: Working conclusion</strong></p>



<p class="wp-block-paragraph">Nothing is broken, so none of this is urgent. But the calibration is relying on the trims in a region where it doesn&#8217;t need to.</p>



<ul class="wp-block-list">
<li><strong>Bring the secondaries in later and bigger.</strong> Six 1,000 cc primaries have far more than enough capacity to carry light cruise on their own. Holding the secondaries at zero through light load, and bringing them in where their share gives a pulse width comfortably clear of the minimum, means they never operate in the bottom of their range.</li>



<li><strong>Split ON and OFF.</strong> Identical thresholds mean no hysteresis. A gap between them stops the bank chattering at the switch point.</li>



<li><strong>Mind the margin at idle.</strong> 950 rpm against a 1,000 rpm lockout is 50 rpm of margin. Anything that lifts the idle above 1,000, such as a higher cold idle target, an idle flare or load compensation, brings the secondaries in at the smallest pulse widths in the table.</li>



<li><strong>Add short pulse data if the ECU will take it.</strong> It is the one piece of the injector model the calibration doesn&#8217;t have, and it matters most in exactly the light load region above.</li>
</ul>



<h2 class="wp-block-heading">The principle</h2>



<p class="wp-block-paragraph">Staging solves a pulse width problem. The balance table can quietly give it straight back by handing the secondaries a sliver of fuel at light load.</p>



<p class="wp-block-paragraph">So when you set one up, don&#8217;t only check that lambda is clean through the transition. Work out the secondary pulse width at the first non zero cell in the table, and check it against the injector&#8217;s minimum. If it is below, the ECU is guessing and the closed loop is covering for it.</p>



<p class="wp-block-paragraph">Every number here is specific to this car, these injectors and this manifold. <strong>The data is not transferable, but the principle is.</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Why the car has twelve injectors in the first place, and the flow arithmetic behind them, is in <a href="https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/">Twelve Small Injectors Instead of Six Big Ones</a>. What the fuel system makes possible on E85 is in <a href="https://blownbytwins.co.uk/?p=1107">What E85 Actually Buys</a>. Full specification is on the <a href="https://blownbytwins.co.uk/toyota-supra-mk4-delta/">Supra project page</a>.</em></p>



<p class="wp-block-paragraph">If you run a staged setup on an Emtron and know what the KV12 does with a request below the minimum effective pulse width, I&#8217;d like to hear it.</p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/staged-injection-emtron-kv12/">Staged Injection on the Emtron KV12: A Blend, Not a Switch</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/staged-injection-emtron-kv12/">Staged Injection on the Emtron KV12: A Blend, Not a Switch</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tuning Cruise Control on a 1,000+ bhp Toyota Supra</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/supra-cruise-control-emtron-pid-tuning/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 14:13:36 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[Tuning]]></category>
		<category><![CDATA[calibration]]></category>
		<category><![CDATA[cruise control]]></category>
		<category><![CDATA[dbw]]></category>
		<category><![CDATA[emtron]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1210</guid>

					<description><![CDATA[<p>How to read a cruise control log on a torque-based Emtron KV12: one sample log from a 2JZ Supra, six checks that derive what P, I, D and base torque are really doing, and the formulas to redo them for your own gearing.</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/supra-cruise-control-emtron-pid-tuning/">Tuning Cruise Control on a 1,000+ bhp Toyota Supra</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/supra-cruise-control-emtron-pid-tuning/">Tuning Cruise Control on a 1,000+ bhp Toyota Supra</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Cruise control is not the first system anyone thinks about on a heavily modified Supra. On a torque-based standalone, though, it is one of the most revealing. Cruise never touches the throttle directly. It asks the engine for torque and trusts every layer underneath to deliver it, so if the torque model, the throttle-area table or the drive-by-wire loop is wrong, cruise is where it shows.</p>



<p class="wp-block-paragraph">This is not a list of gains to copy. Gearing, tyre size and mass change every number below. What carries over is the method: take one sample log, and derive from it what each part of the controller is actually doing. Each check comes with the formula to redo it on your own car.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">The control path</h2>



<p class="wp-block-paragraph">Emtron is not commanding throttle position from speed error. The chain is:</p>



<pre class="wp-block-code"><code>Speed error → Cruise PID → torque correction
Torque Target Base + correction → Torque Target Final
Torque Target Final → TMF → throttle-area demand → DBW → engine torque</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-control-path-v2.png" alt="Block diagram of the Emtron cruise control path: speed error into the cruise PID, the correction added to a base torque latched when SET is pressed, final torque through TMF to throttle area demand, DBW, engine, ZF 8HP70 and vehicle, with front axle average speed fed back as the cruise speed input"/><figcaption class="wp-element-caption">Cruise sits on top of the torque model. Everything inside the dashed box was tuned before any cruise gain was touched.</figcaption></figure>



<p class="wp-block-paragraph">That ordering matters. Cruise PID behaviour is only meaningful once the layers below it are stable, because any error in the throttle-area model or the DBW loop arrives at the cruise controller looking like road load. On this car the <a href="https://blownbytwins.co.uk/cars/mk4-supra/throttle-body-effective-area/">throttle-area table</a> and DBW PID were both reworked first.</p>



<h2 class="wp-block-heading">How Emtron scales the gains</h2>



<p class="wp-block-paragraph">Emtron&#8217;s cruise gains map directly to torque:</p>



<ul class="wp-block-list">
<li><strong>P = 1.00</strong> gives ±10 Nm for every 1 km/h of speed error.</li>



<li><strong>I = 0.010</strong> gives ±10 Nm/s for every 1 km/h of sustained speed error.</li>
</ul>



<p class="wp-block-paragraph">So P = 1.20 should give 12 Nm per km/h immediately, and I = 0.003 should add 3 Nm every second per km/h for as long as the error lasts. Those two numbers are what the log gets checked against.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1950" height="1050" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-p-versus-i-torque.png" alt="Chart of torque contribution against time for a constant 1 km/h speed error: P of 1.20 gives a flat 12 Nm, while I of 0.003, 0.005 and 0.007 ramp at 3, 5 and 7 Nm per second" class="wp-image-1213" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-p-versus-i-torque.png 1950w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-p-versus-i-torque-300x162.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-p-versus-i-torque-1024x551.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-p-versus-i-torque-768x414.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-p-versus-i-torque-1536x827.png 1536w" sizes="auto, (max-width: 1950px) 100vw, 1950px" /><figcaption class="wp-element-caption">P is a step, I is a ramp.</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">The sample log</h2>



<figure class="wp-block-image size-large"><img decoding="async" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/emtron-cruise-closed-loop-setup.png" alt="EMtune Cruise Closed Loop Setup screen: speed channel Front Axle Speed (Avg), proportional gain 1.20, integral gain 0.007, derivative gain 0.10, deadband 0.2 kph, maximum torque clamp 350 Nm, minimum torque clamp minus 50 Nm"/><figcaption class="wp-element-caption">The current calibration. The sample log below was recorded with Integral Gain at 0.003 and everything else as shown.</figcaption></figure>



<p class="wp-block-paragraph">The sample is one drive with cruise set three times, all in eighth gear at around 120 km/h, about four minutes of cruise in total. The longest engagement ran for just over three minutes on an ordinary undulating road.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-log-run-trace.png" alt="Logged cruise run at 120.8 km/h: road speed wanders between about 118 and 126 km/h over three minutes while Torque Target Base stays flat at 189 Nm and Torque Target Final moves between about 125 and 215 Nm"/><figcaption class="wp-element-caption">The longest run. Speed wanders slowly either side of target; base torque never moves.</figcaption></figure>



<p class="wp-block-paragraph">Summary of the three engagements, ignoring the first five seconds after each set:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Run</th><th>Target</th><th>Base torque</th><th>Max deviation</th><th>Mean absolute error</th><th>Time within ±1 km/h</th><th>Mean error</th></tr></thead><tbody><tr><td>1 (194 s)</td><td>120.8 km/h</td><td>189 Nm</td><td>5.6 km/h</td><td>1.9 km/h</td><td>32%</td><td>1.0 km/h over</td></tr><tr><td>2 (31 s)</td><td>120.2 km/h</td><td>190 Nm</td><td>4.2 km/h</td><td>1.2 km/h</td><td>49%</td><td>1.0 km/h over</td></tr><tr><td>3 (34 s)</td><td>119.3 km/h</td><td>215 Nm</td><td>6.4 km/h</td><td>2.9 km/h</td><td>42%</td><td>2.1 km/h over</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Deviations of up to about ±3 mph, slow rather than fast. The checks below work out why.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">What to look for</h2>



<h3 class="wp-block-heading">1. Is cruise using the speed you think it is?</h3>



<p class="wp-block-paragraph">Log <code>Cruise - Speed Input</code> alongside whichever channel you selected as the source. Here the source is <code>Front Axle Speed (Avg)</code>, and the two match sample for sample. On a rear-wheel-drive car that is the right source: the front wheels are undriven, so their speed is road speed, not road speed plus whatever slip the rear tyres are carrying.</p>



<p class="wp-block-paragraph">If the two channels disagree on your car, stop there. Nothing else in the analysis means anything until the controller and the log are looking at the same speed.</p>



<h3 class="wp-block-heading">2. What is base torque actually doing?</h3>



<p class="wp-block-paragraph">It is tempting to read <code>Cruise - Torque Target Base</code> as a live road-load estimate. In this log it isn&#8217;t. It is captured when SET is pressed (189, 190 and 215 Nm on the three runs) and then stays flat for the whole engagement. Every newton-metre of movement in Final is closed-loop correction.</p>



<p class="wp-block-paragraph">That makes the moment you press SET part of the calibration. Run 3 was set at 215 Nm, more than the car needed to hold 119 km/h, and it spent the whole run about 2 km/h over target with the controller holding a negative correction the entire time. The base is a starting point. Whatever it gets wrong, the closed loop has to carry.</p>



<h3 class="wp-block-heading">3. Does P match the setting?</h3>



<p class="wp-block-paragraph">Make a derived channel for the correction and plot it against speed error:</p>



<pre class="wp-block-code"><code>Speed Error = Cruise - Speed Target − Cruise - Speed Input
Correction  = Cruise - Torque Target Final − Cruise - Torque Target Base</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-log-p-response-scatter.png" alt="Scatter of torque correction against speed error for 5,436 logged samples, lying on a straight line with a fitted slope of 11.1 Nm per km/h against an expected 12 Nm per km/h"/><figcaption class="wp-element-caption">Every sample with cruise engaged. A straight line through the origin, with a flat step either side of zero.</figcaption></figure>



<p class="wp-block-paragraph">A straight-line fit gives 11.1 Nm per km/h, which looks slightly low against the 12 expected from P = 1.20. Look closely at the middle of the plot, though: the samples step flat across zero. That is the ±0.2 km/h deadband, and Emtron does not just zero the error inside it. It subtracts the deadband from the error everywhere:</p>



<pre class="wp-block-code"><code>P term = 10 × P × (|Speed Error| − deadband) × sign(Speed Error)</code></pre>



<p class="wp-block-paragraph">Fit against that instead and the slope comes out at 12.0 Nm per km/h, with every sample within 1 Nm of the line, which is the resolution of the logged torque channels. P is doing exactly what its setting says.</p>



<h3 class="wp-block-heading">4. Is the integral doing anything?</h3>



<p class="wp-block-paragraph">This is the check that matters most, and it falls straight out of check 3. Subtract the P term from the correction. Whatever is left is the integral and derivative:</p>



<pre class="wp-block-code"><code>Residual = Correction − P term</code></pre>



<p class="wp-block-paragraph">Then work out what the integral should have contributed. Accumulate the deadbanded speed error over the run and multiply by 1000 × I. For the long run in the sample, the error integrates to about −200 km/h·s. At I = 0.003 that is roughly −600 Nm of integral action, enough to pin the correction against the −50 Nm clamp for the second half of the run.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-log-integral-check.png" alt="Logged torque correction overlaid with a proportional-only reconstruction, which matches it almost exactly, and with the expected proportional plus integral correction at I 0.003, which diverges widely and sits on the minus 50 Nm clamp"/><figcaption class="wp-element-caption">The logged correction (black) and the P-only reconstruction (green dashed) are indistinguishable. The red line is what I = 0.003 should have added.</figcaption></figure>



<p class="wp-block-paragraph">In the sample log the residual is zero to within the 1 Nm logging resolution. The correction is proportional only. You can see the consequence on the road too: between about 85 and 110 seconds into the long run, the car sat 3 to 5 km/h over target while the correction barely moved. A working integrator would have kept pulling torque off for the whole of that period.</p>



<p class="wp-block-paragraph">When this check comes back empty, adjusting the integral gain is the wrong next move. Find out why the integrator is not contributing first: whether it is gated by a condition, scaled differently from what you expect, or whether the calibration in the car is not the one you think you loaded. If your firmware can log the individual cruise P, I and D outputs, log them.</p>



<h3 class="wp-block-heading">5. Translate the error into your own car</h3>



<p class="wp-block-paragraph">A proportional-only cruise controller always leaves a steady error when the load changes, because it needs an error to make torque. The size of that error is set by P and by your gearing, which is why nobody else&#8217;s numbers transfer.</p>



<p class="wp-block-paragraph">The extra engine torque a gradient demands:</p>



<pre class="wp-block-code"><code>ΔT_engine = (m × g × sin θ × r_tyre) / (gear ratio × final drive)</code></pre>



<p class="wp-block-paragraph">And the speed error a P-only controller settles at to deliver it:</p>



<pre class="wp-block-code"><code>Δv ≈ ΔT_engine / (10 × P) + deadband</code></pre>



<p class="wp-block-paragraph">For the Supra in eighth (about 0.67) with the 2.93 final drive, a 0.33 m tyre and roughly 1650 kg, a 2% gradient needs about 55 Nm more at the engine. At 12 Nm per km/h that is about 4.8 km/h of steady error, almost exactly the ±3 mph drift in the sample log.</p>



<p class="wp-block-paragraph">Put your own mass, tyre and gearing in and you will get a different number. A car cruising in a lower gear, or on a shorter final drive, sees less engine torque per percent of gradient and a smaller error for the same P.</p>



<h3 class="wp-block-heading">6. Is D visible?</h3>



<p class="wp-block-paragraph">Not at D = 0.10 in this sample. Once the P term is removed there is nothing left above the logging resolution, so nothing can be attributed to D either. At cruise the rate of change of speed error is small, and so is anything a derivative term makes from it.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Changes since the sample</h2>



<p class="wp-block-paragraph">Integral Gain has since gone from 0.003 to 0.005 and then to 0.007, one step at a time, with P held at 1.20, D at 0.10 and the deadband and clamps unchanged.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1950" height="1050" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-integral-gain-progression.png" alt="Bar chart of integral torque build-up rate at 1, 2 and 3 km/h of sustained error for I of 0.003, 0.005 and 0.007: 3, 6, 9; 5, 10, 15; and 7, 14, 21 Nm per second" class="wp-image-1211" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-integral-gain-progression.png 1950w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-integral-gain-progression-300x162.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-integral-gain-progression-1024x551.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-integral-gain-progression-768x414.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-integral-gain-progression-1536x827.png 1536w" sizes="auto, (max-width: 1950px) 100vw, 1950px" /><figcaption class="wp-element-caption">What each setting should add per second of sustained error, if the integrator is running.</figcaption></figure>



<p class="wp-block-paragraph">Each step gets judged by check 4 before anything else. A road test on its own cannot separate a better controller from a flatter road. If the residual is still flat at 0.007, the gain was never the problem.</p>



<h2 class="wp-block-heading">When the integral is working: what to expect</h2>



<p class="wp-block-paragraph">From torque to road speed, a car is close to a pure integrator: net torque sets acceleration, and speed is acceleration accumulated. Wrap a PI controller around that and you get a second-order loop whose damping depends on the ratio of the two gains:</p>



<pre class="wp-block-code"><code>k  = (gear ratio × final drive) / (r_tyre × m) × 3.6     km/h per second, per engine Nm
ζ ≈ (k × 10 × P) / (2 × √(k × 1000 × I))</code></pre>



<p class="wp-block-paragraph">Raise I with P fixed and the loop recovers faster but with less damping. For the Supra&#8217;s numbers, damping falls from about 0.39 at I = 0.003 to 0.26 at I = 0.007, and P would need to be around 1.8 to 1.9 to hold the original damping. Your k is different, so your numbers will be too.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2100" height="1110" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-gain-progression-model-prediction.png" alt="Simulated speed traces for P 1.20 with I 0.003, 0.005 and 0.007, plus P 1.86 with I 0.007, through the same climb. Higher integral recovers faster but crosses target more; raising P alongside it settles fastest" class="wp-image-1216" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-gain-progression-model-prediction.png 2100w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-gain-progression-model-prediction-300x159.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-gain-progression-model-prediction-1024x541.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-gain-progression-model-prediction-768x406.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-gain-progression-model-prediction-1536x812.png 1536w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-gain-progression-model-prediction-2048x1083.png 2048w" sizes="auto, (max-width: 2100px) 100vw, 2100px" /><figcaption class="wp-element-caption">Model, not a log. The trend is the point: more I alone means more crossing of target, and P is what buys the damping back.</figcaption></figure>



<p class="wp-block-paragraph">Each tuning error then has its own signature in the speed trace:</p>



<ul class="wp-block-list">
<li><strong>Too little P:</strong> weak immediate correction. The car sags at the start of every disturbance.</li>



<li><strong>Too much P:</strong> fast oscillation around target, set by the delay in the torque path.</li>



<li><strong>Too little or no I:</strong> a steady offset that follows the gradient, which is what the sample log shows.</li>



<li><strong>Too much I:</strong> slow overshoot and repeated crossing of target.</li>



<li><strong>D:</strong> works on acceleration, which is small and noisy at cruise. If overshoot appears, P is usually the stronger lever.</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2100" height="1260" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-tuning-failure-modes.png" alt="Four simulated speed traces for the same two-percent climb: too little integral drifts slowly, too much integral overshoots repeatedly, too much proportional oscillates quickly around target, and matched gains recover and settle" class="wp-image-1212" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-tuning-failure-modes.png 2100w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-tuning-failure-modes-300x180.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-tuning-failure-modes-1024x614.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-tuning-failure-modes-768x461.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-tuning-failure-modes-1536x922.png 1536w, https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-pid-tuning-failure-modes-2048x1229.png 2048w" sizes="auto, (max-width: 2100px) 100vw, 2100px" /><figcaption class="wp-element-caption">Illustrative simulation, not logged data. Fast wobble points at P, slow wobble at I.</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Log layout</h2>



<p class="wp-block-paragraph">Everything above comes from four panels and three derived channels.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://blownbytwins.co.uk/wp-content/uploads/2026/10/cruise-log-layout-v2.png" alt="Suggested four-panel log layout: speed panel with speed target, speed input and derived speed error; torque panel with base and final torque targets and derived correction and residual; throttle panel with DBW target, DBW actual and throttle area demand; context panel with MAP, gear and shift state"/><figcaption class="wp-element-caption">If the residual is anything other than flat, that is your integral and derivative at work.</figcaption></figure>



<p class="wp-block-paragraph">Gear and shift state are there to exclude kickdowns and upshifts. They change the torque-to-speed relationship mid-run and will look like controller misbehaviour if left in.</p>



<h2 class="wp-block-heading">Current configuration</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Parameter</th><th>Value</th></tr></thead><tbody><tr><td>Speed source</td><td>Front Axle Speed (Avg)</td></tr><tr><td>Proportional Gain</td><td>1.20</td></tr><tr><td>Integral Gain</td><td>0.007 (sample log at 0.003)</td></tr><tr><td>Derivative Gain</td><td>0.10</td></tr><tr><td>Deadband</td><td>±0.2 km/h</td></tr><tr><td>Maximum Torque Clamp</td><td>+350 Nm</td></tr><tr><td>Minimum Torque Clamp</td><td>−50 Nm</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">The broader point</h2>



<p class="wp-block-paragraph">On a torque-managed standalone, cruise depends on the ECU understanding throttle area, airflow, engine torque, DBW response, road speed and transmission state. Get any of those wrong and cruise will find it.</p>



<p class="wp-block-paragraph">The sample log is a good example of why gains should be derived from the log rather than from how the car feels. The drift looked like a weak integral. The log showed P working exactly as set, a base torque frozen at the moment SET was pressed, and an integral contributing nothing at all. Three different facts, and only one of them is about the integral gain.</p>



<p class="wp-block-paragraph">Run the same six checks on your own log before you change a number.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Part of the Emtron KV12 series on a 3.4 litre 2JZ. Cruise leans on the same torque model as the <a href="https://blownbytwins.co.uk/?p=1118">traction control strategy</a> and the <a href="https://blownbytwins.co.uk/cars/mk4-supra/throttle-body-effective-area/">throttle-area table</a> underneath both. Full specification is on the <a href="https://blownbytwins.co.uk/toyota-supra-mk4-delta/">Supra project page</a>.</em></p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/supra-cruise-control-emtron-pid-tuning/">Tuning Cruise Control on a 1,000+ bhp Toyota Supra</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/supra-cruise-control-emtron-pid-tuning/">Tuning Cruise Control on a 1,000+ bhp Toyota Supra</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Speeding in Europe 2026: What UK Drivers Actually Risk</title>
		<link>https://blownbytwins.co.uk/general/speeding-in-europe-uk-drivers/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Thu, 01 Oct 2026 11:11:08 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Driving in Europe]]></category>
		<category><![CDATA[Speeding Fines]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1188</guid>

					<description><![CDATA[<p>Speeding fines, licence bans and criminal thresholds for UK drivers in nine European countries in 2026, plus whether a camera fine will follow you home after Brexit.</p>
<p>The post <a href="https://blownbytwins.co.uk/general/speeding-in-europe-uk-drivers/">Speeding in Europe 2026: What UK Drivers Actually Risk</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/general/speeding-in-europe-uk-drivers/">Speeding in Europe 2026: What UK Drivers Actually Risk</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Most &#8220;speeding in Europe&#8221; tables online date from 2019–2020, and several big things have changed since. France made driving 50 km/h or more over the limit a criminal offence in December 2025, Austria now seizes cars for extreme speeding, and the Netherlands raises its fines every January.</p>



<p class="wp-block-paragraph">This guide covers the countries UK drivers most often drive through on a continental trip. Every figure below was checked against 2026 sources on 1 October 2026. Fines change often, so check again before you travel. This is general information, not legal advice.</p>



<h2 class="wp-block-heading">Will a camera fine follow you home?</h2>



<p class="wp-block-paragraph">Possibly, and the odds are rising. Do not plan a trip around the idea that it won&#8217;t.</p>



<p class="wp-block-paragraph">Until the end of 2020 the UK was part of the EU&#8217;s cross-border enforcement scheme, which let any member state look up a UK car&#8217;s keeper and post the fine. Since 1 January 2021 that has not applied, so camera fines have mostly not reached UK addresses (<a href="https://www.autoexpress.co.uk/news/366859/drivers-face-crackdown-unpaid-european-speeding-fines-after-eu-uk-reset-deal" target="_blank" rel="noopener">Auto Express</a>). Some still did: French fines have kept turning up in UK post, even though the DVLA had released no keeper data to France under the old rules by mid-2025 (<a href="https://www.connexionfrance.com/news/mystery-of-driving-fines-sent-from-france-to-uk-homes-post-brexit/725804" target="_blank" rel="noopener">Connexion</a>).</p>



<p class="wp-block-paragraph">Three things close that gap:</p>



<ul class="wp-block-list">
<li><strong>Roadside stops.</strong> Brexit never changed these. If police pull you over, you pay there and then.</li>



<li><strong>Hire cars.</strong> The rental firm hands over your details and usually adds an admin fee on top of the fine.</li>



<li><strong>Data sharing is coming back.</strong> The May 2025 UK–EU summit agreed to finish setting up automated vehicle-registration data exchange. In mid-2026 UK police gained number-plate lookups through the EU&#8217;s Prüm system, with EU police able to request DVLA data in return (<a href="https://thegovernmentsays-files.s3.amazonaws.com/content/190/1906803.html" target="_blank" rel="noopener">GOV.UK announcement</a>). That system is framed around serious crime; whether it will be used for camera fines had not been announced when this was written.</li>
</ul>



<p class="wp-block-paragraph">Separately, the EU has tightened its own cross-border rules (Directive 2024/3237, in force across member states by 20 July 2027), adding cross-border help with collecting unpaid fines (<a href="https://oeil.europarl.europa.eu/oeil/en/document-summary?id=1800147" target="_blank" rel="noopener">European Parliament summary</a>). That covers EU-registered cars, not UK ones, but it shows the direction of travel.</p>



<p class="wp-block-paragraph">A foreign speeding fine does not normally put points on a UK licence. An unpaid one can still be demanded the next time you are stopped in that country.</p>



<h2 class="wp-block-heading">Country by country</h2>



<p class="wp-block-paragraph">Germany and Spain are among the cheapest places to get a ticket; Norway and Switzerland are the dearest. Each row is one speed limit. It shows the fine at 20 km/h over, then the speed at which you risk your licence, then the speed at which it becomes a criminal case. All speeds are km/h, after the police measuring margin.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Country</th><th>Limit (km/h)</th><th>Fine at 20 km/h over</th><th>Licence withdrawn from</th><th>Criminal offence (court, possible jail) from</th></tr></thead><tbody><tr><td><a href="https://www.permisapoints.fr/infraction-et-legislation/exces-de-vitesse" target="_blank" rel="noopener">France</a></td><td>50</td><td>70: €135</td><td>90</td><td>100</td></tr><tr><td></td><td>80</td><td>100: €135 (€68 below 100)</td><td>120</td><td>130</td></tr><tr><td></td><td>90</td><td>110: €135</td><td>130</td><td>140</td></tr><tr><td></td><td>110 (motorway in rain)</td><td>130: €135</td><td>150</td><td>160</td></tr><tr><td></td><td>130</td><td>150: €135</td><td>170</td><td>180</td></tr><tr><td><a href="https://www.bussgeldrechner.org/geschwindigkeitsueberschreitung.html" target="_blank" rel="noopener">Germany</a></td><td>50</td><td>70: €70 (71 or more: €115)</td><td>81 (1-month ban)</td><td>—</td></tr><tr><td></td><td>100</td><td>120: €60 (121 or more: €100)</td><td>141</td><td>—</td></tr><tr><td></td><td>120 (signed motorway)</td><td>140: €60 (141 or more: €100)</td><td>161</td><td>—</td></tr><tr><td></td><td>Unrestricted Autobahn</td><td>No limit</td><td>—</td><td>—</td></tr><tr><td><a href="https://www.motor16.com/las-ultimas-noticias/multas-exceso-velocidad-2026-tabla-dgt/" target="_blank" rel="noopener">Spain</a></td><td>30</td><td>50: €100</td><td>—</td><td>90</td></tr><tr><td></td><td>50</td><td>70: €100</td><td>—</td><td>110</td></tr><tr><td></td><td>90</td><td>110: €100</td><td>—</td><td>170</td></tr><tr><td></td><td>120</td><td>140: €100</td><td>—</td><td>200</td></tr><tr><td><a href="https://assicurazioni.segugio.it/news-assicurazioni/quali-sanzioni-per-l-eccesso-di-velocita-00040079.html" target="_blank" rel="noopener">Italy</a></td><td>50</td><td>70: €173–695</td><td>91 (1–3 months); 111 (6–12 months)</td><td>—</td></tr><tr><td></td><td>90</td><td>110: €173–695</td><td>131; 151</td><td>—</td></tr><tr><td></td><td>110</td><td>130: €173–695</td><td>151; 171</td><td>—</td></tr><tr><td></td><td>130</td><td>150: €173–695</td><td>171; 191</td><td>—</td></tr><tr><td><a href="https://www.anwb.nl/verkeer/nieuws/nederland/2025/oktober/boetebedragen-2026" target="_blank" rel="noopener">Netherlands</a></td><td>50</td><td>70: €255 + €9 admin</td><td>100</td><td>81</td></tr><tr><td></td><td>80</td><td>100: €243 + €9</td><td>130</td><td>111</td></tr><tr><td></td><td>100 (motorway by day)</td><td>120: €229 + €9</td><td>150</td><td>141</td></tr><tr><td></td><td>130</td><td>150: €229 + €9</td><td>180</td><td>171</td></tr><tr><td><a href="https://www.codedelaroute.be/fr/reglementation/download/2014014161~kcbyzdoybt" target="_blank" rel="noopener">Belgium</a></td><td>30</td><td>50: €163</td><td>61</td><td>61</td></tr><tr><td></td><td>50</td><td>70: €163</td><td>81</td><td>81</td></tr><tr><td></td><td>70</td><td>90: €113</td><td>111</td><td>111</td></tr><tr><td></td><td>90</td><td>110: €113</td><td>131</td><td>131</td></tr><tr><td></td><td>120</td><td>140: €113</td><td>161</td><td>161</td></tr><tr><td><a href="https://www.ch.ch/en/driving-over-speed-limit" target="_blank" rel="noopener">Switzerland</a></td><td>50</td><td>70: no fixed fine, reported to prosecutor</td><td>71 (at least 1 month)</td><td>100</td></tr><tr><td></td><td>80</td><td>100: CHF 240</td><td>106</td><td>140</td></tr><tr><td></td><td>120</td><td>140: CHF 180</td><td>151</td><td>200</td></tr><tr><td><a href="https://www.maut1.de/en/blog/austria-speeding-fines" target="_blank" rel="noopener">Austria</a></td><td>50</td><td>70: set regionally</td><td>90; car seized 111; can be auctioned 131</td><td>—</td></tr><tr><td></td><td>100</td><td>120: set regionally</td><td>150; car seized 171; can be auctioned 191</td><td>—</td></tr><tr><td></td><td>130</td><td>150: set regionally</td><td>180; car seized 201; can be auctioned 221</td><td>—</td></tr><tr><td><a href="https://www.smartepenger.no/forbruker/2904-fartsboter" target="_blank" rel="noopener">Norway</a></td><td>50</td><td>70: NOK 8,650</td><td>76</td><td>—</td></tr><tr><td></td><td>80</td><td>100: NOK 7,450</td><td>116</td><td>—</td></tr><tr><td></td><td>100</td><td>120: NOK 7,450</td><td>141</td><td>—</td></tr></tbody></table></figure>



<ul class="wp-block-list">
<li>A dash means no fixed threshold. </li>



<li>Germany treats speeding as a crime only under its illegal-racing law. </li>



<li>Spain uses penalty points rather than a set ban speed; bans come with a criminal conviction. </li>



<li>The Netherlands has the &#8220;criminal&#8221; column is where the prosecutor, not a fixed tariff, sets the penalty. </li>



<li>Norway&#8217;s jail thresholds were not verified for this guide.</li>
</ul>



<p class="wp-block-paragraph">Two caveats. Fines are in local currency and euro figures drift with inflation; the Netherlands has already published higher 2027 rates. And police subtract a measuring margin before working out the fine, 3 km/h below 100 km/h and 3% above it in Germany and the Netherlands, and 5 km/h or 5% in France and Italy, so the speed on the radar will be a little higher than the figures above.</p>



<h2 class="wp-block-heading">Where it stops being a fine</h2>



<p class="wp-block-paragraph">In several countries, a big enough number means a criminal record, a court date or losing the car itself, and that applies to foreign drivers and to cars they don&#8217;t own.</p>



<ul class="wp-block-list">
<li><strong>France, 50 km/h or more over (since 29 December 2025).</strong> Now a criminal offence on a first offence. Usually settled by a €300 fixed penalty (€250 if paid quickly, €600 if late), but a court can impose up to €3,750, three months in prison, a suspension of up to three years and confiscation of the vehicle (<a href="https://www.beedriver.fr/blog/grand-exces-vitesse-delit-2026" target="_blank" rel="noopener">Beedriver</a>).</li>



<li><strong>Austria, 60 over in town or 70 over outside (since 1 March 2024).</strong> Police can seize the car on the spot. At 80 over in town or 90 outside, or for repeat offenders, it can be confiscated for good and auctioned, even if it is hired or leased. Fines go up to €7,500 (<a href="https://www.maut1.de/en/blog/austria-speeding-fines" target="_blank" rel="noopener">Maut1</a>). By the end of 2025, 438 cars had been provisionally seized (<a href="https://www.vienna.at/?p=9984695" target="_blank" rel="noopener">Vienna.at</a>).</li>



<li><strong>Switzerland, 50 over in town, 60 outside or 80 on a motorway.</strong> Classed as reckless &#8220;Raser&#8221; driving, with prison of one to four years and very large fines (<a href="https://www.ch.ch/en/driving-over-speed-limit" target="_blank" rel="noopener">ch.ch</a>).</li>



<li><strong>Spain, 60 over in town or 80 over elsewhere.</strong> Can be prosecuted as a crime under the Penal Code (<a href="https://www.motorpasion.com/revision/multas-exceso-velocidad" target="_blank" rel="noopener">Motorpasión</a>).</li>



<li><strong>Denmark.</strong> Its &#8220;insane driving&#8221; rules allow the car to be confiscated for extreme speeding, including driving at more than double the limit (<a href="https://fdm.dk/guides/regler/boedetakst-koere-staerkt-bil" target="_blank" rel="noopener">FDM</a>).</li>
</ul>



<h2 class="wp-block-heading">If you get pulled over</h2>



<p class="wp-block-paragraph">Expect to pay before you drive away. Police in much of Europe ask non-resident drivers to pay the fine on the spot or leave a cash or card deposit, and can hold the car until you do.</p>



<ul class="wp-block-list">
<li>Carry a card that works abroad and some cash in local currency (francs in Switzerland, kroner in Norway).</li>



<li>Ask for an official receipt or ticket for anything you pay.</li>



<li>Paying quickly is often cheaper: Spain halves the fine if paid within 20 days, and France has a reduced rate for prompt payment.</li>



<li>In a hire car, assume the fine will reach you through the rental company, with their admin charge added.</li>
</ul>



<h2 class="wp-block-heading">Radar detectors and camera apps</h2>



<p class="wp-block-paragraph">Leave the radar detector at home. A device that is legal in the UK is illegal to use in France and Germany (<a href="https://www.confused.com/car-insurance/guides/radar-detectors" target="_blank" rel="noopener">Confused.com</a>), and in France and Switzerland one can be confiscated even if it is switched off (<a href="https://tyremap.com/blog/radar-detector-apps-legal-europe/" target="_blank" rel="noopener">Tyremap</a>). In Germany, a driver using a detector or a camera-warning app faces a €75 fine and a point (<a href="https://mcparking.de/en/speed-camera-apps-radar-detectors-can-be-used" target="_blank" rel="noopener">McParking</a>).</p>



<p class="wp-block-paragraph">Phone apps are a grey area that changes country by country. The simplest safe setup is to turn off camera alerts and keep the speed-limit display on.</p>



<h2 class="wp-block-heading">Before you go</h2>



<ul class="wp-block-list">
<li>Check the limits for every country on your route; Dutch motorways drop to 100 km/h by day, and much of Brussels is 30.</li>



<li>Remove or switch off any radar detector, and turn off camera alerts in your sat-nav or phone.</li>



<li>Pack a card that works abroad and some local cash for roadside fines.</li>



<li>If you get a fine in the post, check it is genuine with the issuing authority before paying.</li>
</ul>



<p class="wp-block-paragraph">Figures were checked against the linked 2026 sources on 1 October 2026. Fine levels change, often every January, so treat anything older than a few months with caution.</p><p>The post <a href="https://blownbytwins.co.uk/general/speeding-in-europe-uk-drivers/">Speeding in Europe 2026: What UK Drivers Actually Risk</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/general/speeding-in-europe-uk-drivers/">Speeding in Europe 2026: What UK Drivers Actually Risk</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tuning VVT-i Properly: From Chasing Errors to an Oil-Temperature-Compensated PID</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/vvt-i-oil-temperature-compensated-pid/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 20:59:53 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1184</guid>

					<description><![CDATA[<p>How oil temperature changes what the 2JZ-GTE's VVT-i controller needs, and the path from fixed feed-forward to an oil-temperature-compensated PID on the Emtron KV12.</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/vvt-i-oil-temperature-compensated-pid/">Tuning VVT-i Properly: From Chasing Errors to an Oil-Temperature-Compensated PID</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/vvt-i-oil-temperature-compensated-pid/">Tuning VVT-i Properly: From Chasing Errors to an Oil-Temperature-Compensated PID</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>One of the recurring themes with the Supra has been that once the obvious problems are fixed, the remaining calibration work becomes less about making something work and more about understanding why it behaves differently under different conditions.</p>
<p>The VVT-i control on the 3.4-litre 2JZ-GTE has been a good example.</p>
<p>The car wasn&#8217;t suffering from some catastrophic VVT-i failure. The cam moved, the ECU controlled it and, once everything was properly hot, it could track the requested position extremely accurately.</p>
<p>What caught my attention was that it wasn&#8217;t equally good all the time.</p>
<p>The further I dug into the logs, the clearer it became that oil temperature was having a significant effect on what the VVT-i controller needed to do.</p>
<p>This is the journey from a conventional PID setup, through feed-forward changes and temperature-dependent duty-cycle limits, to the new oil-temperature-compensated PID strategy we&#8217;re about to test.</p>
<h2>The starting point</h2>
<p>The VVT-i system is controlled by the Emtron KV12 using closed-loop PID control.</p>
<p>In simple terms, the ECU has a requested inlet cam position and an actual measured cam position. The difference between those two is the <strong>VVT Target Error</strong>.</p>
<p>The PID controller then uses three components to correct it:</p>
<ul>
<li><strong>Proportional (P)</strong> reacts to the current error.</li>
<li><strong>Integral (I)</strong> reacts to error accumulated over time.</li>
<li><strong>Derivative (D)</strong> reacts to how quickly that error is changing.</li>
</ul>
<p>There is also a <strong>Feed Forward</strong> duty cycle. Rather than asking the PID to generate the entire solenoid command itself, feed-forward provides a baseline duty cycle that should put the VVT mechanism somewhere close to where it needs to be. PID then deals with the remaining error.</p>
<p>That distinction became important.</p>
<h2>The first clue: the Integral was doing too much work</h2>
<p>The original VVT feed-forward was around 34% DC.</p>
<p>Looking through the logs, the VVT system would track the target, but the Integral controller was regularly having to add substantial duty cycle.</p>
<p>That tells you something.</p>
<p>If the controller repeatedly needs Integral to provide the same correction, Integral isn&#8217;t really correcting a transient disturbance any more. It&#8217;s compensating for an inaccurate baseline.</p>
<p>So I increased VVT feed-forward to 41% DC.</p>
<p>At the same time, I reduced the VVT deadband to ±0.4°.</p>
<p>The deadband is simply the region around the target where the ECU stops trying to correct tiny errors. There&#8217;s no benefit in constantly moving the VVT solenoid because the cam is 0.1° away from target. That can simply introduce unnecessary activity and oscillation.</p>
<p>The initial results with 41% were interesting.</p>
<p>When fully hot, they were excellent.</p>
<p>When cold, they weren&#8217;t.</p>
<h2>Oil temperature was the missing variable</h2>
<p>Once I started analysing the VVT logs against engine oil temperature, a very obvious pattern appeared.</p>
<p>With the fixed 41% feed-forward, the approximate Integral correction looked like this:</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Oil temperature</th>
<th>Typical Integral correction</th>
</tr>
</thead>
<tbody>
<tr>
<td>Cold</td>
<td>~-7% DC</td>
</tr>
<tr>
<td>80–85°C</td>
<td>~-4% DC</td>
</tr>
<tr>
<td>90–95°C</td>
<td>~-2 to -2.5% DC</td>
</tr>
<tr>
<td>96–100°C</td>
<td>~-1% DC</td>
</tr>
</tbody>
</table>
</figure>
<p>At approximately 96–100°C oil temperature, VVT control was exceptionally good.</p>
<p>One of the hot boost logs produced approximately:</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Metric</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mean VVT target error</td>
<td>+0.04°</td>
</tr>
<tr>
<td>Median absolute error</td>
<td>~0.4°</td>
</tr>
<tr>
<td>Mean Integral correction</td>
<td>~-1% DC</td>
</tr>
</tbody>
</table>
</figure>
<p>That is basically where I wanted it.</p>
<p>The feed-forward gets the system very close, the PID makes small corrections, and the actual cam follows the requested position accurately.</p>
<p>But look at the other end of the temperature range.</p>
<p>Cold, the Integral controller was approaching its -8% DC clamp.</p>
<p>That immediately suggested the problem wasn&#8217;t fundamentally the PID gains.</p>
<p>The hydraulic system itself was changing.</p>
<h2>VVT-i is an oil-pressure-operated system</h2>
<p>This sounds obvious once you say it, but it matters enormously to the calibration.</p>
<p>The Toyota VVT-i mechanism is hydraulic.</p>
<p>Change the oil temperature and you change the viscosity of the oil. That changes the behaviour of the solenoid and cam phaser for a given electrical duty cycle.</p>
<p>So why should we expect one fixed solenoid feed-forward duty to be correct at 20°C oil temperature and still be correct at 100°C?</p>
<p>We shouldn&#8217;t.</p>
<p>The logs were effectively showing us that.</p>
<p>This also explained why I didn&#8217;t want to start aggressively changing the P, I and D gains simply because the cold behaviour looked different.</p>
<p>Once the oil was properly hot, the PID was already working extremely well.</p>
<p>Changing a good PID to compensate for an incorrect hydraulic baseline would have been fixing the wrong thing.</p>
<h2>The feature request to Emtron</h2>
<p>The obvious solution seemed to be a temperature-dependent VVT feed-forward table.</p>
<p>Rather than:</p>
<p><code>Feed Forward = 41% DC</code></p>
<p>I wanted something conceptually closer to:</p>
<p><code>Oil temperature → appropriate base VVT solenoid duty</code></p>
<p>Potentially, the ideal implementation could eventually become a two-dimensional table using both oil temperature and engine speed.</p>
<p>I submitted the calibration and logs to Emtron as a feature request.</p>
<p>Nick Pavloski from Emtron came back with a pragmatic answer.</p>
<p>The requested change was unlikely to happen at this stage of the firmware development, but he suggested using the existing Min/Max Duty Cycle tables and their flexible axes to achieve what I needed.</p>
<p>That sent the calibration in a slightly different direction.</p>
<h2>Using the VVT duty limits properly</h2>
<p>The existing calibration already had temperature-dependent minimum and maximum VVT solenoid duty tables.</p>
<p>Originally, the minimum was essentially fixed at 10%, while maximum duty jumped from around 40% when cold to 80% once warm.</p>
<p>Rather than treating these purely as broad safety limits, I could use oil temperature as the flexible axis and progressively release VVT actuator authority as the oil warmed.</p>
<p>This isn&#8217;t exactly the same thing as temperature-dependent feed-forward.</p>
<p>That&#8217;s important.</p>
<p>Feed-forward moves the controller&#8217;s baseline operating point.</p>
<p>A Max DC table limits how much duty the controller is allowed to command.</p>
<p>Those are fundamentally different control strategies.</p>
<p>But I had the facility available, Emtron had recommended using it, and most importantly I could test the result objectively.</p>
<p>So I did.</p>
<h2>The revised limits worked</h2>
<p>The first useful cold-to-warm log with the revised limits was considerably better than I expected.</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Oil temperature</th>
<th>Mean VVT error</th>
<th>Median absolute error</th>
<th>95th-percentile absolute error</th>
</tr>
</thead>
<tbody>
<tr>
<td>60–70°C, before</td>
<td>-1.21°</td>
<td>1.2°</td>
<td>3.7°</td>
</tr>
<tr>
<td>60–70°C, revised limits</td>
<td>-0.08°</td>
<td>0.3°</td>
<td>0.6°</td>
</tr>
<tr>
<td>Above 70°C, revised limits</td>
<td>~-0.09°</td>
<td>~0.4°</td>
<td>—</td>
</tr>
</tbody>
</table>
</figure>
<p>That is extremely accurate tracking.</p>
<p>So this wasn&#8217;t a tiny change visible only because we&#8217;d tortured the data sufficiently.</p>
<p>The improvement was substantial.</p>
<p>It also gave some useful validation to another calibration decision on the car.</p>
<p>I already have a warning light that remains active until engine oil exceeds 70°C. I don&#8217;t start using the car hard until that light goes out, and I also require the ZF 8HP gearbox to be above 40°C.</p>
<p>Previously I&#8217;d considered 90–95°C oil the point where VVT behaviour really became trustworthy.</p>
<p>With the revised VVT control, that changed.</p>
<p>By 60–70°C, the cam tracking was already extremely good.</p>
<p>The 70°C threshold now corresponds quite nicely with the point where the VVT system has demonstrated that it is properly under control.</p>
<h2>But the Integral still told us something</h2>
<p>Although actual cam tracking had improved dramatically, one thing hadn&#8217;t disappeared.</p>
<p>The Integral remained substantially negative during warm-up.</p>
<p>That means the underlying issue hasn&#8217;t magically vanished. The controller is still compensating for the relationship between fixed feed-forward duty and changing hydraulic behaviour.</p>
<p>The duty limits have given us a very effective workaround, but they haven&#8217;t fundamentally turned the fixed 41% feed-forward into a temperature-dependent feed-forward model.</p>
<p>Then I found another useful capability in EMtune.</p>
<p>The PID tables themselves can have a second axis.</p>
<p>And that axis can be Engine Oil Temperature.</p>
<p>That gives us another tool.</p>
<h2>Moving from 2D to 3D PID control</h2>
<p>Previously, each PID gain was effectively a one-dimensional table.</p>
<p>For example, proportional gain changed according to VVT Target Error.</p>
<p>Now I can retain Target Error on the X-axis and add Engine Oil Temperature on the Y-axis.</p>
<p>That means the controller can behave differently at 20°C oil temperature than it does at 100°C.</p>
<p>But there was an obvious trap here.</p>
<p>Just because the software gives you another axis doesn&#8217;t mean you should use it aggressively.</p>
<p>The hot VVT calibration was already excellent.</p>
<p>So the new strategy deliberately leaves the hot calibration alone.</p>
<p>The oil-temperature breakpoints are: <strong>20 / 40 / 60 / 70 / 80 / 100°C</strong></p>
<ul>
<li>From 80°C upwards, the original proven PID values remain unchanged.</li>
<li>Below 80°C, P and I are progressively softened.</li>
<li>Derivative remains unchanged across the entire temperature range.</li>
</ul>
<h2>The new Proportional table</h2>
<p>The original hot P calibration is retained at 80°C and above. Columns are VVT Target Error; rows are engine oil temperature.</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Oil temp</th>
<th>-12°</th>
<th>-8°</th>
<th>-4°</th>
<th>-2°</th>
<th>+2°</th>
<th>+4°</th>
<th>+8°</th>
<th>+12°</th>
</tr>
</thead>
<tbody>
<tr>
<td>20°C</td>
<td>1.55</td>
<td>0.95</td>
<td>0.92</td>
<td>0.90</td>
<td>0.90</td>
<td>0.95</td>
<td>1.10</td>
<td>1.25</td>
</tr>
<tr>
<td>40°C</td>
<td>1.60</td>
<td>0.98</td>
<td>0.95</td>
<td>0.93</td>
<td>0.93</td>
<td>0.98</td>
<td>1.14</td>
<td>1.30</td>
</tr>
<tr>
<td>60°C</td>
<td>1.70</td>
<td>1.00</td>
<td>0.98</td>
<td>0.96</td>
<td>0.96</td>
<td>1.01</td>
<td>1.18</td>
<td>1.35</td>
</tr>
<tr>
<td>70°C</td>
<td>1.75</td>
<td>1.03</td>
<td>1.00</td>
<td>0.98</td>
<td>0.98</td>
<td>1.03</td>
<td>1.21</td>
<td>1.38</td>
</tr>
<tr>
<td>80°C</td>
<td>1.80</td>
<td>1.05</td>
<td>1.02</td>
<td>0.99</td>
<td>0.99</td>
<td>1.05</td>
<td>1.23</td>
<td>1.41</td>
</tr>
<tr>
<td>100°C</td>
<td>1.80</td>
<td>1.05</td>
<td>1.02</td>
<td>0.99</td>
<td>0.99</td>
<td>1.05</td>
<td>1.23</td>
<td>1.41</td>
</tr>
</tbody>
</table>
</figure>
<p>This isn&#8217;t a radical change.</p>
<p>That&#8217;s deliberate.</p>
<p>The proportional controller wasn&#8217;t broken.</p>
<h2>Integral gets the bigger change</h2>
<p>Integral is where temperature compensation potentially has more value.</p>
<p>The new table progressively reduces Integral gain as oil temperature falls:</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Oil temp</th>
<th>-20°</th>
<th>-10°</th>
<th>-3°</th>
<th>-1°</th>
<th>+1°</th>
<th>+3°</th>
<th>+10°</th>
<th>+20°</th>
</tr>
</thead>
<tbody>
<tr>
<td>20°C</td>
<td>0</td>
<td>0.003</td>
<td>0.020</td>
<td>0.012</td>
<td>0.012</td>
<td>0.020</td>
<td>0.002</td>
<td>0</td>
</tr>
<tr>
<td>40°C</td>
<td>0</td>
<td>0.003</td>
<td>0.024</td>
<td>0.015</td>
<td>0.015</td>
<td>0.024</td>
<td>0.002</td>
<td>0</td>
</tr>
<tr>
<td>60°C</td>
<td>0</td>
<td>0.004</td>
<td>0.029</td>
<td>0.018</td>
<td>0.018</td>
<td>0.029</td>
<td>0.002</td>
<td>0</td>
</tr>
<tr>
<td>70°C</td>
<td>0</td>
<td>0.004</td>
<td>0.033</td>
<td>0.020</td>
<td>0.020</td>
<td>0.033</td>
<td>0.003</td>
<td>0</td>
</tr>
<tr>
<td>80°C</td>
<td>0</td>
<td>0.005</td>
<td>0.036</td>
<td>0.022</td>
<td>0.022</td>
<td>0.036</td>
<td>0.003</td>
<td>0</td>
</tr>
<tr>
<td>100°C</td>
<td>0</td>
<td>0.005</td>
<td>0.036</td>
<td>0.022</td>
<td>0.022</td>
<td>0.036</td>
<td>0.003</td>
<td>0</td>
</tr>
</tbody>
</table>
</figure>
<p>Again, above 80°C nothing changes.</p>
<p>The objective isn&#8217;t to hide the fact that Integral wants to correct the baseline. Reducing I gain cannot fix an incorrect feed-forward value.</p>
<p>It simply stops the Integral controller aggressively accumulating correction while the cold hydraulic system is simultaneously being constrained by the temperature-dependent duty limits.</p>
<h2>And Derivative?</h2>
<p>I left it alone.</p>
<p>Every temperature row uses the existing values:</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Oil temp</th>
<th>Bp 1</th>
<th>Bp 2</th>
<th>Bp 3</th>
<th>Bp 4</th>
<th>Bp 5</th>
<th>Bp 6</th>
<th>Bp 7</th>
<th>Bp 8</th>
</tr>
</thead>
<tbody>
<tr>
<td>All (20–100°C)</td>
<td>0</td>
<td>2.00</td>
<td>2.40</td>
<td>2.40</td>
<td>2.40</td>
<td>2.40</td>
<td>1.60</td>
<td>0</td>
</tr>
</tbody>
</table>
</figure>
<p>There is currently no evidence that D needs temperature compensation.</p>
<p>Adding another variable because the software allows it is exactly how calibrations become unnecessarily complicated.</p>
<p>If future logs demonstrate a genuine temperature-dependent damping problem, I&#8217;ll change it.</p>
<p>Until then, D stays where it is.</p>
<h2>Establishing a proper baseline</h2>
<p>Before testing the new 3D PID, I logged the previous calibration fully warm.</p>
<p>That gives us something important: a benchmark.</p>
<p>At approximately 76–81°C oil temperature, the previous PID was already producing:</p>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Metric</th>
<th>Previous PID, 76–81°C oil</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mean VVT error</td>
<td>~0°</td>
</tr>
<tr>
<td>Median absolute error</td>
<td>0.2–0.3°</td>
</tr>
<tr>
<td>95th-percentile absolute error</td>
<td>0.5–0.7°</td>
</tr>
<tr>
<td>Time in Deadband state</td>
<td>~82% of valid samples</td>
</tr>
</tbody>
</table>
</figure>
<p>That&#8217;s very good.</p>
<p>So the new PID doesn&#8217;t get declared successful simply because a graph looks tidy.</p>
<p>It has to beat — or at minimum preserve — what I already have.</p>
<p>At 70–80°C, if the new calibration produces materially worse tracking than roughly 0.3° median absolute error, it has failed.</p>
<p>I&#8217;ll revert it.</p>
<h2>Where the calibration stands now</h2>
<figure class="wp-block-table">
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Setting</th>
</tr>
</thead>
<tbody>
<tr>
<td>Feed Forward</td>
<td>41% DC</td>
</tr>
<tr>
<td>Deadband</td>
<td>±0.4°</td>
</tr>
<tr>
<td>Integral clamp</td>
<td>±8% DC</td>
</tr>
<tr>
<td>Min/Max DC</td>
<td>Temperature-dependent</td>
</tr>
<tr>
<td>P gain</td>
<td>Target Error × Engine Oil Temperature</td>
</tr>
<tr>
<td>I gain</td>
<td>Target Error × Engine Oil Temperature</td>
</tr>
<tr>
<td>D gain</td>
<td>Target Error × Engine Oil Temperature, currently identical at every temperature</td>
</tr>
</tbody>
</table>
</figure>
<p>The important bit is that this hasn&#8217;t been developed by randomly changing numbers until the car felt better.</p>
<p>Each step came from something measurable in the logs:</p>
<ol>
<li>We saw excessive Integral correction.</li>
<li>We changed feed-forward.</li>
<li>That exposed a temperature relationship.</li>
<li>We correlated it against oil temperature.</li>
<li>We changed the available duty-cycle envelope.</li>
<li>Tracking improved substantially.</li>
<li>We then found that EMtune could add oil temperature directly to the PID gain tables.</li>
</ol>
<p>Now I have a calibration specifically designed around what the data has shown us.</p>
<h2>What happens next</h2>
<p>The new 3D PID still needs validating.</p>
<p>The next useful log needs to capture the engine continuously through approximately:</p>
<ul>
<li>20–40°C</li>
<li>40–60°C</li>
<li>60–70°C</li>
<li>70–80°C</li>
<li>80–100°C</li>
</ul>
<p>Then, once properly hot, it needs some genuine loaded operation.</p>
<p>The channels that matter are VVT Target, VVT Position, Target Error, Solenoid Duty, PID Status and the individual P, I and D outputs.</p>
<p>I&#8217;m particularly interested in the transition through 60–80°C.</p>
<p>The previous calibration has already set a high standard there. The new strategy needs to preserve that accuracy while improving the behaviour earlier in the warm-up.</p>
<p>The ultimate objective isn&#8217;t a perfectly flat graph.</p>
<p>It&#8217;s much simpler than that.</p>
<p>When I ask the inlet cam to be somewhere, I want it to get there quickly, stay there accurately and do so without the PID controller having to fight the underlying system.</p>
<p>At around 100°C oil temperature, we&#8217;re already essentially there.</p>
<p>Now we&#8217;re trying to make the journey from cold oil to that operating state just as controlled.</p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/vvt-i-oil-temperature-compensated-pid/">Tuning VVT-i Properly: From Chasing Errors to an Oil-Temperature-Compensated PID</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/vvt-i-oil-temperature-compensated-pid/">Tuning VVT-i Properly: From Chasing Errors to an Oil-Temperature-Compensated PID</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What the Logs Changed in My Supra Traction Control</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/what-the-logs-changed-in-my-supra-traction-control/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Mon, 21 Sep 2026 10:25:00 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[Tuning]]></category>
		<category><![CDATA[emtron]]></category>
		<category><![CDATA[supra]]></category>
		<category><![CDATA[traction control]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1162</guid>

					<description><![CDATA[<p>The previous version of the traction control worked. That was the problem. It worked well enough to make a 1,114 whp Supra feel calm, so the remaining faults were hidden&#8230;</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/what-the-logs-changed-in-my-supra-traction-control/">What the Logs Changed in My Supra Traction Control</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/what-the-logs-changed-in-my-supra-traction-control/">What the Logs Changed in My Supra Traction Control</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">The previous version of the traction control worked. That was the problem. It worked well enough to make a 1,114 whp Supra feel calm, so the remaining faults were hidden inside a system that never looked obviously broken.</p>



<p class="wp-block-paragraph">Then I logged it properly. The logs showed that the tyre produced its best acceleration at less slip than some of my more permissive modes allowed, the speed offsets could drive the final target below zero, and the integral term was storing positive torque while the car was below target. When wheelspin arrived, part of the PID was briefly helping it.</p>



<p class="wp-block-paragraph">This is the latest iteration: what changed, what the evidence actually supports, and what still needs a warm, dry road before I call it finished.</p>



<p class="wp-block-paragraph"><strong>The starting point</strong></p>



<p class="wp-block-paragraph">Status: Verified &#8211; Rear tyres are 295/30/19 Continental SportContact 7s.</p>



<p class="wp-block-paragraph">The strategy has always had two halves. Feedforward predicts the engine torque the tyre should accept. Closed loop PID then corrects whatever the prediction could not know about: temperature, damp patches, surface changes, load transfer and bumps.</p>



<p class="wp-block-paragraph">The torque model is normalised to third gear. The traction strategy itself is not normalised until the final gear scaler is applied. That distinction matters because a torque value in the base table is not the engine torque the car will necessarily receive in second, fourth or fifth.</p>



<p class="wp-block-paragraph"><strong>The tyre peak moved the targets</strong></p>



<p class="wp-block-paragraph">Status: Working conclusion</p>



<p class="wp-block-paragraph">The useful result from the earlier dry data was a tractive force peak around 9,500 to 9,800 N at roughly 5 to 6 percent slip. Once slip moved into the 6 to 8 percent band, median tractive force fell to about 8,860 N. More wheelspin felt more dramatic, but it accelerated the car less.</p>



<p class="wp-block-paragraph">That immediately made two settings look wrong. Mode 7 allowed 7.9 percent straight line slip and Mode 9 allowed 12 percent. Both sat beyond the measured force peak. They were permissive, but they were not the fastest settings.</p>



<p class="wp-block-paragraph">The later road test complicated the picture. It was cooler and the road was not completely dry. Maximum logged tractive force was about 7,982 N rather than 9,500 N. The road rose by only about 0.17 percent over the measured section, worth roughly 30 N on a 1,750 kg car, so gradient could not explain the difference. Tyre and road condition could.</p>



<p class="wp-block-paragraph">That means 9,500 N remains a dry baseline, not a universal grip limit. The system still needs slip feedback because no fixed torque table can know whether the tyre is warm, cold, dry or sitting on a damp seam.</p>



<p class="wp-block-paragraph"><strong>Rebuilding the rotary modes</strong></p>



<p class="wp-block-paragraph">Status Calibration loaded for validation</p>



<p class="wp-block-paragraph">The rotary still selects the character of the car, but the straight line targets now have a cleaner progression. Mode 3 remains the chilled setting. Mode 4 is the normal fast road setting. Mode 5 is for a known dry road on warm tyres. Mode 6 allows movement, but no longer asks the SC7 to live well beyond its measured force peak.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>TC Mode</strong></td><td><strong>Use</strong></td><td><strong>Previous 0 G target</strong></td><td><strong>Revised 0 G target</strong></td></tr><tr><td>1</td><td>Snow and ice</td><td>2.0%</td><td>2.0%</td></tr><tr><td>2</td><td>Damp and cold</td><td>2.0%</td><td>2.5%</td></tr><tr><td>3</td><td>Chilled</td><td>2.8%</td><td>3.0%</td></tr><tr><td>4</td><td>Sporty road</td><td>3.8%</td><td>4.0%</td></tr><tr><td>5</td><td>Known dry roads</td><td>7.9%</td><td>5.5%</td></tr><tr><td>6</td><td>Track</td><td>12.0%</td><td>7.0%</td></tr><tr><td>7</td><td>Very permissive</td><td>20.0%</td><td>10.0%</td></tr><tr><td>8</td><td>Soft off</td><td>28.0%</td><td>28.0%</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">The lateral G shapes were rebuilt at the same time. Both sides are now symmetrical because there was no evidence supporting different left and right targets. Every active road mode tapers as lateral acceleration increases, because the tyre has less longitudinal capacity available while it is also producing cornering force.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="501" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_target_slip_profiles-1024x501.png" alt="" class="wp-image-1163" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_target_slip_profiles-1024x501.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_target_slip_profiles-300x147.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_target_slip_profiles-768x376.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_target_slip_profiles-1536x752.png 1536w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_target_slip_profiles-2048x1002.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>The speed offset was doing too much</strong></p>



<p class="wp-block-paragraph">Status: Calibration loaded for validation</p>



<p class="wp-block-paragraph">The final target is the lateral G table plus a speed offset. The old high speed offsets were large enough to make the combined target negative in the conservative modes. Unless that is correcting a measured wheel speed bias, a negative slip target has no useful meaning.</p>



<p class="wp-block-paragraph">The revised table keeps the low speed launch allowance, but reduces the 25 km/h addition from nine percentage points to five. The target now blends down towards the normal table by 45 km/h instead of falling off a cliff. Above 180 km/h the negative offsets remain, but they are smaller and cannot erase the underlying target.</p>



<p class="wp-block-paragraph">That gives the same rotary a consistent meaning at every speed. Mode 3 remains conservative rather than becoming impossible at high speed, and Mode 7 remains the quickest dry road target rather than turning into an arbitrary number once the car passes 180 km/h.</p>



<p class="wp-block-paragraph"><strong>A feedforward table built around tractive force</strong></p>



<p class="wp-block-paragraph">Status Current baseline</p>



<p class="wp-block-paragraph">The largest architectural change is the main feedforward surface. Instead of treating slip error as the only description of available grip, the new table is indexed by modelled tractive force and engine torque before reductions.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="269" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_feedforward_table-1024x269.png" alt="" class="wp-image-1165" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_feedforward_table-1024x269.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_feedforward_table-300x79.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_feedforward_table-768x202.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_feedforward_table.png 1065w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">The surface rises towards 9,500 N, then deliberately falls away. At a 950 Nm unrestricted torque input, the table returns 594.9 Nm at 8,000 N, 652.7 Nm at 9,500 N and 597.1 Nm at 10,500 N.</p>



<p class="wp-block-paragraph">Apply the fourth gear normalisation factor of 1.263 and those become approximately 751, 825 and 754 Nm at the engine. The peak is therefore almost exactly where the warm, dry SC7 data said it should be. Above the peak, the table asks for less torque because the tyre has already moved onto the wrong side of its force curve.</p>



<p class="wp-block-paragraph">This is still a model. Emtron tractive force is largely derived from engine torque and gearing; it is not a strain gauge measuring the contact patch. The table provides a gear aware first estimate. Slip feedback remains the part that discovers the road is wet.</p>



<p class="wp-block-paragraph"><strong>The integrator was adding torque</strong></p>



<p class="wp-block-paragraph">Status: Verified defect</p>



<p class="wp-block-paragraph">The most important log finding was not a lack of negative integral authority. It was positive windup.</p>



<p class="wp-block-paragraph">With slip below target, the original controller allowed the integral output to climb to its positive 50 Nm clamp. One run held it there for about 1.3 seconds. Another retained the full 50 Nm across approximately 2.75 seconds. The tyre was not slipping too much, so the controller stored permission to add torque.</p>



<p class="wp-block-paragraph">When overslip arrived, the proportional and derivative terms reacted immediately, but the integral term had to unwind before it could help. At the worst point in one event the contributions were minus 7.6 Nm proportional, plus 37.6 Nm integral and minus 0.9 Nm derivative. The combined PID contribution was still plus 29.1 Nm while the tyre was already beyond target.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="602" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_integral_clamps-1024x602.png" alt="" class="wp-image-1164" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_integral_clamps-1024x602.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_integral_clamps-300x176.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_integral_clamps-768x452.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_integral_clamps-1536x904.png 1536w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_integral_clamps-2048x1205.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">The controller remained stable because the feedforward model, throttle reduction and ignition retard were doing the real work. That does not make the integral behaviour acceptable. A stable result can still contain two control terms fighting each other.</p>



<p class="wp-block-paragraph"><strong>The fix was removing positive authority</strong></p>



<p class="wp-block-paragraph">Status: Changed awaiting full dry validation</p>



<p class="wp-block-paragraph">The positive integral clamp is now zero. The negative clamp remains minus 50 Nm.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="940" height="250" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_pid_setup.png" alt="" class="wp-image-1166" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_pid_setup.png 940w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_pid_setup-300x80.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/tc_pid_setup-768x204.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></figure>



<p class="wp-block-paragraph">Below target slip, the integral term now sits at zero. Once the tyre exceeds target it can accumulate negative correction, up to 50 Nm. There is no positive value left to unwind and no stored torque waiting to oppose the first intervention.</p>



<p class="wp-block-paragraph">I initially considered extending the negative clamp to minus 75 Nm. The logs killed that idea. In the later full throttle events the negative integrator reached only minus 4.3 Nm in one run and zero in the other. More negative authority would have solved a problem that was not happening while increasing the risk of a torque hole after the tyre recovered.</p>



<p class="wp-block-paragraph">The proportional, integral gain and derivative tables therefore stay unchanged for the next test. Changing several control terms at once would make the result impossible to attribute. The positive clamp was the proven defect, so that is the change being isolated.</p>



<p class="wp-block-paragraph"><strong>What the road logs now say</strong></p>



<p class="wp-block-paragraph">Status Verified for the logged conditions</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Log</strong></td><td><strong>Maximum boost</strong></td><td><strong>Target slip</strong></td><td><strong>Maximum WOT slip</strong></td><td><strong>Maximum retard</strong></td><td><strong>Cut</strong></td></tr><tr><td>03</td><td>26.3 psi gauge (181 kPa)</td><td>3.0%</td><td>4.29%</td><td>-3.6 degrees</td><td>None</td></tr><tr><td>04</td><td>30.0 psi gauge (207 kPa)</td><td>2.8 to 3.0%</td><td>4.84%</td><td>-4.2 degrees</td><td>None</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Both runs used the conservative Mode 3 target. Neither needed ignition or fuel cuts. The car controlled the tyre with modest timing reduction and without the controller cycling torque up and down.</p>



<p class="wp-block-paragraph">The lower 7,982 N tractive force result from the cooler, imperfectly dry run should not be used to rewrite the dry table. It is evidence that the available grip changed. That is exactly why the feedforward and feedback halves both exist.</p>



<p class="wp-block-paragraph">The same session produced a roughly 4.8 second 100 to 200 km/h run without full boost at 100 km/h. The performance matters, but the cleaner result is the behaviour: a 914 whp pump fuel car remained controlled on a cool road without cuts or abrupt throttle closure.</p>



<p class="wp-block-paragraph"><strong>Power mode and traction mode are separate decisions</strong></p>



<p class="wp-block-paragraph">Status: Verified</p>



<p class="wp-block-paragraph">The torque request rotary decides how much engine performance is available. The traction rotary decides how much of that performance the tyre may use. Treating them as one setting hides useful control.</p>



<p class="wp-block-paragraph">The high torque modes already allow enough demand to exceed the rear tyre in second and third, while effectively releasing full engine output from fourth upwards. Increasing those torque tables would not make the car faster. It would only give the traction strategy a larger error to remove.</p>



<p class="wp-block-paragraph">For a dry road the useful combination is a high torque request with Mode 5 or Mode 6 traction control. Mode 3 is deliberately conservative. Mode 7 is now a permissive track setting rather than a 12 percent wheelspin setting dressed up as performance.</p>



<p class="wp-block-paragraph"><strong>The current configuration</strong> (Emtron specific)</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Function</strong></td><td><strong>Current setting</strong></td></tr><tr><td>Feedforward basis</td><td>Engine torque before reduction versus modelled tractive force</td></tr><tr><td>Dry force peak</td><td>Approximately 9,500 N working baseline</td></tr><tr><td>Mode 3 straight target</td><td>3.0 percent</td></tr><tr><td>Mode 4 straight target</td><td>4.0 percent</td></tr><tr><td>Mode 5 straight target</td><td>5.5 percent</td></tr><tr><td>Mode 6 straight target</td><td>7.0 percent</td></tr><tr><td>Integral positive clamp</td><td>0 Nm</td></tr><tr><td>Integral negative clamp</td><td>-50 Nm</td></tr><tr><td>Integral rate</td><td>200 Hz</td></tr><tr><td>Minimum torque clamp</td><td>50 Nm</td></tr><tr><td>Slip target filter</td><td>4</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>What still needs proving</strong></p>



<p class="wp-block-paragraph">The next valid test is on the same dry road, in both directions, with warm tyres. Running in both directions removes most of the gradient and steady wind error. Mode 4 should be tested first, followed by Mode 5, with full pedal held through the shift long enough to see the integrator unwind and torque recover.</p>



<p class="wp-block-paragraph">The stop condition is simple. If slip rises beyond about 6.5 percent and tractive force does not increase, the tyre has crossed the peak. If force continues to rise at 5.5 percent slip, Mode 6 is doing its job. If the controller oscillates or leaves a torque hole after intervention, the PID still needs work.</p>



<p class="wp-block-paragraph">Until that test is complete, the new force peak and the revised permissive modes remain evidence based working settings rather than finished calibration.</p>



<p class="wp-block-paragraph"><strong>The lesson from this iteration</strong></p>



<p class="wp-block-paragraph">The first version was designed to prevent wheelspin. This version is being calibrated to maximise acceleration without making the car unpleasant.</p>



<p class="wp-block-paragraph">That distinction changed the questions. How much slip is allowed is less useful than where the tyre produces maximum force. A larger integral clamp is less useful than checking whether the integrator is acting in the correct direction. More available engine torque is irrelevant when the tyre is already the limit.</p>



<p class="wp-block-paragraph">The car already had enough power. The latest changes are about making the control system stop wasting it, whether that waste comes from excessive wheelspin, an over-conservative target or two parts of the PID fighting each other.</p>



<p class="wp-block-paragraph">That is the point of logging it <span style="text-decoration: underline;">properly</span>. The calibration stops being a table that looks sensible and becomes a system that can explain what the car actually did.</p>



<p class="wp-block-paragraph">Huge thanks to Adrian at Emtron Australia for the pointers in this. It&#8217;s been invaluable.</p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/what-the-logs-changed-in-my-supra-traction-control/">What the Logs Changed in My Supra Traction Control</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/what-the-logs-changed-in-my-supra-traction-control/">What the Logs Changed in My Supra Traction Control</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Erratic Shifts and Idle Overfuelling on the 2JZ: Finding a DBW Feed-Forward Fault</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/dbw-feedforward-fault/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Fri, 18 Sep 2026 16:07:52 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[Tuning]]></category>
		<category><![CDATA[2jz]]></category>
		<category><![CDATA[air model]]></category>
		<category><![CDATA[emtron]]></category>
		<category><![CDATA[feedforward]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1156</guid>

					<description><![CDATA[<p>Inconsistent torque, delivery and shifts, with nothing obvious in the log. Working outwards from the symptom into the DBW loop, and the arithmetic that showed the integrator was spending its whole authority cancelling a feed-forward error.</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/dbw-feedforward-fault/">Erratic Shifts and Idle Overfuelling on the 2JZ: Finding a DBW Feed-Forward Fault</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/dbw-feedforward-fault/">Erratic Shifts and Idle Overfuelling on the 2JZ: Finding a DBW Feed-Forward Fault</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">The car was giving me inconsistent torque readings, inconsistent delivery, and downstream of both, inconsistent shifts. And on rarer occasions the car would overfuel like crazy when returning to idle. It&#8217;s done this maybe 6-8 times in 4000 miles of usage. Nothing in the log made the reason obvious.</p>



<p class="wp-block-paragraph">This is how I worked outwards from the symptom until the log told me where to look, and what the arithmetic said once I got there.</p>



<h2 class="wp-block-heading">Ruling things out</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">I expanded the log window out and walked the closed loop items one at a time. First question: was idle control intervening during the downshift? It was not. Verified and set aside.</p>



<p class="wp-block-paragraph">The next thing I noticed was that air mass was going erratic, and that is worth being precise about, because the air mass model on this car is a blend. Below 100 kPa it runs the throttle mass flow model exclusively and blends towards speed density above that. In the region where this fault appears the air mass estimate is therefore a function of throttle effective area and pressure ratio and nothing else. No speed density term diluting it, no trapped mass term in the estimate.</p>



<p class="wp-block-paragraph">So erratic air mass in that region means the blade, or the area characterisation, or both. It cannot mean much else.</p>



<p class="wp-block-paragraph">Pedal throttle demand translation was smooth through the whole event. The driver demand table was not doing this. That left the DBW loop, and the DBW PID was the gold seam.</p>


<p><!-- IMAGE SLOT A: emtron-dbw-pid-instability-log.png --></p>


<h2 class="wp-block-heading">What the loop was doing</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">Three things stand out.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="566" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/dbw_pid_errors-1024x566.png" alt="" class="wp-image-1160" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/dbw_pid_errors-1024x566.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/dbw_pid_errors-300x166.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/dbw_pid_errors-768x424.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/dbw_pid_errors-1536x848.png 1536w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/dbw_pid_errors.png 2046w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Proportional output is saturating at minus 100 percent repeatedly, and topping out near plus 63. That asymmetry is not the axis autoscaling being unhelpful. It is the loop reaching its closing clamp over and over while never reaching the opening one.</p>



<p class="wp-block-paragraph">Integral output is sitting around plus 24 percent and climbing slowly across the window. An integrator that keeps accumulating while the proportional term is pinned at its clamp is not doing the job an integrator is for.</p>



<p class="wp-block-paragraph">The motor command is swinging roughly minus 65 to plus 100 percent while the measured blade position only moves a few percent either side of 15. The blade is inertially filtered. It physically cannot follow a command oscillating at that rate, so the engine never sees the full excursion.</p>



<p class="wp-block-paragraph">That last point is the one that connects back to the shift. The engine does not see it, but the model does. Torque estimate comes from air mass, air mass in this region comes from the throttle mass flow model, and that model reads blade position directly. Every percent of blade wobble goes into the torque estimate whether or not the engine produced any of it.</p>



<p class="wp-block-paragraph">The gearbox was reacting to torque noise that did not exist at the crankshaft.</p>



<h2 class="wp-block-heading">The arithmetic</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">This is where the log stops being suggestive and starts being conclusive. At the cursor, 38.138s in the screenshot above:</p>



<ul class="wp-block-list">
<li>Servo Position Main: 3.7 percent</li>



<li>Proportional output: 0.9 percent</li>



<li>Integral output: 24.3 percent</li>



<li>Derivative output: 0.0 percent</li>



<li>Motor command: 6.2 percent</li>
</ul>



<p class="wp-block-paragraph">My feed-forward table runs minus 30 at 0 percent and minus 15 at 5 percent. Interpolated linearly, feed-forward at 3.7 percent is minus 18.9.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="678" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-motor-command-reconstruction.png" alt="Bar chart reconstructing the DBW motor command at 3.7 percent blade: feed-forward -18.9, proportional +0.9, integral +24.3 and derivative 0.0 percent motor duty, summing to +6.3 against a logged +6.2" class="wp-image-1172" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-motor-command-reconstruction.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-motor-command-reconstruction-300x188.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-motor-command-reconstruction-1024x643.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-motor-command-reconstruction-768x482.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Reconstructing the motor command at 38.138 s. Shading is by absolute magnitude, so the two terms doing all the work are the ones that stand out.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Two things fall out of a match that close. Motor command is the summed controller output rather than a measured position, and feed-forward interpolates linearly between breakpoints.</p>



<p class="wp-block-paragraph">But the finding is the third thing. <strong>At a near steady 3.7 percent blade position, the integral had wound to plus 24.3 for no purpose other than to cancel a feed-forward of minus 18.9.</strong></p>



<p class="wp-block-paragraph">The feed-forward in the 0 to 5 percent band is asking for roughly 25 points of closing duty that the throttle body does not need. The integral is spending its entire authority undoing it. That is a large stored state sitting permanently in the loop, and every time the proportional term saturates and the target moves, that state has to unwind before anything else can settle.</p>



<p class="wp-block-paragraph">It is a far better explanation for a sustained oscillation than any single gain cell.</p>



<h2 class="wp-block-heading">The feed-forward step, and what it actually is</h2>



<p class="wp-block-paragraph"><strong>Status: Provisional</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="364" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-feedforward-step-as-found-vs-revised.png" alt="Heatmap of DBW feed-forward, percent motor duty, against throttle target 0, 5, 6, 8 and 10 percent. As found: -30, -15, +10, +10, +10. Revised: -30, -15, -5, +5, +10" class="wp-image-1171" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-feedforward-step-as-found-vs-revised.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-feedforward-step-as-found-vs-revised-300x101.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-feedforward-step-as-found-vs-revised-1024x345.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-feedforward-step-as-found-vs-revised-768x259.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Both rows are shaded against the same range, so the revision reads as a smoothing of the step rather than a change of shape.</figcaption></figure>
</div>


<p class="wp-block-paragraph">There is a 25 point change in motor duty for a 1 percent movement in target between 5 and 6 percent, and the log crosses that region immediately before one of the instabilities. My first instinct was that this was simply wrong. It is not, and this is the part most likely to be copied badly, so it is worth saying plainly.</p>



<p class="wp-block-paragraph">The return spring on a DBW body pulls the blade towards its limp home position from both directions. Below limp home you need negative duty to hold the blade down against the spring. Above it you need positive duty to hold it open. A feed-forward table that changes sign between two cells is not a tuning error. It is the table telling you where limp home sits.</p>



<p class="wp-block-paragraph">Delete the step and you have not removed the discontinuity. You have removed the compensation for it, and handed the spring preload to the integrator.</p>



<p class="wp-block-paragraph">The real problems are different. First, the magnitude of the low band values, which the arithmetic above says are too negative. Second, a 25 point change interpolated across 1 percent of travel behaves like a gain of 25 through a region the blade is oscillating in.</p>



<h2 class="wp-block-heading">The proportional gain table</h2>



<p class="wp-block-paragraph"><strong>Status: Provisional</strong></p>



<p class="wp-block-paragraph">The low position P gains are aggressive, and lopsided towards the negative error side.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="430" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-as-found.png" alt="Heatmap of DBW proportional gain as found, throttle target 5, 15 and 25 percent against target error -12 to +12 percent. Gains run from 12.00 at -12 percent error in the 5 and 15 percent rows down to 5.00 at +12 in every row" class="wp-image-1170" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-as-found.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-as-found-300x119.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-as-found-1024x408.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-as-found-768x306.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Proportional gain as found. Shaded against the same range as the revised table below, so the two are directly comparable.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Reading negative error as blade above target, the closing correction gets close to twice the gain available for an equivalent opening error, at every row.</p>



<p class="wp-block-paragraph">The spring makes this more interesting than a simple symmetry argument, because the asymmetry it creates flips across limp home. Above limp home the spring already assists closing, so the loop needs more authority to open and less to close. Below limp home it reverses.</p>



<p class="wp-block-paragraph">A table that favours the closing side at every row is therefore directionally right in the 5 percent row and wrong in the 15 and 25 percent rows. The blade sits at 15 to 17 percent through this event.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="430" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-revised.png" alt="Heatmap of DBW proportional gain as revised, throttle target 5, 15 and 25 percent against target error -12 to +12 percent, with every gain between 5.0 and 8.5 and 5.0 at +12 in every row" class="wp-image-1169" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-revised.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-revised-300x119.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-revised-1024x408.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-dbw-proportional-gain-revised-768x306.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Proportional gain, revised. Same shading range as above. The whole table reads cooler, and the 15 and 25 percent rows now favour the opening side.</figcaption></figure>
</div>


<p class="wp-block-paragraph">One caveat that anyone copying this needs to take seriously. The whole reading above depends on the error channel being target minus actual. If your ECU signs it the other way, the argument inverts and so does the revision. Confirm it on your own log before you touch a cell: find a step where the blade visibly lags a rising target, and read the sign.</p>



<h2 class="wp-block-heading">What I have not proved yet</h2>



<p class="wp-block-paragraph">I changed two tables at once. Until they are separated, no outcome can be attributed to either.</p>



<p class="wp-block-paragraph">I have not measured the true limp home position. The right way is to unpower the driver and read the TPS, then check whether the feed-forward breakpoints actually straddle it. If limp home sits at 6.5 percent rather than between 5 and 6, the compensation is being applied in the wrong place, and that alone would explain the instability without a single gain change.</p>



<p class="wp-block-paragraph">I have not confirmed the error sign convention from a step.</p>



<p class="wp-block-paragraph">And I left the 0 and 5 percent feed-forward cells alone, which are the two cells the arithmetic actually points at.</p>



<p class="wp-block-paragraph">I&#8217;m not declaring this as &#8220;fixed&#8221; yet. However, the gear change is smoother, particularly the upshift. The lower speed acceleration is cleaner and everything just feels much more refined. Always remember the first few percent of opening on a throttle blade are extremely non-linear, and even more so on a 82mm throttle body.</p>



<h2 class="wp-block-heading">The test that closes it</h2>



<p class="wp-block-paragraph">With the loop stable, park the blade at steady positions across 0 to 25 percent, in 2 percent steps through the 0 to 8 percent band, and log feed-forward and integral at each point.</p>



<p class="wp-block-paragraph">Wherever the integral is non-zero at steady state, the feed-forward is wrong by exactly that amount. That lets the whole low band feed-forward table be built by subtraction rather than by iteration. The position at which feed-forward crosses zero and the integral stays at zero is the true limp home. Any step within the sweep settles the sign convention.</p>



<p class="wp-block-paragraph">Run it on the same road and the same coast down and you also get a genuinely matched before and after, rather than two logs taken a week apart under different load.</p>



<h2 class="wp-block-heading">The principle</h2>



<p class="wp-block-paragraph"><strong>The data is not transferable, but the principle is.</strong></p>



<p class="wp-block-paragraph">A feed-forward table and an integrator are solving the same problem from opposite ends. If the integrator is carrying a large standing value at a steady operating point, the feed-forward is wrong by that amount, and you can read the correction straight off the log instead of iterating towards it.</p>



<p class="wp-block-paragraph">The throttle area table that the whole torque model sits on is covered in <a href="https://blownbytwins.co.uk/engine-management/throttle-body-effective-area/">Throttle Body Effective Flow Area</a>, and the same feed-forward versus PID argument applied to traction control is in <a href="https://blownbytwins.co.uk/engine-management/traction-control-feedforward-pid/">Traction Control on 1,114 whp</a>. Full specification is on the <a href="https://blownbytwins.co.uk/toyota-supra-mk4-delta/">Supra project page</a>.</p>



<p class="wp-block-paragraph">If you run a DBW loop and have taken a different view on any of this, particularly the limp home reasoning or the gain asymmetry, I would like to hear it.</p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/dbw-feedforward-fault/">Erratic Shifts and Idle Overfuelling on the 2JZ: Finding a DBW Feed-Forward Fault</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/dbw-feedforward-fault/">Erratic Shifts and Idle Overfuelling on the 2JZ: Finding a DBW Feed-Forward Fault</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Traction Control on 1,114 whp: Feedforward, PID, and Why It Never Cuts</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/traction-control-feedforward-pid/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Thu, 17 Sep 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[Tuning]]></category>
		<category><![CDATA[emtron]]></category>
		<category><![CDATA[feedforward]]></category>
		<category><![CDATA[torque model]]></category>
		<category><![CDATA[traction control]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1118</guid>

					<description><![CDATA[<p>1,114 whp, 880 lb ft, and a 295 section road tyre on the back. Traction control on this car is not a driver aid. It is the thing that makes&#8230;</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/traction-control-feedforward-pid/">Traction Control on 1,114 whp: Feedforward, PID, and Why It Never Cuts</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/traction-control-feedforward-pid/">Traction Control on 1,114 whp: Feedforward, PID, and Why It Never Cuts</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">1,114 whp, 880 lb ft, and a 295 section road tyre on the back. Traction control on this car is not a driver aid. It is the thing that makes the car usable at all.</p>



<p class="wp-block-paragraph">Most discussion of traction control stops at &#8220;it cuts power when the wheels spin&#8221;. That describes about a third of what is actually happening, and it is the least interesting third. The system on this car has a predictive half that tries to never need the reactive half, and the whole design is aimed at keeping the reactive half quiet.</p>



<p class="wp-block-paragraph">This is how it is set up, and why. Every table is reproduced in full.</p>



<h2 class="wp-block-heading">Configuration</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<ul class="wp-block-list">
<li><a href="https://emtron.world/products/kv12" target="_blank" rel="noopener">Emtron KV12</a>, torque based traction control</li>



<li>3.4 litre 2JZ-GTE VVTi, 1,114 whp on E85, torque limited to 880 lb ft</li>



<li>ZF 8HP70, 2.93 final drive, OS Giken LSD</li>



<li>Continental SportContact 7, 265/30/19 front and 295/30/19 rear</li>



<li>Four individual wheel speeds, three axis internal accelerometer</li>



<li>Eight position rotary on the steering wheel, over CAN</li>
</ul>



<p class="wp-block-paragraph">Everything below is my own work. The base calibration on this car came from SRD Tuning, but the traction control strategy is mine start to finish, which is the only reason I can show you the tables.</p>



<h2 class="wp-block-heading">The predictive half: torque feedforward</h2>



<p class="wp-block-paragraph">The core of the system is a table that answers one question: <strong>at what engine torque does this car lose traction?</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="1646" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-torque-feedforward-table.png" alt="Heatmap of the traction control torque feedforward table, slip target error -8 to +2 percent against engine torque 50 to 1,250 Nm. Every row is flat from 750 Nm upwards, with the zero slip error row clamped at 575 Nm" class="wp-image-1178" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-torque-feedforward-table.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-torque-feedforward-table-197x300.png 197w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-torque-feedforward-table-672x1024.png 672w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-torque-feedforward-table-768x1170.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-torque-feedforward-table-1008x1536.png 1008w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Torque Feed Forward Table, Nm. The torque at which traction is lost.</figcaption></figure>
</div>


<p class="wp-block-paragraph">It is indexed on engine torque with no reduction applied, against slip target error. The ECU looks up that number and feeds it forward as the torque target before any measurement of actual slip has influenced anything.</p>



<p class="wp-block-paragraph">That is the whole idea of feedforward. If the model is right, the engine never makes more torque than the tyres can take, the slip never happens, and the closed loop has nothing to correct.</p>



<p class="wp-block-paragraph">Look at the first two columns before anything else. At 50 Nm of engine torque the table returns 50, and at 150 it returns 150. Below about 150 Nm it is a pass through: the feedforward is not limiting anything, because at those loads there is nothing to limit.</p>



<h3 class="wp-block-heading">And this is where the normalisation matters</h3>



<p class="wp-block-paragraph">Read along the zero slip error row and the values climb: 245.3, 340.5, 430.9, 478.9, 527.0, 575.0. And then they stop. Flat at 575 Nm from 750 Nm of engine torque all the way to 1,250.</p>



<p class="wp-block-paragraph">That plateau is deliberate and it is the single most important thing in the setup.</p>



<p class="wp-block-paragraph">Extend the slope before the plateau and an unclamped table would be asking for roughly 815 Nm at the top of the range. The engine makes 1,193 Nm. So without the clamp, the feedforward would be handing the PID a target the tyres cannot deliver, and the PID would spend its entire life trying to close a gap that physics will not close.</p>



<p class="wp-block-paragraph">A saturated PID is not a controller. It is an actuator held wide open. You lose all the proportionality that makes traction control feel like assistance rather than interference.</p>



<p class="wp-block-paragraph">Clamping the feedforward at something the tyres can actually deliver means the PID always has authority in reserve. That is what &#8220;normalised&#8221; means here, and it is why the system feels like it is helping rather than fighting.</p>



<h3 class="wp-block-heading">Normalised against third</h3>



<p class="wp-block-paragraph">The feedforward table is written for third gear. Everything else is scaled off it by two correction tables.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="628" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-gear-drpm.png" alt="Heatmap of feedforward correction table 1, gears 1 to 8 against rate of change of engine speed 750 to 4,000 rpm per second, from 0 percent at low dRPM in the low gears to -32 percent in eighth at 4,000" class="wp-image-1177" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-gear-drpm.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-gear-drpm-300x174.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-gear-drpm-1024x595.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-gear-drpm-768x447.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Correction Table 1, percent applied to the feedforward torque.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Correction Table 1 is indexed on gear against rate of change of engine speed. In first at low dRPM the correction is zero. By eighth at 4,000 dRPM it is minus 32 percent.</p>



<p class="wp-block-paragraph">Which makes sense once you think about what dRPM means in each gear. Engine speed rising at 4,000 rpm per second in first is normal acceleration. The same rate in eighth means the driven wheels are going somewhere the car is not. The correction is reading the rate of change as evidence of impending slip, and pulling the target down before the slip calculation has caught up.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="812" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-slip-error.png" alt="Bar chart of feedforward correction table 2 against slip target error: -40 percent at -64, -20 at -32, -10 at -16, -4 at -8, -2 at -4, -1 at -2, 0 at -1 and +10 at 0 percent error" class="wp-image-1176" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-slip-error.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-slip-error-300x226.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-slip-error-1024x770.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-correction-slip-error-768x577.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Correction Table 2. Note the axis: it runs out to minus 64 percent slip error, far wider than the gain tables further down. These two tables are not directly comparable.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Correction Table 2 does the same job against slip target error directly, from minus 40 percent at large negative error up to plus 10 at zero. That positive 10 at zero error is worth noticing: when the car is exactly on target, the feedforward is allowed to ask for slightly more than the base table says.</p>



<h2 class="wp-block-heading">The slip target, and what the rotary actually does</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">Here is the part I had not seen anyone else do.</p>



<p class="wp-block-paragraph">The target slip table is indexed on <strong>lateral G</strong>, from minus 1.5 to plus 1.5, against the rotary position from the steering wheel.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="2004" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-lateral-g.png" alt="Heatmap of target slip table 1, rotary positions 0 to 12 against lateral G from -1.5 to +1.5. Most rows peak at zero lateral G, from 2 percent permitted slip at position 0 to 28 percent at position 12" class="wp-image-1179" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-lateral-g.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-lateral-g-162x300.png 162w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-lateral-g-552x1024.png 552w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-lateral-g-768x1425.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-lateral-g-828x1536.png 828w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Target Slip Table 1, permitted slip in percent. Row labels are the eight discrete CAN values the switch produces, so the ECU never interpolates between settings.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Almost every row is a dome. Maximum permitted slip in a straight line, tapering symmetrically as lateral load builds in either direction. At the loosest setting the car allows 28 percent slip straight ahead, falling to 25 at 1.5 G. At the tightest, 2 percent straight ahead and 1 percent once the car is properly loaded up.</p>



<p class="wp-block-paragraph">Setting 1 is the exception, and I would rather point at it than pretend it fits. It permits 2 percent straight ahead, rises to 3 percent at around 0.75 G in either direction, and comes back to 2.5 at full lateral load. It is the only row in the table that allows more slip while cornering than it does in a straight line.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1200" height="631" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-slip-target-vs-lateral-g.png" alt="Chart of permitted wheel slip against lateral G for three traction control settings, each forming a dome that peaks in a straight line and tapers as cornering load builds" class="wp-image-1120" /><figcaption class="wp-element-caption">The same data plotted. The dome is most pronounced in the middle settings and flattens at both extremes.</figcaption></figure>



<p class="wp-block-paragraph">So the rotary is not a gain switch and it is not an on/off. It selects <strong>how much slip you are allowed as a function of how hard you are cornering</strong>, and the system tightens automatically as lateral load increases without the driver doing anything.</p>



<h3 class="wp-block-heading">And then speed offsets all of it</h3>



<p class="wp-block-paragraph">Lateral G is not the only input to the slip target. A second table offsets it by road speed, and it does a lot of work at both ends.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="1382" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-offset-road-speed.png" alt="Heatmap of the target slip offset by front axle speed, 0 to 330 kph, for each rotary position: +9 points below 25 kph (up to +25 at position 12), zero from 45 to 160 kph, and negative from 180 kph, reaching between -2.0 and -9.4 at 330" class="wp-image-1175" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-offset-road-speed.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-offset-road-speed-234x300.png 234w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-offset-road-speed-800x1024.png 800w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-target-slip-offset-road-speed-768x983.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Target Slip Offset Table 1, percentage points added to or taken off the slip target by road speed.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Below 25 kph every setting adds nine percentage points of slip, and the loosest adds twenty five. That is the launch allowance. You cannot get a car like this moving from rest on a target of 2 percent, and without that offset the system would strangle it off the line.</p>



<p class="wp-block-paragraph">Between 45 and 160 kph the offset is zero and the lateral G table stands on its own. Above 180 it goes negative, and by 330 kph it is pulling back between 2 and 9.4 points depending on the setting.</p>



<p class="wp-block-paragraph">Which is the right way round. Wheel slip at 40 kph costs you a bit of time. Wheel slip at 300 kph costs you rather more than that.</p>



<h2 class="wp-block-heading">The reactive half: a deliberately soft PID</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">When the feedforward is not enough, the PID takes over. And the gains are the opposite shape to what most people would write. All three share exactly the same breakpoints, so they go in one table.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="430" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-gains.png" alt="Heatmap of the traction control PID gains against slip target error -25 to 0 percent: proportional 3.00 falling to 0.20, integral 0.000 rising to 0.020, derivative 3.00 falling to 0.10" class="wp-image-1174" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-gains.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-gains-300x119.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-gains-1024x408.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-gains-768x306.png 768w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">Each row is shaded against its own range, because integral peaks at 0.020 and proportional at 3.00. The colour shows the shape, not the magnitude.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Proportional gain at zero slip error is 0.20. At minus 25 percent error it is 3.00. Derivative runs the same way, 0.10 at zero, and it saturates at 3.00 from minus 20 onwards.</p>



<p class="wp-block-paragraph">Both are smallest near target and largest far from it.</p>



<p class="wp-block-paragraph">That is a controller designed to be felt as little as possible. Around the target, where you spend almost all of your time, the loop barely reacts and the feedforward carries the car. Only when things run properly away does it bite hard.</p>



<p class="wp-block-paragraph">Tune it the conventional way round, with high gain near target for tight regulation, and you get a car that nibbles at the throttle constantly and feels like it is arguing with you.</p>



<h3 class="wp-block-heading">Integral is almost switched off, on purpose</h3>



<p class="wp-block-paragraph">Look at the integral row against the other two. Peak gain is 0.020, near target. At minus 25 it is <strong>zero</strong>.</p>



<p class="wp-block-paragraph">Zeroing the integral term exactly where the error is worst is anti windup by design. When the car is genuinely out of shape, the integrator stops accumulating instead of building up a correction you then have to unwind on the way out. An integrator that has wound up during a slide gives you a second event when it releases, and the second one is usually the one that catches people out.</p>



<p class="wp-block-paragraph">The rest of the PID setup backs that up:</p>



<ul class="wp-block-list">
<li>Integral control rate: 200 Hz</li>



<li>Integral positive clamp: 50.0 Nm</li>



<li>Integral negative clamp: -50.0 Nm</li>



<li>Minimum torque clamp: 50.0 Nm</li>



<li>Slip target filter: 4</li>
</ul>



<p class="wp-block-paragraph">Fifty Nm either side is a narrow band on an engine making 1,193. The integrator is there to trim, not to intervene.</p>



<h3 class="wp-block-heading">And the PID does not always run</h3>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1080" height="1778" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-enable-table-1.png" alt="Heatmap of the PID enable table, driver demand torque 0 to 1,000 Nm against slip target error -6 to +5 percent. The loop is off below 300 Nm, then each extra 100 Nm enables one more column in a staircase" class="wp-image-1173" style="width:640px" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-enable-table-1.png 1080w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-enable-table-1-182x300.png 182w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-enable-table-1-622x1024.png 622w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-enable-table-1-768x1264.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-traction-pid-enable-table-1-933x1536.png 933w" sizes="auto, (max-width: 1080px) 100vw, 1080px" /><figcaption class="wp-element-caption">PID Enable Table. 1 means the closed loop runs, 0 means it does not.</figcaption></figure>
</div>


<p class="wp-block-paragraph">Below 300 Nm of driver demand it is zero across the whole row. The closed loop simply does not run.</p>



<p class="wp-block-paragraph">Above that it opens up as a staircase. At 300 Nm the loop only runs once slip error is worse than minus 3 percent. Every additional 100 Nm of driver demand brings one more column into play, until at 1,000 Nm it is active everywhere except the far positive corner.</p>



<p class="wp-block-paragraph">So the amount of authority the closed loop has is itself a function of how much the driver is asking for. At low demand, feedforward handles everything alone, which means the PID cannot introduce noise into normal driving, because at normal driving loads it is not switched on.</p>



<h2 class="wp-block-heading">What it is allowed to do about it</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="540" height="195" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/emtron-torque-limit-actuator-priority.png" alt="Emtron torque limit strategy showing priority 1 throttle area, priority 2 ignition retard, and priority 3 set to OFF so cutting is disabled" class="wp-image-1125" /><figcaption class="wp-element-caption">Priority 1 throttle area, priority 2 ignition retard, priority 3 OFF.</figcaption></figure>



<p class="wp-block-paragraph">Emtron gives you three actuators for torque reduction, in a priority order. Mine reads throttle area, then ignition retard clamped at 11 degrees, then <strong>OFF</strong>.</p>



<p class="wp-block-paragraph">Cutting is disabled. On a car making 1,114 whp, the harshest tool in the box is not in the box.</p>



<p class="wp-block-paragraph">The throttle area minimum clamp bottoms out at 10 percent, so it never closes the throttle fully either. Torque reduction happens by moving the plate and pulling timing, and nothing else.</p>



<p class="wp-block-paragraph">That is a road car decision. Fuel or ignition cutting is fast and effective and it feels like being kicked. On a car that has to be pleasant on a motorway and predictable in the wet, an intervention that arrives as a smooth reduction rather than a hammer blow is worth more than the extra tenth of response.</p>



<h2 class="wp-block-heading">Does it work?</h2>



<p class="wp-block-paragraph">One number from a road log, second gear, full throttle:</p>



<p class="wp-block-paragraph"><strong>Torque reduction by retard: 8.1 percent.</strong></p>



<p class="wp-block-paragraph">Eight percent, in retard, on the second priority, with cutting unavailable and throttle intervention having already done its part. That is the system working gently in the conditions where a badly normalised setup would be reaching for everything it had.</p>



<p class="wp-block-paragraph">It is one data point from one log, so treat it as an illustration rather than proof. But it is the shape of result the whole design is aimed at.</p>



<h2 class="wp-block-heading">The principle, if you take nothing else</h2>



<p class="wp-block-paragraph">A PID is not there to make your feedforward work. It is there to handle what the feedforward could not have known about: a damp patch, a change in surface, a mid corner bump.</p>



<p class="wp-block-paragraph">If your feedforward target is unrealistic, the PID spends its authority correcting your model instead of correcting the road. It saturates, it escalates through the actuator list, and the car feels like it is fighting you.</p>



<p class="wp-block-paragraph">Normalise the target to something the tyres can actually deliver, gate the loop so it only runs when it is needed, keep the gains soft near target, and the reactive half stays quiet almost all the time.</p>



<p class="wp-block-paragraph">Which is the point. The best traction control is the one you do not notice.</p>



<h2 class="wp-block-heading">One thing to be clear about</h2>



<p class="wp-block-paragraph">Every number above is specific to this car: this power, these tyres, this gearbox, this weight distribution. <strong>The data is not transferable, but the principle is.</strong></p>



<p class="wp-block-paragraph">I have published the tables in full because seeing how something is structured teaches you far more than reading a description of it. Copy the structure. Do not copy the values.</p>



<p class="wp-block-paragraph">None of this works without trustworthy wheel speeds, which on a staggered setup is less automatic than it sounds. That is covered in <a href="https://blownbytwins.co.uk/?p=1111">Staggered Tyres and Traction Control</a>. The throttle area table that the whole torque model sits on is covered in <a href="https://blownbytwins.co.uk/engine-management/throttle-body-effective-area/">Throttle Body Effective Flow Area</a>. Full specification is on the <a href="https://blownbytwins.co.uk/toyota-supra-mk4-delta/">Supra project page</a>.</p>



<p class="wp-block-paragraph">If you run torque based traction control and have taken a different view on any of this, particularly the gain shape, the setting 1 anomaly or disabling cut, I would like to hear it. This is the part of the calibration I have changed my mind about most.</p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/traction-control-feedforward-pid/">Traction Control on 1,114 whp: Feedforward, PID, and Why It Never Cuts</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/traction-control-feedforward-pid/">Traction Control on 1,114 whp: Feedforward, PID, and Why It Never Cuts</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Twelve Small Injectors Instead of Six Big Ones</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Sun, 13 Sep 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[Tuning]]></category>
		<category><![CDATA[emtron]]></category>
		<category><![CDATA[fuel system]]></category>
		<category><![CDATA[injectors]]></category>
		<category><![CDATA[staged injection]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1113</guid>

					<description><![CDATA[<p>Every big power build hits the same wall. You need enough injector to feed the engine at full noise, and the injector that does that is too big to idle&#8230;</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/">Twelve Small Injectors Instead of Six Big Ones</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/">Twelve Small Injectors Instead of Six Big Ones</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Every big power build hits the same wall. You need enough injector to feed the engine at full noise, and the injector that does that is too big to idle properly.</p>



<p class="wp-block-paragraph">The usual answer is to accept it. Fit the 2000cc units, put up with a lumpy idle and a car that hunts in traffic, and tell yourself it&#8217;s the price of the power.</p>



<p class="wp-block-paragraph">It isn&#8217;t. Here&#8217;s what I did instead, and the arithmetic behind it.</p>



<h2 class="wp-block-heading">Configuration</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<ul class="wp-block-list">
<li>2JZ-GTE VVTi, 3,353 cc, 1,114 whp on E85</li>



<li>Plazmaman intake manifold, twelve injector provision</li>



<li>Twelve CP1000 injectors, rated 1,000 cc at 3 bar</li>



<li>Aeromotive regulator, 4 bar static, 1:1 rising rate</li>



<li>Three Walbro 485 pumps, -10 feed lines</li>



<li><a href="https://emtron.world/products/kv12" target="_blank" rel="noopener">Emtron KV12</a>, twelve dedicated injection channels, flex fuel</li>
</ul>



<h2 class="wp-block-heading">The problem is minimum pulse width, not flow</h2>



<p class="wp-block-paragraph">An injector is a solenoid valve. It takes a finite time to open and a finite time to close, and during those transitions the flow through it is neither zero nor fully open. It is somewhere in between, and it is not linear.</p>



<p class="wp-block-paragraph">Above a certain pulse width, the opening and closing transitions are a small fraction of the total and the injector behaves predictably. Below it, the transitions dominate. Two commands a fraction of a millisecond apart can deliver very different amounts of fuel, and the relationship stops being something you can characterise reliably.</p>



<p class="wp-block-paragraph">That&#8217;s the minimum controllable pulse width, and it&#8217;s roughly a property of the injector rather than of how much fuel you&#8217;re asking for. A big injector doesn&#8217;t take proportionally longer to open. It just moves more fuel while it does.</p>



<p class="wp-block-paragraph">Which is why big injectors idle badly. At idle you need a very small mass of fuel. With a big injector, that mass corresponds to a pulse width down in the region where the injector is unpredictable. The ECU asks for the same thing twice and gets two different answers. That&#8217;s your lumpy idle, and no amount of tuning fixes it, because the hardware isn&#8217;t repeatable down there.</p>



<h2 class="wp-block-heading">Twelve small ones instead of six big ones</h2>



<p class="wp-block-paragraph">The Plazmaman manifold takes twelve injectors, two per cylinder. Six primaries and six secondaries, each addressed individually on its own channel by the KV12.</p>



<p class="wp-block-paragraph">At idle, around town, and at any low load, only the primaries fire. Six injectors, each a 1000cc unit, sharing the same small fuel demand a set of six would normally handle. Pulse widths sit in the region where a 1000cc injector is well behaved.</p>



<p class="wp-block-paragraph">When load arrives, the secondaries stage in and the full twelve are working.</p>



<p class="wp-block-paragraph">So you get the idle characteristics of a 1000cc injector and the flow of something more than twice the size. That&#8217;s the whole idea, and it costs you nothing except a manifold that takes twelve injectors and an ECU with twelve output channels.</p>



<h2 class="wp-block-heading">The arithmetic, including the bit people get wrong</h2>



<p class="wp-block-paragraph">The injectors are rated 1,000 cc. They are not flowing 1,000 cc.</p>



<figure class="bbt-figure" style="margin:1.8rem 0"><title id="injflow-title">Injector flow against rail pressure</title>Flow rises with the square root of rail pressure. An injector rated 1,000 cc per minute at 3 bar delivers 1,155 cc at 4 bar, not the 1,333 cc a linear assumption would predict.05001,0001,5002,0002,50012345678Rated3 bar, 1,000 ccInstalled4 bar, 1,155 ccThe linear guesswould say 1,333 ccRail pressure, barFlow, cc per minuteInjector flow against rail pressureActual, square root of pressureWhat most people assume<figcaption class="bbt-table-note" style="font-size:0.8rem;color:#5f5f5f;line-height:1.5;margin:0.6rem 0 0">Flow scales with the square root of the pressure differential. A 33 percent pressure increase buys 15 percent more flow, not 33.</figcaption></figure>



<p class="wp-block-paragraph">Injector flow scales with the square root of the pressure differential across it. Rated at 3 bar, run at 4 bar:</p>



<pre class="wp-block-code"><code>flow = rated_flow × √(actual_pressure / rated_pressure)
     = 1000 × √(4 / 3)
     = 1000 × 1.1547
     = 1,155 cc</code></pre>



<p class="wp-block-paragraph">Twelve of those is <strong>roughly 13,900 cc/min installed</strong>, which is the equivalent of six 2,300 cc injectors.</p>



<p class="wp-block-paragraph">That square root matters more than it looks. It cuts both ways: raising fuel pressure buys you less flow than you&#8217;d expect, and dropping it costs you less than you&#8217;d fear. A 33 percent pressure increase gave 15 percent more flow.</p>



<p class="wp-block-paragraph">It also means anyone sizing injectors off the rated figure without checking their base pressure is working from the wrong number.</p>



<h2 class="wp-block-heading">Why the regulator has to be rising rate</h2>



<p class="wp-block-paragraph">What actually drives flow is the pressure <em>differential</em> across the injector: rail pressure minus manifold pressure.</p>



<p class="wp-block-paragraph">With a fixed 4 bar rail and 2.8 bar of boost in the manifold, that differential collapses to 1.2 bar at peak. Flow would fall to roughly 55 percent of what the ECU thinks it&#8217;s getting, at exactly the moment the engine needs the most fuel.</p>



<p class="wp-block-paragraph">A 1:1 rising rate regulator references manifold pressure and raises rail pressure to match, so the differential stays at 4 bar whatever the boost is doing. At 2.8 bar of boost that means roughly 6.8 bar of absolute rail pressure.</p>



<p class="wp-block-paragraph">Which is what the three pumps are for. Walbro 485s at 6.8 bar are working considerably harder than the same pumps at 3 bar, and their flow falls off as pressure rises. Fuel pressure has been confirmed to hold through full load E85 pulls, and the third pump exists for exactly that margin.</p>



<h2 class="wp-block-heading">A headroom check</h2>



<p class="wp-block-paragraph"><strong>Status: Working conclusion</strong></p>



<p class="wp-block-paragraph">Rough demand at 1,114 whp on E85, assuming a brake specific fuel consumption around 0.66 lb/hp/hr and a nominal drivetrain loss, lands somewhere near 8,400 cc/min.</p>



<p class="wp-block-paragraph">Against 13,900 cc/min installed, that&#8217;s roughly 60 percent duty at peak power.</p>



<p class="wp-block-paragraph">Both of those assumptions are mine rather than measured, so treat it as a sanity check rather than a specification. But the shape of the answer is right: there is real headroom, which is what you want on a car that has to survive being driven rather than just surviving a dyno pull.</p>



<h2 class="wp-block-heading">What this costs</h2>



<p class="wp-block-paragraph">It isn&#8217;t free.</p>



<p class="wp-block-paragraph">Twelve injectors means twelve to buy, twelve to wire, and twelve output channels on the ECU. Not every standalone has them, and a manifold with secondary injector provision is a specific purchase rather than a generic one.</p>



<p class="wp-block-paragraph">There is also a calibration cost. The handover between primary only and both sets firing has to be blended properly, or you get a step in fuelling at the transition. That is real work and it is work a single stage setup doesn&#8217;t need.</p>



<p class="wp-block-paragraph">Whether it&#8217;s worth it depends entirely on what the car is for. If it lives on a dyno and does quarter miles, fit six big ones and don&#8217;t think about it. If it has to sit in traffic on the way to Scotland and then do something violent when it gets there, the staging is the difference between a car you drive and a car you tolerate.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<p class="wp-block-paragraph"><em>This fuel system is what makes 2.8 bar on E85 possible in the first place. What that boost is actually worth, and how much of it is the fuel rather than the pressure, is covered in <a href="https://blownbytwins.co.uk/?p=1107">What E85 Actually Buys</a>. Full specification is on the <a href="https://blownbytwins.co.uk/toyota-supra-mk4-delta/">Supra project page</a>, and the build itself is in <a href="https://blownbytwins.co.uk/?p=1032">The 3.4 Stroker Build</a>.</em></p>



<p class="wp-block-paragraph">If you&#8217;ve run a staged setup and measured where the handover actually lands in your fuel trims, I&#8217;d be interested. That transition is the part I know least about and it&#8217;s where I&#8217;d expect the problems to live.</p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/">Twelve Small Injectors Instead of Six Big Ones</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/twelve-small-injectors-instead-of-six-big-ones/">Twelve Small Injectors Instead of Six Big Ones</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Staggered Tyres and Traction Control: What the ECU Corrects, and What It Can&#8217;t</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/staggered-tyres-traction-control/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Thu, 10 Sep 2026 09:00:00 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[Tuning]]></category>
		<category><![CDATA[calibration]]></category>
		<category><![CDATA[emtron]]></category>
		<category><![CDATA[traction control]]></category>
		<category><![CDATA[wheel speed]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1111</guid>

					<description><![CDATA[<p>If you run staggered tyres and a standalone ECU with traction control, there is a field in your configuration that almost certainly matters more than you think it does. It&#8230;</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/staggered-tyres-traction-control/">Staggered Tyres and Traction Control: What the ECU Corrects, and What It Can’t</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
<p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/staggered-tyres-traction-control/">Staggered Tyres and Traction Control: What the ECU Corrects, and What It Can&#8217;t</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">If you run staggered tyres and a standalone ECU with traction control, there is a field in your configuration that almost certainly matters more than you think it does. It is the tyre size.</p>



<p class="wp-block-paragraph">Not for speedometer calibration. For whether your traction control knows the difference between wheelspin and a rear tyre that is simply a different size to the front one.</p>



<h2 class="wp-block-heading">The problem, in one number</h2>



<p class="wp-block-paragraph">My car runs 265/30/19 at the front and 295/30/19 at the rear. Work the rolling diameters out:</p>



<ul class="wp-block-list">
<li>Front: 482.6 mm rim + (2 &times; 79.5 mm sidewall) = <strong>641.6 mm</strong></li>



<li>Rear: 482.6 mm rim + (2 &times; 88.5 mm sidewall) = <strong>659.6 mm</strong></li>
</ul>



<p class="wp-block-paragraph">The rear is 2.8 percent larger, so for any given road speed it turns about 2.7 percent slower than the front. Put the other way round, the front turns 2.8 percent faster than the rear, which is the figure you will see between the raw channels.</p>



<p class="wp-block-paragraph">A traction control strategy that compares driven wheel speed against undriven wheel speed and calls the difference slip would therefore see a permanent 2.8 percent slip. At a steady 50 mph on a flat road, doing nothing. Every slip target you set would be sitting on top of an offset that has nothing to do with grip.</p>



<h2 class="wp-block-heading">What the ECU does about it</h2>



<p class="wp-block-paragraph"><strong>Status: Verified</strong></p>



<p class="wp-block-paragraph">On the <a href="https://emtron.world/products/kv12" target="_blank" rel="noopener">Emtron</a> you give it two things per axle: the number of teeth on the ABS reluctor, and the tyre size.</p>



<p class="wp-block-paragraph">In my case that is 48 teeth on the Toyota hubs at both ends, and the two tyre sizes above. The ECU converts each tyre size string into a rolling diameter, combines it with the tooth count, and derives a scalar that normalises one axle against the other.</p>



<p class="wp-block-paragraph">The tooth count cancels here because both ends are 48. On a car with different reluctors front and rear it would not, which is exactly why the ECU asks for both rather than just the tyre size.</p>



<p class="wp-block-paragraph">You can watch it work. At a steady cruise on a flat road, in the same log, at the same moment:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1200" height="631" src="https://blownbytwins.co.uk/wp-content/uploads/2026/09/wheel-speed-raw-vs-corrected-slip.png" alt="Bar chart comparing raw wheel speed channels reading 2.8 percent apart against a corrected Drive Slip channel reading zero at steady cruise" class="wp-image-1128" /><figcaption class="wp-element-caption">Same car, same log, same moment. The raw channels show the geometry. The corrected channel shows the truth.</figcaption></figure>



<ul class="wp-block-list">
<li><strong>Raw wheel speed channels: 2.8 percent apart.</strong> Exactly the geometry, uncorrected.</li>



<li><strong>Drive Slip: 0 percent.</strong> Corrected, and reading the truth.</li>
</ul>



<p class="wp-block-paragraph">That pair is worth knowing about, because if you go looking at raw wheel speed channels and find them 2.8 percent apart, nothing is wrong. Those are sensor channels. The correction is applied downstream, inside the slip calculation, and the corrected channel is the one that tells you whether it is working.</p>



<h2 class="wp-block-heading">The failure mode nobody warns you about</h2>



<p class="wp-block-paragraph">The correction is derived from a tyre size you typed in. It has no way of knowing what is actually bolted to the car.</p>



<p class="wp-block-paragraph">This car has been through 18 inch wheels on Yokohama A052, and is now on 19 inch Rays G025 with a staggered Continental SportContact 7 setup. If the configuration still held the old sizes, every wheel speed on the car would be wrong, road speed would be wrong, and the slip calculation would be wrong.</p>



<p class="wp-block-paragraph">And none of it would look broken. The ECU would be doing correct arithmetic on stale inputs, confidently, forever.</p>



<p class="wp-block-paragraph">So: change your wheels or tyres, change the configuration. It belongs on the same checklist as the alignment.</p>



<h2 class="wp-block-heading">What geometry cannot reach</h2>



<p class="wp-block-paragraph"><strong>Status: Working conclusion</strong></p>



<p class="wp-block-paragraph">The scalar is calculated from the free rolling diameter, meaning the tyre&#8217;s size when nothing is pushing on it. What the wheel actually rolls on is the loaded radius, which is smaller, because the sidewall deflects under the weight of the car.</p>



<p class="wp-block-paragraph">That deflection is not the same front to rear. My rear sidewall is 88.5 mm against 79.5 mm at the front, and it carries more load. So the real ratio between the two axles is not quite the ratio the ECU calculated.</p>



<p class="wp-block-paragraph">Worse, it moves. Under hard acceleration weight transfers rearward, the rear sidewall squashes further, the rear rolling radius shrinks, and the rear wheels read faster for the same road speed. The system sees slip that is partly just the tyre changing shape.</p>



<p class="wp-block-paragraph">Which means the residual error is largest exactly when traction control is working hardest, and it errs in the direction of over-reading slip.</p>



<p class="wp-block-paragraph">Add the slower drifts on top: cold pressure against hot, a fresh tyre against a half worn one, a summer session against a winter one. All of them change rolling radius. None of them change the number in the configuration.</p>



<p class="wp-block-paragraph">I have not quantified any of that on this car. It is reasoning from geometry rather than measurement, and it stays a working conclusion until there is a number behind it.</p>



<h2 class="wp-block-heading">The check that takes two minutes</h2>



<p class="wp-block-paragraph">Flat road, steady 50, constant throttle, no load transfer. Log all four wheel speeds and your corrected slip channel.</p>



<p class="wp-block-paragraph">If corrected slip reads zero, your static correction is right. If it reads a consistent offset, either your configured tyre sizes do not match the car, or your tyres have worn far enough to matter.</p>



<p class="wp-block-paragraph">Do it after every tyre change, and once mid-season. It costs nothing and it is the only way to know whether the number your traction control is acting on means anything.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<p class="wp-block-paragraph"><strong>Why this matters more than it sounds.</strong> Everything the traction control does downstream, the slip target, the feedforward torque model, the PID that corrects what the model missed, is built on the assumption that slip is being measured correctly. Get this wrong and every one of those tables is being tuned against a number that has an offset baked into it. The strategy that sits on top of these wheel speeds is covered in <a href="https://blownbytwins.co.uk/?p=1118">Traction Control on 1,114 whp</a>.</p>



<p class="wp-block-paragraph">Full specification and the wheel and tyre setup are on the <a href="https://blownbytwins.co.uk/toyota-supra-mk4-delta/">Supra project page</a>.</p>



<p class="wp-block-paragraph">If you run staggered tyres and have measured your loaded radius rather than assuming the free one, I would like to know how far apart they were. That is the number this article is missing.</p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/staggered-tyres-traction-control/">Staggered Tyres and Traction Control: What the ECU Corrects, and What It Can’t</a> first appeared on <a href="https://blownbytwins.co.uk">BlownByTwins</a>.</p><p>The post <a rel="nofollow" href="https://blownbytwins.co.uk/cars/mk4-supra/staggered-tyres-traction-control/">Staggered Tyres and Traction Control: What the ECU Corrects, and What It Can&#8217;t</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
