我试图生成方形脉冲时钟。但它给出了错误。我试过这个:
function pll( block)
setup(block);
function setup(block)
% Register number of ports
block.NumInputPorts = 1;
block.NumOutputPorts = 1;
% Override input port properties
block.InputPort(1).Dimensions = 1;
block.InputPort(1).DatatypeID = 8; % boolean
block.InputPort(1).Complexity = 'Real';
block.InputPort(1).DirectFeedthrough = false;
% Override output port properties
block.OutputPort(1).Dimensions = 1;
block.OutputPort(1).DatatypeID = 0; %double
block.OutputPort(1).Complexity = 'Real';
block.NumDialogPrms = 1;
block.DialogPrmsTunable = 0;
ts = 1/24000000'; %'
block.sample times= [ts 0];
block.SimStateCompliance = 'DefaultSimState'
function Outputs(block)
t = [0:1/(24000000):0.000001];
l = 0.1*exp(-6);
c = 220*exp(-9) + 60*exp(-9);
f = 1/(2*pi*sqrt(l*c));
block.OutputPort(1).Data = square(2*pi*f*t);
function Terminate(block)
但它给了我错误
"评估注册方法'输出'时出错M-S-Function' pll'在 '无标题/ Level-2 M-file S-Function'。无效的作业 '无标题/ Level-2 M文件S-Function':尝试分配矢量 宽度24001到宽度为1的向量。"
错误表示在行
block.OutputPort(1).Data = square(2*pi*f*t);
那么可以做些什么来克服这个错误?
答案 0 :(得分:1)
从您的示例来看,您似乎并不熟悉Simulink的工作方式。在每个时间步,Simulink模型中的每个块输出对应于 当前 模拟时间的值(即块的输出值)。在您的情况下,在block.Output
函数中,您尝试在 每个 输出 所有 时间点模拟时间步。
看来你真正想要的是替换
t = [0:1/(24000000):0.000001];
与
t = block.CurrentTime;
并替换
block.OutputPort(1).Data = square(2*pi*f*t);
与
block.OutputPort(1).Data = sign(sin(2*pi*f*t));
此外,还需要考虑其他一些事项:
您似乎没有使用以下方法注册块的输出方法:
block.RegBlockMethod( '输出',@输出);
为什么在没有输入的情况下将块定义为输入?
为什么你在S-Function中执行此操作时,从工作区块(或许多其他方法获取数据到模型中)似乎更有意义?