DynoPulseDYNOPULSE
Login
Inside the engine

How DynoPulse measures power and torque

Every formula. Every assumption. No black boxes.

A

Channel A — Kinematic (GPS-derived)

v       = GPS Doppler speed [m/s]
a       = EMA(Δv / Δt, α=0.4)               // Δt from GPS-chip clock
m_eff   = m × (1 + rot_inertia(gear))       // 4–25 % rotating mass
ρ_air   = 1.293 × (273.15 / (273.15 + T)) × (P_static / 1013.25)
F_roll  = m × 9.81 × Cr                     // Cr: coast-down measured
v_rel   = v + (v_wind × cos(φ_wind − heading))
F_aero  = 0.5 × ρ_air × CdA × v_rel × |v_rel|   // CdA: coast-down
F_grade = m × 9.81 × sin(θ_road)            // altitude regression
F_net   = m_eff × a + F_roll + F_aero + F_grade
P_wheel = F_net × v
P_engine = P_wheel / (1 − drivetrain_loss)

Pure Newtonian physics. No engine assumptions, no fuel-flow guess. We measure how fast the car is actually accelerating, then back-calculate the force the engine must produce to overcome inertia (including per-gear rotating mass), rolling resistance, aerodynamic drag and road grade. The loss coefficients can be measured for your exact car with a coast-down run instead of being guessed.

+

Coast-down — losses measured, not guessed

// neutral gear, no braking — pure deceleration:
m_eff × dv/dt = −(F0 + F2 × v²)

least-squares fit over the rolldown:
F0 → Cr  = F0 / (m × 9.81)                  // rolling resistance
F2 → CdA = 2 × F2 / ρ_air                   // aero drag area

quality gate: R² ≥ 0.6, span ≥ 25 km/h      // else rejected

After a pull you shift to neutral and let the car roll. From that deceleration the app fits the physical loss model and derives YOUR car's rolling resistance and aero drag — replacing the two most error-prone hand-entered parameters with measured ones. Saved to the vehicle profile and used in every following run.

B

Channel B — Combustion (MAF + lambda)

// If real MAF unavailable, synthesise via speed-density:
ṁ_air [kg/s] = (MAP × Vd × RPM/60 × VE) / (R_air × T_intake × 2)
MAF [g/s]    = ṁ_air × 1000

AFR_actual = AFR_stoich × λ                  // 14.7 / 14.5 / 15.7
fuel_flow  = MAF / AFR_actual
P_fuel     = fuel_flow × LHV                 // 44 / 42.5 / 46 kJ/g
η          = clamp(0.36 + 0.002 × (25 − T_air), 0.31, 0.41)
          × (1 − 0.1 × |λ − 1.0|)
P_engine   = P_fuel × η

Independent of GPS. Reads how much air the engine is consuming and how rich it's running, then calculates the chemical energy of the fuel being burned and the engine's thermal efficiency. Works even when GPS is locked but fails when the car has no MAF sensor — for those cases we synthesise MAF from MAP + RPM + intake temperature.

C

Channel C — Cross-validation

delta_pct = | P_GPS − P_MAF | / | P_GPS | × 100

delta < 5 %   →  HIGH    ●●●
5–10 %         →  MEDIUM  ●●○
10–20 %        →  LOW     ●○○
> 20 %         →  BAD     ○○○   (run rejected)

The honest part. Two completely independent calculations should agree if the inputs are correct and the physics is sound. When they disagree, something is wrong — and DynoPulse tells you instead of hiding it.

D

Channel D — DIN 70020 / ECE R85 atmospheric correction

DIN 70020:  K  = (1013.25 / P_hPa) × √( T_K / 293.15 )
ECE R85:    αa = (990 / P_dry_hPa)^1.2 × (T_K / 298.15)^0.6
            P_dry = P_static − RH × P_sat(T)    // Magnus
            validity: 0.93 ≤ αa ≤ 1.07          // badge in app

P_corrected = P_engine × Cf

Results are normalised to the reference conditions of the norm you pick: DIN 70020 (1013 hPa / 20 °C) or ECE R85 — the type-approval standard, computed on dry-air pressure so humidity is accounted for. The app shows the raw value, the corrected value, the factor itself, and whether your conditions sit inside the norm's validity range (0.93–1.07 for ECE R85) — you always know how trustworthy the correction is.