<?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>air model - BlownByTwins</title>
	<atom:link href="https://blownbytwins.co.uk/tag/air-model/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>Wed, 30 Sep 2026 08:10:50 +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>air model - BlownByTwins</title>
	<link>https://blownbytwins.co.uk</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 fetchpriority="high" 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="(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 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="(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 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="(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>Throttle Body Effective Flow Area: Building a Correct Area vs Position Table</title>
		<link>https://blownbytwins.co.uk/cars/mk4-supra/throttle-body-effective-area/</link>
		
		<dc:creator><![CDATA[john]]></dc:creator>
		<pubDate>Thu, 27 Aug 2026 09:33:33 +0000</pubDate>
				<category><![CDATA[Engine Management]]></category>
		<category><![CDATA[Mk4 Supra]]></category>
		<category><![CDATA[Tuning]]></category>
		<category><![CDATA[air model]]></category>
		<category><![CDATA[calibration]]></category>
		<category><![CDATA[dbw]]></category>
		<category><![CDATA[emtron]]></category>
		<category><![CDATA[throttle body]]></category>
		<guid isPermaLink="false">https://blownbytwins.co.uk/?p=1074</guid>

					<description><![CDATA[<p>Open any modern standalone ECU that runs a throttle-based air model and you&#8217;ll find a table mapping throttle position to flow area. Open a dozen real calibrations and a good&#8230;</p>
<p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/throttle-body-effective-area/">Throttle Body Effective Flow Area: Building a Correct Area vs Position Table</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/throttle-body-effective-area/">Throttle Body Effective Flow Area: Building a Correct Area vs Position Table</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Open any modern standalone ECU that runs a throttle-based air model and you&#8217;ll find a table mapping throttle position to flow area. Open a dozen real calibrations and a good number of those tables will be a straight line from zero to full scale.</p>



<p class="wp-block-paragraph">A straight line is the one shape the table physically cannot be.</p>



<p class="wp-block-paragraph">This isn&#8217;t a precision quibble. In the operating band where the engine spends most of its life, meaning idle, overrun, light cruise and the first few percent of tip-in, a linear table over-states flow area by a factor of two to four. Every downstream calculation inherits that error: fuel mass, torque estimation, pedal mapping, and on a drive-by-wire car, the inverse map the controller uses to decide where to put the plate.</p>



<p class="wp-block-paragraph">This article covers the geometry of why, the compressible flow equations that turn area into mass, what a throttle mass flow (TMF) model does with the result, and a repeatable method for building a table that&#8217;s correct rather than convenient.</p>



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



<h2 class="wp-block-heading">Part 1: The geometry</h2>



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



<p class="wp-block-paragraph">A butterfly valve is a disc on a shaft in a cylindrical bore. Air gets past it through whatever cross-section the disc doesn&#8217;t block, viewed along the bore axis.</p>



<p class="wp-block-paragraph">Set up coordinates: the bore axis is <strong>z</strong>, the shaft runs along <strong>x</strong>, and the plate rotates about the shaft. Call the plate&#8217;s angle from the bore-normal plane <strong>α</strong>, and the angle it sits at when hard against the closed stop <strong>α₀</strong>.</p>



<p class="wp-block-paragraph">For the plate to seal in a cylindrical bore at angle α₀, it can&#8217;t be a circle. The intersection of a cylinder of radius <em>R</em> with a plane tilted at α₀ is an ellipse with semi-axes <em>R</em> and <em>R/cos α₀</em>. So the plate is elliptical, with the long axis running across the shaft.</p>



<p class="wp-block-paragraph">Project that plate onto the plane normal to the flow at an arbitrary angle α, and you get an ellipse with semi-axes:</p>



<ul class="wp-block-list">
<li><strong>R</strong> along the shaft</li>



<li><strong>R · cos α / cos α₀</strong> across it</li>
</ul>



<p class="wp-block-paragraph">Which gives the blocked area directly:</p>



<pre class="wp-block-code"><code>A_blocked = πR² · (cos α / cos α₀)</code></pre>



<p class="wp-block-paragraph">And therefore:</p>



<pre class="wp-block-code"><code>A_open = πR² · (1 − cos α / cos α₀)</code></pre>



<p class="wp-block-paragraph">Two sanity checks. At α = α₀ the cosine ratio is 1 and open area is zero, because the plate fills the bore. At α = 90° the ratio is zero, open area equals bore area, and the plate is edge-on. Both correct.</p>



<h3 class="wp-block-heading">Why it can&#8217;t be linear</h3>



<p class="wp-block-paragraph">Differentiate the open area with respect to α:</p>



<pre class="wp-block-code"><code>dA/dα = πR² · sin α / cos α₀</code></pre>



<p class="wp-block-paragraph">Near the closed position, sin α is small. The area barely moves. Expand the cosine for small openings and you get area growing with <strong>the square</strong> of the angle, not the first power:</p>



<pre class="wp-block-code"><code>1 − cos α ≈ α² / 2</code></pre>



<p class="wp-block-paragraph">A quadratic. That&#8217;s the whole argument. The throttle plate has to swing through a meaningful angle before it uncovers meaningful area, because at small angles you&#8217;re only exposing the thin crescent at the edge of a tilted ellipse.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2560" height="1355" src="https://blownbytwins.co.uk/wp-content/uploads/2026/08/throttle_body_effective_area_vs_linear_assumption-scaled.png" alt="Chart comparing the true geometric open area of an 82 mm butterfly throttle against a linear table, showing the real curve sitting far below the straight line across the lower range" class="wp-image-1097" srcset="https://blownbytwins.co.uk/wp-content/uploads/2026/08/throttle_body_effective_area_vs_linear_assumption-scaled.png 2560w, https://blownbytwins.co.uk/wp-content/uploads/2026/08/throttle_body_effective_area_vs_linear_assumption-300x159.png 300w, https://blownbytwins.co.uk/wp-content/uploads/2026/08/throttle_body_effective_area_vs_linear_assumption-1024x542.png 1024w, https://blownbytwins.co.uk/wp-content/uploads/2026/08/throttle_body_effective_area_vs_linear_assumption-768x407.png 768w, https://blownbytwins.co.uk/wp-content/uploads/2026/08/throttle_body_effective_area_vs_linear_assumption-1536x813.png 1536w, https://blownbytwins.co.uk/wp-content/uploads/2026/08/throttle_body_effective_area_vs_linear_assumption-2048x1084.png 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /><figcaption class="wp-element-caption">Geometric open area against throttle position for an 82 mm bore, 9° closed angle, 83° open stop. The dashed line is what a linear table assumes.</figcaption></figure>



<p class="wp-block-paragraph">Put numbers on it. Take an 82 mm bore, a closed angle of 9°, an open stop at 83°, and a throttle position axis that runs 0 to 100% of mechanical travel:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>TPS %</th><th>Plate angle</th><th>Open area (mm²)</th><th>% of bore</th><th>Linear table says</th><th>Error</th></tr></thead><tbody><tr><td>2</td><td>10.5°</td><td>20</td><td>0.4%</td><td>106</td><td>5.3×</td></tr><tr><td>6</td><td>13.4°</td><td>81</td><td>1.5%</td><td>317</td><td>3.9×</td></tr><tr><td>10</td><td>16.4°</td><td>151</td><td>2.9%</td><td>528</td><td>3.5×</td></tr><tr><td>20</td><td>23.8°</td><td>389</td><td>7.4%</td><td>1056</td><td>2.7×</td></tr><tr><td>40</td><td>38.6°</td><td>1102</td><td>20.9%</td><td>2112</td><td>1.9×</td></tr><tr><td>60</td><td>53.4°</td><td>2124</td><td>40.2%</td><td>3169</td><td>1.5×</td></tr><tr><td>80</td><td>68.2°</td><td>3320</td><td>62.9%</td><td>4225</td><td>1.3×</td></tr><tr><td>100</td><td>83.0°</td><td>4677</td><td>88.6%</td><td>5281</td><td>1.1×</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><em>(Bore area 5281 mm². Shaft blockage included, see below. Linear column assumes full scale = bore area.)</em></p>



<p class="wp-block-paragraph">The error is worst exactly where it hurts most. A big throttle on a big engine cruises at single-digit TPS. That&#8217;s the region where a linear table is out by a factor of four.</p>



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



<p class="wp-block-paragraph">The shaft blocks area too, but not in the way most people assume. Its projected area is roughly <em>shaft diameter × bore diameter</em>, so call it 8 mm × 82 mm ≈ 656 mm², over 12% of the bore.</p>



<p class="wp-block-paragraph">But at small openings the shaft is hidden behind the plate&#8217;s projection. The plate&#8217;s projected ellipse is nearly as wide as the bore, and the shaft sits along its centreline. Shaft blockage only becomes real once the plate has swung far enough that its projection narrows past the shaft width, which on typical geometry is somewhere past 60 to 70°.</p>



<p class="wp-block-paragraph">So the shaft is irrelevant at idle and dominant at wide-open throttle. If you&#8217;ve ever wondered why a throttle body flows meaningfully less than its nominal bore area suggests at WOT, that&#8217;s most of the answer.</p>



<h3 class="wp-block-heading">What the closed-form misses</h3>



<p class="wp-block-paragraph">The clean equation above is a thin-plate, sharp-edged idealisation. Real hardware has:</p>



<ul class="wp-block-list">
<li><strong>Plate thickness.</strong> A 2 mm plate at 15° presents a real edge to the flow, not a mathematical line.</li>



<li><strong>A seal taper or step in the bore</strong> at the closed position, common on OEM bodies to control leakage and stop the plate binding.</li>



<li><strong>A relieved or chamfered plate edge</strong>, which changes the effective flow path at small angles specifically.</li>



<li><strong>Screw heads</strong> on the plate face where it&#8217;s fastened to the shaft.</li>



<li><strong>Non-concentricity</strong> between the plate&#8217;s rotation axis and the bore centreline on some designs.</li>
</ul>



<p class="wp-block-paragraph">None of these are worth modelling analytically. Integrate the geometry numerically and stop pretending you have a closed form. The code is fifteen lines and it handles the shaft correctly for free.</p>



<pre class="wp-block-code"><code>import numpy as np

def open_area(alpha_deg, alpha0_deg, bore_d, shaft_d, n=2000):
    """
    Geometric open area of a butterfly valve, by numerical integration.

    alpha_deg  : plate angle from the bore-normal plane (deg); ~90 = fully open
    alpha0_deg : plate angle at the closed stop (deg)
    bore_d     : bore diameter (mm)
    shaft_d    : shaft diameter (mm)

    Returns (area_mm2, fraction_of_bore_area)
    """
    R  = bore_d / 2.0
    a  = np.deg2rad(alpha_deg)
    a0 = np.deg2rad(alpha0_deg)

    # projected plate ellipse: semi-axis R along shaft, R*cos(a)/cos(a0) across
    sx = R
    sy = max(R * np.cos(a) / np.cos(a0), 1e-12)

    g = np.linspace(-R, R, n)
    X, Y = np.meshgrid(g, g)

    in_bore  = (X**2 + Y**2) &lt;= R**2
    in_plate = ((X / sx)**2 + (Y / sy)**2) &lt;= 1.0
    in_shaft = np.abs(Y) &lt;= shaft_d / 2.0

    cell = (2 * R / (n - 1))**2
    area = np.count_nonzero(in_bore &amp; ~in_plate &amp; ~in_shaft) * cell
    return area, area / (np.pi * R**2)


def servo_to_angle(tps_pct, alpha0_deg, alpha_max_deg):
    """Linear travel-to-angle map. Verify this on your own hardware."""
    return alpha0_deg + (tps_pct / 100.0) * (alpha_max_deg - alpha0_deg)


for tps in &#091;0, 1, 2, 3, 5, 8, 12, 20, 30, 45, 60, 80, 100]:
    ang = servo_to_angle(tps, 9.0, 83.0)
    a, f = open_area(ang, 9.0, 82.0, 8.0)
    print(f"{tps:5.1f}%  {ang:5.1f}°  {a:8.1f} mm²  {f*100:5.2f}%")</code></pre>



<h3 class="wp-block-heading">Servo position is not plate angle</h3>



<p class="wp-block-paragraph">The table&#8217;s axis is usually servo or throttle position in percent. That is a percentage of <em>mechanical travel</em>, mapped through the sensor calibration. It is not plate angle, and it is not flow area.</p>



<p class="wp-block-paragraph">Two things break here routinely:</p>



<p class="wp-block-paragraph"><strong>The zero point.</strong> TPS 0% is wherever the sensor was zeroed, which is typically the closed stop. But the closed stop is often set slightly <em>below</em> the sealing angle so the plate loads against it, or slightly above so it doesn&#8217;t jam. If your assumed α₀ is a degree out, your area predictions at low TPS are out by a large multiple, because you&#8217;re on the steepest part of a quadratic.</p>



<p class="wp-block-paragraph"><strong>The full-scale point.</strong> Plates rarely reach 90°. Mechanical stops usually land somewhere between 80° and 86°, and the linkage may not be perfectly linear across the range. On a DBW body with a direct gear train it&#8217;s close enough to linear to be usable. Verify rather than assume.</p>



<p class="wp-block-paragraph"><strong>Measure both.</strong> Command the throttle to a known position, remove the intake pipe, and measure the plate angle directly. A digital angle gauge against the plate face is good to a few tenths of a degree, which is plenty. Do it at 0%, 100%, and three or four points in between to confirm linearity. This is twenty minutes of work that determines whether everything downstream is right or wrong.</p>



<h3 class="wp-block-heading">The scaling trap</h3>



<p class="wp-block-paragraph">If a table has been carried over from a different throttle body, check what it was scaled by.</p>



<p class="wp-block-paragraph">Area scales with the <strong>square</strong> of diameter. Going from 68 mm to 82 mm:</p>



<ul class="wp-block-list">
<li>Diameter ratio: 82 / 68 = <strong>1.206</strong></li>



<li>Area ratio: 82² / 68² = <strong>1.454</strong></li>
</ul>



<p class="wp-block-paragraph">Scale by diameter instead of area and every entry is 17% low. That&#8217;s the obvious error.</p>



<p class="wp-block-paragraph">The subtler one: even a correctly area-scaled table has the wrong <em>shape</em>. Closed angle, open stop angle, and shaft-to-bore ratio all differ between bodies, and none of them scale with diameter. The same shaft in a smaller bore blocks a larger fraction of it. A table lifted from another throttle body and multiplied by a constant is wrong in a way no single multiplier can fix.</p>



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



<h2 class="wp-block-heading">Part 2: From area to mass flow</h2>



<p class="wp-block-paragraph">Geometric area isn&#8217;t flow area. Two corrections stand between them.</p>



<h3 class="wp-block-heading">Discharge coefficient</h3>



<p class="wp-block-paragraph">Real flow through an orifice separates at the edge and forms a vena contracta narrower than the geometric opening. The ratio of actual to ideal flow is the discharge coefficient, <strong>Cd</strong>.</p>



<p class="wp-block-paragraph">For a butterfly valve, Cd is a function of plate angle, and to a lesser extent of Reynolds number and pressure ratio. Typical values sit somewhere in the 0.6 to 0.8 range across most of the travel, though published data varies considerably with plate profile and bore geometry. The behaviour at very small openings, where the flow is a thin slot jet past a tilted edge, is the least consistent across sources.</p>



<p class="wp-block-paragraph">If your ECU exposes a separate Cd or flow-correction table against angle, keep the geometric table geometric and put the empirical correction in the Cd table. Two tables, two jobs, and you can reason about each independently. If it only exposes one &#8220;effective area&#8221; table, you&#8217;re folding Cd into it, which works, but means the table is no longer verifiable against geometry, and you lose the ability to sanity-check it with a ruler and a protractor.</p>



<h3 class="wp-block-heading">The compressible flow equation</h3>



<p class="wp-block-paragraph">Air through a restriction is compressible. The standard isentropic nozzle relation:</p>



<pre class="wp-block-code"><code>ṁ = Cd · A · (P_up / √(R_s · T_up)) · Ψ(PR)</code></pre>



<p class="wp-block-paragraph">where <code>PR = P_down / P_up</code>, <code>R_s = 287 J/kg·K</code>, and Ψ depends on whether the flow is choked.</p>



<p class="wp-block-paragraph"><strong>Critical pressure ratio</strong> for air (γ = 1.4):</p>



<pre class="wp-block-code"><code>PR_crit = (2 / (γ+1))^(γ/(γ-1)) = 0.528</code></pre>



<p class="wp-block-paragraph"><strong>Subsonic (PR &gt; 0.528):</strong></p>



<pre class="wp-block-code"><code>Ψ = √( (2γ/(γ-1)) · ( PR^(2/γ) − PR^((γ+1)/γ) ) )</code></pre>



<p class="wp-block-paragraph"><strong>Choked (PR ≤ 0.528):</strong></p>



<pre class="wp-block-code"><code>Ψ = √γ · (2/(γ+1))^((γ+1)/(2(γ-1))) = 0.6847</code></pre>



<p class="wp-block-paragraph">Both expressions agree at PR = 0.528, as they must.</p>



<h3 class="wp-block-heading">The consequence nobody expects: your throttle is choked at idle</h3>



<p class="wp-block-paragraph">Idle manifold pressure on a healthy engine might be 35 kPa absolute, against roughly 101 kPa ambient upstream. That&#8217;s a pressure ratio of 0.35, well below critical.</p>



<p class="wp-block-paragraph"><strong>The throttle is sonic.</strong> Flow is at the speed of sound in the gap between plate and bore.</p>



<p class="wp-block-paragraph">That has a specific and useful consequence: when choked, mass flow depends only on Cd, area, upstream pressure and upstream temperature. <strong>Manifold pressure has no influence whatsoever.</strong> Ψ is pinned at 0.6847 and stays there.</p>



<p class="wp-block-paragraph">Which means at idle, the model reduces to:</p>



<pre class="wp-block-code"><code>ṁ = Cd · A · P_ambient / √(R_s · T_up) · 0.6847</code></pre>



<p class="wp-block-paragraph">Every percent of error in your area table becomes a percent of error in calculated air mass, with nothing to absorb it. There is no MAP feedback, no VE term, no second path. Area <em>is</em> the model.</p>



<p class="wp-block-paragraph">Work out where choking ends: PR = 0.528 against 101 kPa ambient means MAP = 53 kPa. Anything below that is choked, which covers idle, overrun, and most light-load cruise on a large-displacement engine. A big proportion of normal driving sits in the region where the area table is the sole determinant of calculated airflow.</p>



<p class="wp-block-paragraph">This is the single strongest reason to get the table right, and the reason area errors show up as idle and cruise fuelling problems specifically.</p>



<h3 class="wp-block-heading">The boosted case, and why pre-throttle pressure matters</h3>



<p class="wp-block-paragraph">Now put the throttle under boost. Upstream is charge pipe pressure, say 200 kPa absolute; downstream is plenum, say 190 kPa. PR = 0.95. Deeply subsonic, and this is where Ψ gets vicious.</p>



<p class="wp-block-paragraph">Run the numbers:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>PR</th><th>Ψ</th></tr></thead><tbody><tr><td>0.96</td><td>0.276</td></tr><tr><td>0.95</td><td>0.306</td></tr><tr><td>0.94</td><td>0.335</td></tr><tr><td>0.93</td><td>0.361</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">A <strong>1% change in pressure ratio produces roughly a 9% change in mass flow.</strong> The function is nearly vertical up here.</p>



<p class="wp-block-paragraph">Which brings us to the thing that decides whether a throttle model can work in boost at all: <strong>you must know the pressure upstream of the throttle plate.</strong></p>



<p class="wp-block-paragraph">Without a pre-throttle sensor, the ECU has to infer it, usually from a modelled pressure drop across the intercooler and pipework, or from a boost target, or by assuming it equals MAP plus some offset. All of those are estimates, and the sensitivity above means a 2 kPa estimation error at part throttle in boost produces a double-digit percentage error in calculated air mass.</p>



<p class="wp-block-paragraph"><strong>Fit the sensor.</strong> On a naturally aspirated engine you can argue that ambient is close enough. On a boosted engine running a throttle-based air model, a pre-throttle pressure sensor is not an optional refinement. It&#8217;s the difference between a model and a guess.</p>



<p class="wp-block-paragraph"><em>My own car runs both sides: pre-throttle and post-throttle pressure are each measured, not inferred. On a throttle mass flow model those two sensors are not instrumentation, they are part of the model, and the pressure ratio between them is the term the whole calculation hinges on. Full sensing list is on the <a href="https://blownbytwins.co.uk/toyota-supra-mk4-delta/">specification page</a>.</em></p>



<p class="wp-block-paragraph">Note also that the <em>sign</em> of the problem inverts across the throttle range. At small openings the pressure ratio is low, the flow is choked or near-choked, and the model is insensitive to downstream pressure but exquisitely sensitive to area. At large openings in boost the pressure ratio approaches unity, area error matters less, and pressure error dominates. Different regions of the same table fail for different reasons.</p>



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



<h2 class="wp-block-heading">Part 3: What the ECU does with it</h2>



<h3 class="wp-block-heading">The throttle mass flow model</h3>



<p class="wp-block-paragraph">A throttle mass flow model, TMF in Emtron&#8217;s vocabulary, with equivalents under different names across most modern standalone platforms, computes cylinder air mass from the throttle rather than from the manifold.</p>



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



<ol class="wp-block-list">
<li>Throttle position → plate angle (via the servo map)</li>



<li>Plate angle → geometric area (via the area table)</li>



<li>Area × Cd → effective area</li>



<li>Effective area + upstream pressure + upstream temperature + pressure ratio → mass flow through the throttle</li>



<li>Mass flow → cylinder filling → fuel</li>
</ol>



<p class="wp-block-paragraph">Contrast that with speed density, which computes cylinder air mass from manifold pressure, air temperature, engine speed and a volumetric efficiency table. <a href="https://blownbytwins.co.uk/previous-cars/r34gtr/new-ecu-time/">I first wrote about why that distinction mattered in 2023</a>, when choosing an ECU for the R34, long before I understood how much sat underneath it.</p>



<p class="wp-block-paragraph">The two models fail in opposite ways, which is precisely why good ECUs run both:</p>



<p class="wp-block-paragraph"><strong>Speed density</strong> is accurate in steady state because MAP is a direct measurement of what&#8217;s actually in the manifold. It&#8217;s <em>late</em> in transients, because the manifold takes time to fill and the sensor reports the result rather than the intent. Stab the throttle and the MAP sensor tells you what happened a few tens of milliseconds ago.</p>



<p class="wp-block-paragraph"><strong>Throttle mass flow</strong> is immediate, because the plate moves before the manifold responds, so the model sees the demand as it happens. But it&#8217;s an inference stacked on a chain of assumptions: area table, Cd, servo map, upstream pressure. Every one of those is a place to be wrong.</p>



<p class="wp-block-paragraph">So the ECU blends them: TMF-weighted during transients where response matters, SD-weighted in steady state where accuracy matters, with a handover region between.</p>



<h3 class="wp-block-heading">Diagnosing the handover</h3>



<p class="wp-block-paragraph">The handover is where calibration errors become visible, and it&#8217;s diagnostically valuable for exactly that reason. If your two models disagree, the blend region will show a fuelling discontinuity that tracks the blend weighting rather than any physical parameter.</p>



<p class="wp-block-paragraph">Log fuel trim, or measured lambda error, against whatever variable drives the blend. Three patterns:</p>



<p class="wp-block-paragraph"><strong>A step at the handover.</strong> The two models disagree at that operating point. One is wrong; the trim jumps as authority transfers.</p>



<p class="wp-block-paragraph"><strong>A ramp through the handover.</strong> The models disagree by a growing margin across the region. Usually indicates a slope error in one of them, either a VE table with the wrong shape, or an area table with the wrong curvature.</p>



<p class="wp-block-paragraph"><strong>Clean through the handover, but offset either side.</strong> Both models share a common error downstream of the blend, such as injector characterisation, a global trim, or fuel pressure.</p>



<p class="wp-block-paragraph">That third case is where things get interesting, because a common error can <em>hide</em> the first two. Which leads to the diagnostic fork.</p>



<h3 class="wp-block-heading">The fork: when the symptom contradicts the geometry</h3>



<p class="wp-block-paragraph">Here&#8217;s a scenario worth walking through, because it&#8217;s a trap.</p>



<p class="wp-block-paragraph">Suppose you determine your area table over-states area by roughly 3× in the idle band, established from geometry, exactly as above. The model is being told there&#8217;s three times as much air going past the plate as there really is.</p>



<p class="wp-block-paragraph">You&#8217;d expect the engine to run <strong>rich</strong> at idle, and the fuel model to read <strong>high</strong>.</p>



<p class="wp-block-paragraph">Now suppose your logs show the opposite: TMF reading around 9% <em>low</em> at idle, with a positive fuel correction propping it up.</p>



<p class="wp-block-paragraph">Both observations can&#8217;t be direct consequences of the same cause. Something else is in the chain. Three branches, all testable:</p>



<p class="wp-block-paragraph"><strong>Branch 1: a global trim is masking the shape error.</strong> Somewhere there&#8217;s a multiplier, a fuel scaling constant, or a Cd table that was adjusted until mid-range worked. That adjustment is fighting the area error, and the residual at idle is what&#8217;s left after the fight. Test: remove or neutralise the compensating term and see whether idle error grows in the direction the geometry predicts. If it does, the geometry diagnosis stands and the trim was a bandage.</p>



<p class="wp-block-paragraph"><strong>Branch 2: the Cd table is pulling the other way.</strong> If Cd is populated with values that fall sharply at small openings, it may be cancelling much of the geometric over-statement. Test: multiply the area and Cd tables together and plot the product against angle. That product is what the model actually uses. If the product is close to geometrically correct, the individual tables are wrong but the model isn&#8217;t, which means fixing the area table alone will break it.</p>



<p class="wp-block-paragraph"><strong>Branch 3: the axis doesn&#8217;t mean what you think.</strong> The table may be indexed on plate angle rather than percentage travel; or on a normalised area rather than absolute; or the &#8220;servo position&#8221; channel may be the commanded target rather than the measured position, which differ during any transient and can differ statically if there&#8217;s a calibration offset. Test: command a known position, measure the actual plate angle, and confirm which number the table is being indexed on.</p>



<p class="wp-block-paragraph"><strong>Resolve the fork before changing anything.</strong> The failure mode here is correcting the area table on sound geometric grounds, discovering the engine now runs badly, and concluding the geometry was wrong. The geometry isn&#8217;t wrong. Something else in the chain was compensating for it, and you&#8217;ve now removed one half of a matched pair.</p>



<p class="wp-block-paragraph">Which is the general rule: <strong>compensating errors must be corrected together or not at all.</strong> If a wrong area table and a wrong global trim have been co-calibrated to produce acceptable fuelling, fixing either one alone makes the car worse. Identify both, correct both, revalidate.</p>



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



<h2 class="wp-block-heading">Part 4: The dual-use trap</h2>



<p class="wp-block-paragraph">On a drive-by-wire car, the throttle area table is usually consumed in two directions.</p>



<p class="wp-block-paragraph"><strong>Forward</strong>, for the air model: position → area → mass flow → fuel.</p>



<p class="wp-block-paragraph"><strong>Inverse</strong>, for torque-based control: torque demand → required mass flow → required area → <strong>target throttle position</strong>.</p>



<p class="wp-block-paragraph">The same table. Read backwards.</p>



<p class="wp-block-paragraph">That inverse map is not an edge case. It is what every torque-based system on the car leans on. When <a href="https://blownbytwins.co.uk/?p=1118">traction control</a> decides to pull torque and reaches for throttle area as its first actuator, this table is what turns a torque request into a plate position. An area table that is wrong at small openings makes every one of those interventions wrong too.</p>



<p class="wp-block-paragraph">Three consequences.</p>



<h3 class="wp-block-heading">Fixing the fuel model changes the pedal</h3>



<p class="wp-block-paragraph">If the table over-states area at small openings, the inverse map under-commands position for a given torque request, because the controller thinks a tiny opening delivers a lot of air, so it asks for a tiny opening. Correct the table and the same pedal input now produces a larger commanded opening.</p>



<p class="wp-block-paragraph">Which is <em>correct</em>, but it isn&#8217;t <em>the same</em>. Tip-in response, idle control authority, cruise position and any part-throttle torque limiter behaviour all shift. Expect to revalidate driveability alongside fuelling, and don&#8217;t do it on a road.</p>



<h3 class="wp-block-heading">Non-monotonicity breaks the inverse map</h3>



<p class="wp-block-paragraph">A table with hand-entered noise, where area at 5% exceeds area at 6%, is merely inaccurate in the forward direction. It&#8217;s <em>ill-posed</em> in the inverse direction.</p>



<p class="wp-block-paragraph">Inverting a non-monotonic function means that for some torque demands, more than one throttle position satisfies the request. Depending on how the solver is implemented, you get target jumps, hunting, or an oscillation whose frequency is set by the controller rather than by anything physical.</p>



<p class="wp-block-paragraph">Where does hand-entry noise usually live? In the low-percentage cells, because that&#8217;s where people have been poking at values trying to fix an idle problem. Which is exactly where idle control and tip-in operate.</p>



<p class="wp-block-paragraph"><strong>Check monotonicity explicitly.</strong> It takes one line:</p>



<pre class="wp-block-code"><code>assert np.all(np.diff(area_table) &gt; 0), "Area table is non-monotonic"</code></pre>



<p class="wp-block-paragraph">If that fails, no amount of downstream tuning will produce stable control.</p>



<h3 class="wp-block-heading">The table is not a tuning parameter</h3>



<p class="wp-block-paragraph">The strongest reason to build the area table from geometry rather than from fitting: it&#8217;s the only table in the chain that has a <strong>verifiable, physical, single correct answer</strong>.</p>



<p class="wp-block-paragraph">VE is empirical. Cd is empirical. Injector characterisation is empirical. Geometric flow area is a solid modelling problem with one right answer, computable from four measurements, and it does not change as the engine ages.</p>



<p class="wp-block-paragraph">Once it&#8217;s correct, it&#8217;s correct permanently, and every empirical table downstream is being fitted against a fixed truth rather than against another set of assumptions. That&#8217;s what makes the rest of the calibration converge instead of chasing itself.</p>



<p class="wp-block-paragraph">Treating the area table as somewhere to dial in a fuelling problem throws away the one fixed reference point in the entire model.</p>



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



<h2 class="wp-block-heading">Part 5: Method</h2>



<ol class="wp-block-list">
<li><strong>Measure the hardware.</strong> Bore diameter, shaft diameter, plate thickness. Callipers.</li>



<li><strong>Measure the closed angle.</strong> Digital angle gauge against the plate face at the closed stop. This number matters more than any other single measurement, because it sets where you sit on the quadratic.</li>



<li><strong>Measure the open stop.</strong> Same method, throttle commanded to 100%.</li>



<li><strong>Verify the servo map.</strong> Command 20%, 40%, 60%, 80%; measure the angle at each. Confirm the travel-to-angle relationship is linear before assuming it.</li>



<li><strong>Compute the geometric table numerically.</strong> Use the code above, at the resolution your ECU&#8217;s table supports. Populate the low-percentage region densely, because that&#8217;s where the curvature is, and where linear interpolation between widely-spaced breakpoints does the most damage.</li>



<li><strong>Check monotonicity.</strong> Every cell strictly greater than the one before.</li>



<li><strong>Handle Cd deliberately.</strong> Separate table if the ECU allows it. If not, decide consciously what Cd assumption you&#8217;re folding in and write it down.</li>



<li><strong>Identify existing compensating terms before you change anything.</strong> Global fuel multipliers, mass fuel corrections, Cd tables, anything that&#8217;s been trimmed to make the current calibration work. These come out or get re-derived in the same change.</li>



<li><strong>Validate against logs.</strong> With the corrected table, TMF and SD should converge in steady state without a compensating pad. That convergence is your proof, not the smoothness of the fuel trim, which can be smooth for the wrong reasons.</li>



<li><strong>Revalidate driveability</strong>, because you have just changed the inverse map that determines where the plate goes.</li>
</ol>



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



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



<p class="wp-block-paragraph">A butterfly valve&#8217;s open area grows with the square of plate angle near closed, not linearly. In the idle-to-light-cruise band, a linear table over-states area by two to four times.</p>



<p class="wp-block-paragraph">Below roughly 53 kPa manifold pressure, the throttle is choked and manifold pressure has no effect on flow at all. Area and upstream pressure are the entire model. Above that, in boost, the flow function is so steep that a 1% pressure ratio error produces a 9% mass flow error, which is why pressure sensors either side of the plate are mandatory rather than optional on a boosted throttle-model car.</p>



<p class="wp-block-paragraph">The area table is the only table in the air model with a single verifiable correct answer. Build it from geometry, keep the empirical corrections in the tables designed for them, and check it&#8217;s monotonic before wondering why the drive-by-wire target is hunting.</p>



<p class="wp-block-paragraph">And if fixing it makes the engine worse, you&#8217;ve found a compensating error, not a mistake in the maths.</p>



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



<p class="wp-block-paragraph"><em>This is the first of a series on the Emtron KV12 running a 3.4 litre 2JZ. The torque model that sits on top of this table drives the <a href="https://blownbytwins.co.uk/?p=1118">traction control strategy</a>, and it is also what caps engine torque at the <a href="https://blownbytwins.co.uk/?p=1093">measured limit of the gearbox</a>. Full specification and measurement conditions are 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 have built one of these tables from geometry and found the Cd behaviour at very small openings differs from the published ranges, I would like to hear about it. That is the part of this I trust least.</p><p>The post <a href="https://blownbytwins.co.uk/cars/mk4-supra/throttle-body-effective-area/">Throttle Body Effective Flow Area: Building a Correct Area vs Position Table</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/throttle-body-effective-area/">Throttle Body Effective Flow Area: Building a Correct Area vs Position Table</a> appeared first on <a rel="nofollow" href="https://blownbytwins.co.uk">BlownByTwins</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
