velxio/docs/wiki/circuit-emulation-appendix.md

10 KiB
Raw Blame History

Appendix — Netlists, Opcodes, Model Parameters, Glossary

A. Reference netlists (one per analysis type)

A.1 .op — DC operating point

Voltage divider DC op-point
V1 vcc 0 DC 9
R1 vcc out 1k
R2 out 0 2k
.op
.end

A.2 .tran — transient analysis

RC charging
V1 vcc 0 PULSE(0 5 0 1n 1n 10 20)
R1 vcc out 10k
C1 out 0 100u IC=0
.ic v(out)=0
.tran 10m 3
.end

A.3 .ac — AC small-signal sweep

RC low-pass AC sweep
V1 in 0 AC 1
R1 in out 1k
C1 out 0 159.155n
.ac dec 20 10 1Meg
.end

A.4 .dc — DC sweep

Diode I-V curve
V1 a 0 DC 0
D1 a 0 DMOD
.model DMOD D(Is=1e-14 N=1)
.dc V1 0 1 0.01
.end

A.5 Behavioral logic gates (B-source)

NAND gate
Va a 0 DC 5
Vb b 0 DC 5
Bnand y 0 V = 5 * (1 - u(V(a)-2.5) * u(V(b)-2.5))
Rload y 0 1k
.op
.end

A.6 Schmitt-switch relaxation oscillator (simplified 555)

Relaxation oscillator
Vcc vcc 0 DC 5
R1 vcc cap 10k
Ccap cap 0 10n IC=0
Sdis cap 0 cap 0 SMOD
.model SMOD SW(Vt=2.5 Vh=0.833 Ron=100 Roff=1G)
Sbuf out vcc cap 0 SOUT
.model SOUT SW(Vt=2.5 Vh=0.833 Ron=10 Roff=1G)
Rpd out 0 100k
.tran 0.5u 2m
.end

A.7 Bridge rectifier with sine source

Full-wave bridge rectifier
V1 a b SIN(0 6 50)
D1 a p DMOD
D2 b p DMOD
D3 n a DMOD
D4 n b DMOD
R1 p n 1k
.model DMOD D(Is=1e-14 N=1)
.tran 0.1m 40m
.end

A.8 Common-emitter BJT amplifier

Common-emitter with 2N2222
Vcc vcc 0 DC 12
Vin in 0 SIN(0 0.01 1k)
Cin in b 1u
RB1 vcc b 47k
RB2 b 0 10k
RC vcc c 4.7k
RE e 0 1k
CE e 0 100u
Q1 c b e Q2N2222
Cout c out 1u
Rout out 0 100k
.model Q2N2222 NPN(Is=1e-14 Bf=200 Vaf=75)
.tran 10u 6m
.end

A.9 Ideal op-amp (VCVS) as inverting amplifier

Op-amp inverting amplifier, gain -10
Vin in 0 DC 0.2
Rin in n 1k
Rf n out 10k
Eopa out 0 0 n 1e6
.op
.end

A.10 N-MOSFET switch

N-MOS switch
Vcc vcc 0 DC 5
Vgate gate 0 DC 5
RL vcc drain 1k
M1 drain gate 0 0 NMOS_L1 L=1u W=100u
.model NMOS_L1 NMOS(Level=1 Vto=1.0 Kp=50u Lambda=0.01)
.op
.end

B. AVR opcode encodings (the ones we use)

Instruction Encoding (bits 15..0) Bytes Notes
LDI Rd, K 1110 KKKK dddd KKKK 2 d = Rd 16, Rd ∈ [16..31]
OUT A, Rr 1011 1AAr rrrr AAAA 2 A ∈ [0..63] (I/O space)
IN Rd, A 1011 0AAd dddd AAAA 2
STS k, Rr 1001 001r rrrr 0000 + kkkkkkkk kkkkkkkk 4 32-bit instruction, k is 16-bit address
LDS Rd, k 1001 000d dddd 0000 + kkkkkkkk kkkkkkkk 4 32-bit
RJMP k 1100 kkkk kkkk kkkk 2 signed 12-bit word offset from PC+1
SBRC Rr, b 1111 110r rrrr 0bbb 2 skip if bit clear
SBRS Rr, b 1111 111r rrrr 0bbb 2 skip if bit set
NOP 0000 0000 0000 0000 2
CALL k 1001 010k kkkk 111k + kkkkkkkk kkkkkkkk 4 not used here
RET 1001 0101 0000 1000 2 not used here

C. ATmega328P register addresses (used in our programs)

Register I/O addr SRAM addr Purpose
DDRB 0x04 0x24 Port B data direction
PORTB 0x05 0x25 Port B output
PINB 0x03 0x23 Port B input
DDRC 0x07 0x27 Port C data direction
PORTC 0x08 0x28 Port C output
DDRD 0x0A 0x2A Port D data direction
PORTD 0x0B 0x2B Port D output
TCCR0A 0x24 0x44 Timer0 control A
TCCR0B 0x25 0x45 Timer0 control B
TCNT0 0x26 0x46 Timer0 counter
OCR0A 0x27 0x47 Timer0 compare A (PWM D6)
OCR0B 0x28 0x48 Timer0 compare B (PWM D5)
OCR2A 0xB3 Timer2 compare A (PWM D11)
OCR2B 0xB4 Timer2 compare B (PWM D3)
TCCR1A 0x80 Timer1 control A
TCCR1B 0x81 Timer1 control B
OCR1AL 0x88 Timer1A compare low (PWM D9)
OCR1AH 0x89 Timer1A compare high
OCR1BL 0x8A Timer1B compare low (PWM D10)
ADCL 0x78 ADC result low byte
ADCH 0x79 ADC result high byte
ADCSRA 0x7A ADC control and status A
ADMUX 0x7C ADC multiplexer

Registers above 0x5F can only be accessed via STS / LDS (32-bit instructions), not OUT / IN.

D. ADMUX / ADCSRA bit fields

ADMUX (0x7C)

Bit Name Purpose
7 REFS1 Voltage reference selection bit 1
6 REFS0 Voltage reference selection bit 0 — 01 = AVCC with cap at AREF
5 ADLAR ADC Left Adjust Result — 0 = right, 1 = left
4 reserved
3..0 MUX3..0 Channel select — 0000 = ADC0 (A0), 0001 = A1, …

Common values:

  • 0x40 = AVCC ref, right-adjusted, A0
  • 0x60 = AVCC ref, left-adjusted, A0 (we use this!)
  • 0xC0 = Internal 1.1V ref, right-adjusted, A0

ADCSRA (0x7A)

Bit Name Purpose
7 ADEN ADC Enable
6 ADSC ADC Start Conversion — write 1 to start; auto-clears when done
5 ADATE Auto Trigger Enable
4 ADIF ADC Interrupt Flag
3 ADIE ADC Interrupt Enable
2..0 ADPS2..0 Prescaler Select — 111 = /128 (= 125 kHz ADC clock at 16 MHz)

Common values:

  • 0x87 = ADEN + prescaler /128 (initial setup)
  • 0xC7 = ADEN + ADSC + /128 (start conversion)

Conversion timing

  • First conversion: 25 ADC clock cycles
  • Subsequent: 13 ADC clock cycles
  • At 125 kHz ADC clock: first ≈ 200 µs, subsequent ≈ 104 µs

E. TCCR0A / TCCR0B bit fields

TCCR0A (0x24, I/O)

Bit Purpose
7 COM0A1 — 1 for non-inverting PWM on OC0A
6 COM0A0
5 COM0B1
4 COM0B0
3..2
1 WGM01 — Waveform Generation Mode bit 1
0 WGM00 — bit 0

TCCR0B (0x25, I/O)

Bit Purpose
7 FOC0A / FOC0B — force compare
5..4
3 WGM02
2..0 CS02..0 — clock source

Mode 3: Fast PWM 8-bitWGM02:0 = 011. Counter counts 0..255, TOP = 0xFF.

Settings we use (for the potToPwmProgram):

  • TCCR0A = 0x83 = COM0A1=1 + WGM01=1 + WGM00=1 → non-inverting Fast PWM on D6
  • TCCR0B = 0x01 = CS00=1 → no prescaler (16 MHz counter → 62.5 kHz PWM frequency)

F. LED model parameters (tuned for typical datasheet Vf @ 10 mA)

const LED_PARAMS = {
  red:    { Is: 1e-20, n: 1.7, ratedCurrent: 0.020 },   // V_f ≈ 2.0 V
  green:  { Is: 1e-22, n: 1.9, ratedCurrent: 0.020 },   // V_f ≈ 2.2 V
  yellow: { Is: 1e-21, n: 1.8, ratedCurrent: 0.020 },   // V_f ≈ 2.1 V
  blue:   { Is: 1e-28, n: 2.0, ratedCurrent: 0.020 },   // V_f ≈ 3.1 V
  white:  { Is: 1e-28, n: 2.0, ratedCurrent: 0.020 },
};

Shockley: I = Is · (exp(V / (n · Vt)) 1), with Vt = 0.02585 V at 300 K.

To tune another color: pick a datasheet point (V_f, I) and solve for Is:

Is = I · exp(V / (n · Vt))

G. NTC β-model

R(T) = R0 · exp(β · (1/T  1/T0))  // T in Kelvin

Common 10 kΩ NTC (β=3950, T₀=25 °C = 298.15 K):

T (°C) T (K) R (kΩ) V_A0 @ 10k pullup to 5V
20 253.15 95.4 4.52 V
0 273.15 33.6 3.85 V
25 298.15 10.0 2.50 V
50 323.15 3.59 1.32 V
100 373.15 0.68 0.32 V

Inverse (recovering T from measured R):

T = 1 / (1/T0 + (1/β) · ln(R / R0))

This is what e2e_thermistor.test.js does to convert ADC readings back to Celsius.

H. Glossary

  • MNA (Modified Nodal Analysis) — SPICE's core algorithm. Unknowns are node voltages plus branch currents of voltage sources.
  • Companion model — linearization of a reactive element (C, L) into an equivalent resistor + source at each timestep.
  • Backward Euler — simple first-order implicit integration, unconditionally stable but damps high-frequency content.
  • Trapezoidal integration — second-order, SPICE's default; more accurate but can ring.
  • Newton-Raphson — iterative method for non-linear equations. Converges quadratically near a solution.
  • pnjlim — SPICE's internal voltage limiter for PN junctions; prevents exp() overflow on early iterations.
  • GMIN — minimum conductance added to every node; prevents singular matrices.
  • Shockley equationI = Is · (exp(V/(nVt)) 1). Governs ideal pn junctions.
  • Ebers-Moll — simplified BJT model; predecessor to the more accurate Gummel-Poon.
  • Schmitt trigger — a comparator with hysteresis; outputs digital clean levels from noisy analog inputs.
  • XSPICE — ngspice extension that adds digital primitives (AND, OR, FF, etc.) as first-class elements. Not compiled into the current eecircuit-engine WASM.
  • B-source — ngspice behavioral voltage/current source: B1 n+ n- V = expression.
  • S-element — ngspice voltage-controlled switch with optional hysteresis.
  • VCVS/VCCS/CCVS/CCCS — voltage-controlled-voltage / voltage-controlled-current / current-controlled-voltage / current-controlled-current sources; implement ideal op-amps, gain blocks, etc.
  • PWL — piecewise-linear source, PWL(t0 v0 t1 v1 …). Useful for arbitrary-shape stimuli.
  • Intel HEX — ASCII file format for program memory, used by Arduino, avr-objcopy, etc.
  • PORTB / PORTC / PORTD — 8-bit I/O registers on ATmega328P. Drive the Arduino pin sets.
  • ADLAR — ADC Left Adjust Result. When set, the 10-bit ADC result is aligned so that ADCH has the top 8 bits.
  • OCR — Output Compare Register. Compared against a timer counter to drive PWM.
  • Quasi-static co-simulation — digital and analog engines advance independently on a coarse time grid, not cycle-locked.

I. Useful external references