MATLAB Answers

ressistors with small random offset in SIMULINK

3 views (last 30 days)
Hello , I want to have 10 resistors with a littles offset in resistance by random number arounk 1kohm
i have itried to use matlab simuling VAriable ressistor.
But i dont see how i enter there some random offset in the value.
Thanks.

  11 Comments

Show 8 older comments
Walter Roberson
Walter Roberson on 28 May 2020
I am having difficulty finding resistors in pure simulink. I find resistors in
  • RF Blockset
  • Simscape Electrical
  • Specialized Power Systems
fima v
fima v on 28 May 2020
Hello Wolter , i am not sure regarding what exact simulink i am using, ithink i have here RF blockset.
could you please say on this platform how to define random argument in the resistor value?
Thanks.

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 29 May 2020
Edited: Walter Roberson on 29 May 2020
The attached model is adapted (solver parameters updated) from the File Exchange Contribution
SERIES AND PARALLEL CIRCUITS, version 1.0.0, by Chaitanya Jambotkar
It happens to have 11 resistors from Specialized Power Systems (part of Simscape Electrical)
The resistances can be randomized using
for K = 1 : 11
pn = sprintf('SERIES_PARALLEL_RESISTORS/R_%d', K);
set_param(pn, 'Resistance', sprintf('%.5g', 1000 + randn(1)));
end
Here, SERIES_PARALLEL_RESISTORS is the model name, and each of the resistors happened to be named R_ followed by a number. Resistance is the name of the parameter used in SPS for resistance (some of the other forms of resistor in Simulink use 'R' as the name for the resistance.)
It was saved with R2020a (you did not indicate which version you are using.)

  20 Comments

Walter Roberson
Walter Roberson on 5 Jun 2020
I extended the code to show adding Voltage Measurements, Current Measurements, and Scopes.
The positioning of the Voltage Measurements and Current Measurements, and Scope,could use some improvement -- I positioned them too closely together, so the connecting lines do not show up well.
I have not worked out Op Amps yet. Do you actually want Op Amps, or do you want comparitors? What should the output be for the case where the comparison succeeds?
modname = 'test_model';
N_voltage_sources = 15;
N_resistor = 15;
N_scopes = 1;
N_VM = 1;
N_CM = 1;
SL_powergui_block = 'powerlib/powergui';
SL_DCV_block = 'powerlib/Electrical Sources/DC Voltage Source';
SL_resistor_block = 'powerlib/Elements/Series RLC Branch';
SL_VM_block = 'powerlib/Measurements/Voltage Measurement';
SL_CM_block = 'powerlib/Measurements/Current Measurement';
SL_Scope_block = 'simulink/Sinks/Scope';
DCV_xbase = 50;
DCV_ybase = -150; %yes, negative!
DCV_width = 20;
DCV_height = 35;
DCV_yspacing = 75;
R_xbase = 125;
R_ybase = DCV_ybase;
R_width = 80;
R_height = 35;
R_yspacing = DCV_yspacing;
modfile = sprintf('%s.slx', modname);
if exist(modfile, 'file'); delete(modfile); end
try
h = new_system(modname);
catch
Simulink.BlockDiagram.deleteContents(modname);
end
add_block(SL_powergui_block, sprintf('%s/powergui', modname)); %required solver component
DCV_blocknames = cell(N_voltage_sources, 1);
DCV_ports = cell(N_voltage_sources, 1);
R_blocknames = cell(N_resistor, 1);
R_ports = cell(N_resistor, 1);
VM_blocknames = cell(N_VM, 1);
VM_ports = cell(N_VM, 1);
CM_blocknames = cell(N_CM, 1);
CM_ports = cell(N_CM, 1);
Scope_blocknames = cell(N_scopes, 1);
Scope_ports = cell(N_scopes, 1);
xbase = DCV_xbase;
xend = xbase + DCV_width - 1;
for K = 1 : N_voltage_sources
ybase = DCV_ybase + (K-1)*DCV_yspacing;
yend = ybase + DCV_height;
blockname = sprintf('%s/DCV_%d', modname, K);
DCV_blocknames{K} = blockname;
add_block(SL_DCV_block, blockname, ...
'Position', [xbase, ybase, xend, yend], ...
'InitFcn', 'set(gcbh, ''Amplitude'', string(0.5+0.1*randn()))' );
DCV_ports{K} = get_param(blockname, 'PortHandles'); %- (L) || + (R)
end
xbase = DCV_xbase + 50;
xend = xbase + R_width - 1;
for K = 1 : N_resistor
ybase = R_ybase + (K-1)*R_yspacing;
yend = ybase + R_height;
blockname = sprintf('%s/R_%d', modname, K);
R_blocknames{K} = blockname;
add_block(SL_resistor_block, blockname, 'BranchType', 'R', ...
'Position', [xbase, ybase, xend, yend], ...
'InitFcn', 'set(gcbh, ''Resistance'', string(1000+randn()))');
R_ports{K} = get_param(blockname, 'PortHandles'); %L || R
end
xbase = R_xbase + 50;
for K = 1 : N_VM
ybase = R_ybase + (K-1)*R_yspacing;
yend = ybase + R_height;
blockname = sprintf('%s/VM_%d', modname, K);
VM_blocknames{K} = blockname;
add_block(SL_VM_block, blockname, ...
'Position', [xbase, ybase, xbase + 35, yend]);
VM_ports{K} = get_param(blockname, 'PortHandles'); % + - || outport
end
xbase = R_xbase + 100;
for K = 1 : N_CM
ybase = DCV_ybase + (K-1)*R_yspacing;
yend = ybase + R_height;
blockname = sprintf('%s/CM_%d', modname, K);
CM_blocknames{K} = blockname;
add_block(SL_CM_block, blockname, ...
'Position', [xbase, ybase, xbase+35, yend]); % + || outport -
CM_ports{K} = get_param(blockname, 'PortHandles');
end
xbase = R_xbase + 150;
for K = 1 : N_scopes
ybase = DCV_ybase + (K-1)*R_yspacing;
yend = ybase + R_height;
blockname = sprintf('%s/Scope_%d', modname, K);
Scope_blocknames{K} = blockname;
add_block(SL_Scope_block, blockname, ...
'Position', [xbase, ybase, xbase + 35, yend], ...
'NumInputPorts', '2');
Scope_ports{K} = get_param(blockname, 'PortHandles');
end
for K = 1 : N_voltage_sources
add_line(modname, DCV_ports{K}.RConn, R_ports{K}.LConn);
end
add_line(modname, R_ports{1}.RConn, VM_ports{1}.LConn(1));
add_line(modname, VM_ports{1}.LConn(2), CM_ports{1}.LConn);
add_line(modname, CM_ports{1}.RConn, DCV_ports{1}.LConn);
add_line(modname, VM_ports{1}.Outport, Scope_ports{1}.Inport(1));
add_line(modname, CM_ports{1}.Outport, Scope_ports{1}.Inport(2));
save_system(modname);
fima v
fima v on 5 Jun 2020
Hello Walter, My comperator needs to have input noise 10nV/sqrt(Hz), bandwidth(100MHZ) ,amplitude(200) , the theshhold of the comperator is 0.6v.
VDD=1V VCC=0V .
so if for example (V_plus-V_minus)*Amplitude>0.6 the output is 1V else 0V.
I have tried to used the simscape bandlimited component to achieve those properties.
but then i couldnt connect with the other components as shown above.
If you could make N such comparators , it would be great.
Thanks you very much.

Sign in to comment.

More Answers (1)

Fangjun Jiang
Fangjun Jiang on 27 May 2020
Edited: Fangjun Jiang on 28 May 2020
This "Variable Resistor" is not the right one to use. This "Variable Resistor" represents a physical variable resistor in the lab where you can move a handle or turn a knob to adjust the value of the resistor. The "PS" port of this block can be connect to a motor (for example) to move the handle or turn the knob thus change the resistor.
To implement what you want, you just need to set "R=10e3-10+20*rand(10,1)" in workspace and drop 10 regular resistor blocks in your model, set the parameter for the first resistor to be R(1), ... and the last one to be R(10).

  1 Comment

fima v
fima v on 28 May 2020
could you please show a print screen of "R=10e3-10+20*rand(10,1) in workspace"?
and drop 10 resistors.i am having trouble visualise it.
Thabks.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!