Encontré lo que quería después de leer la documentación del módulo xspice disponible en ngspice. Me permite escribir modelos para mis componentes digitales en C y luego simular componentes discretos periféricos utilizando modelos de especias existentes para transistores, resistencias, etc. Todavía estoy experimentando con esta función, pero hasta ahora ha sido muy prometedor porque puedo modelar cualquier firmware. Controlador digital basado en entradas y salidas de un componente digital definido en el esquema.
Aquí hay un pequeño ejemplo desechable de un componente pwm personalizado:
Luego,exportoestocomounalistadereddeespeciasdesdekicad:
*SheetName:/A1Net-_A1-Pad1_GNDNet-_A1-Pad3_Net-_A1-Pad4_MKPWM01V1Net-_A1-Pad1_GND3.3vR3OUTGND50kR2Net-_A1-Pad3_GND10kR1Net-_A1-Pad1_Net-_A1-Pad3_10kC1OUTGND10nR4OUTNet-_A1-Pad4_50k.end
Luegoagregounpequeñoscriptdeenvolturadondeagregoloscomandosngspiceparamicircuito:
.modelmkpwm01mkpwm01(freq=100).include"spice_test.cir"
.control
tran 1ms 100ms
plot v(OUT)
.endc
.end
Y finalmente agrego el modelo de código para el componente mkpwm en src / xspice / icm y luego compilo ngspice:
void cm_d_mkpwm01(ARGS) {
if (ANALYSIS == DC || ANALYSIS == TRANSIENT) {
double out = sin(TIME * PARAM(freq) * 2.f * M_PI);
if(out > 0) out = INPUT(vcc);
else out = INPUT(gnd);
OUTPUT(out) = out;
}
}
Y el archivo de definición de modelo (.ifs):
NAME_TABLE:
Spice_Model_Name: mkpwm01
C_Function_Name: cm_d_mkpwm01
Description: "pwm generator"
PORT_TABLE:
Port_Name: vcc gnd in out
Description: "vcc" "gnd" "input" "output"
Direction: in in in out
Default_Type: v v v v
Allowed_Types: [v] [v] [v] [v]
Vector: no no no no
Vector_Bounds: - - - -
Null_Allowed: no no no no
PARAMETER_TABLE:
Parameter_Name: freq
Description: "frequency"
Data_Type: real
Default_Value: 1
Limits: [1e-12 -]
Vector: no
Vector_Bounds: -
Null_Allowed: yes
Finalmente, al ejecutar el script de envoltura se obtiene el resultado:
Muyfelizhastaahora.Ahoraeselmomentodesimularuncircuitomáscomplejo:-)
Nota:Originalmenteagreguéelcomponentexspicecomocomponentedigital,peronofuncionóporquerecibíelerror"el nodo no puede ser tanto digital como analógico", así que tuve que cambiar los pines para que fueran analógicos (tipo v). El manual de ngspice explica diferentes tipos de pin. Además, la entrada del ciclo de trabajo no está realmente implementada en el código. De todos modos, es probable que todavía tenga mucho que aprender cómo funciona xspice api, pero hasta ahora creo que encontré exactamente lo que necesito y espero que esto ayude a alguien a comenzar a usar ngspice para personalizarlo. simulación de circuitos.