Sunday, 1 February 2015

programming - LTSpice Automation


I have a battery-powered boost converter and I'm attempting to measure the maximum input (battery) voltage droop under various load conditions of high current draws (different duty-cycles/periodicities) in addition to over several battery types (various voltages/internal resistances). Since I'm simulating such a (relatively) large amount of operational time the simulation files are getting pretty substantial, not to mention they take a while. I would like to automate LTSpice so that I can change component values programatically and rerun simulations and capture data (values of things like voltage or current). I know that:



  • WAV files can be used to input/output data from the program

  • The program can be run from the command line


So far my best option seems to use a combination of these two options along with my own code/script in a fashion that accomplishes my goals, but I just wonder if there is a better way already out there.



Has anyone automated LTSpice or know if there has been any kind of automation API written for it (either by the manufacturer or by 3rd parties)?




Ideally I would like to have a solver, such that I gave it the desired parameters and it tried various component values until it found the "optimal" solution to my constraints.



Answer



Running a simulation multiple times and changing multiple component values is a bit more involved than just changing one (which is not so bad)


Here is the concept for changing one value:



  • Add a .param statement using the SPICE directive icon on the far right, e.g. for a resistance value .param X=R

  • To use it you would enter {x} into the resistor value, then include e.g. .step param X 100 500 50 to step the value between 100 and 500 in increments of 50.


Example:


Step Example



Result:


Graph


For multiple values, the only way I found to work was using a list of values for X, and using the table statement. This is probably best explained with an example (reading the help for the commands used will probably be helpful here). But note that the table command syntax is in the form table(index, x1, y1, x2, y2, .... xn, yn), takes index as input and returns an interpolated value for x=index based on the supplied x,y pairs.


In one of my simulations I needed to perform 12 simulations whilst changing 3 different component values, here are the commands:


.step param X list 1 2 3 4 5 6 7 8 9 10 11 12
.param Rin1 = table(X, 1, 1,1p, 2, 1p, 3, 1p, 4, 4478, 5, 4080, 6, 3400, 7, 2200, 8, 1p, 9, 1p, 10, 1p, 11, 1p, 12, 1p)
.param Rin2 = table(X, 1, 4997, 2, 4997, 3, 4997, 4, 499, 5, 897, 6, 1577, 7, 2777, 8, 4997, 9, 4997, 10, 4997, 11, 4997, 12, 4997)
.param Tval = table(X, 1, 56, 2, 56, 3, 27, 4, 1G, 5, 1G, 6, 1G, 7, 1G, 8, 1G, 9, 330, 10, 330, 11, 120, 12, 120)
.param Kval = table(X, 1, 316, 2, 147, 3, 147, 4, 6340, 5, 6340, 6, 6340, 7, 6340, 8, 6340, 9, 6340, 10, 825, 11, 825, 12, 316)


Result:


Gain Example


Hopefully you get the idea, you could maybe produce a script that would produce the necessary SPICE commands when you fill in your desired values. Or just create a template (e.g. I just copied and pasted the above into a few different simulations and changed the values)


If the above doesn't do what you want, then maybe look at something like NI's multisim (I think it has some batch simulation options, although I'm not sure how useful they are) It may also be helpful to ask on the LTSPice forum and see if someone knows of a better way of doing things.


No comments:

Post a Comment

arduino - Can I use TI's cc2541 BLE as micro controller to perform operations/ processing instead of ATmega328P AU to save cost?

I am using arduino pro mini (which contains Atmega328p AU ) along with cc2541(HM-10) to process and transfer data over BLE to smartphone. I...