问题说明
需要使用Sysblock构建并封装三角波/锯齿波/PWM波发生器
参数要求:波形的幅值,周期,以及延迟角度(角度制,输入范围为0-360°)
构建思路
此处三个示例(示例的源模型见最下方的附件)均以clock模块为基底进行变换,假定所需输出幅值为10,周期为5,延迟角度值为90
注意:使用前需要设定步长为较小的值(如0.001)
锯齿波
先将延迟角度(constant6)除以360,计算出其占一个周期的比例,再乘以周期(constant1)得出波形需要的延迟时间:

使clock信号加上延迟时间,并除以周期求余,得到一个幅值为周期长度的锯齿波:


最后将实际所需要的幅值(constant2)除以周期,将该值乘以前面的得到的幅值为周期的锯齿波,得出最终输出的锯齿波波形:


PWM波
PWM波前期延迟部分与锯齿波部分相同,如图:

在得到一个幅值为周期长度的锯齿波后,将该波形与半个周期大小的数值进行比较,波形数字大于周期一半为-1,小于周期一半为1,现在我们得到了一个幅值为1的PWM波
最终将波形送入switch模块进行判决,波形大于0的部分为幅值,小于0的部分为幅值的负数,进行输出:

三角波

1.三角波延迟部分同样与与锯齿波部分相同,如上图所示:
2.因为我们的思路是将一根特定斜率的斜线折叠形成一个三角波,因此将给定这个斜线的斜率为(4*规定幅值/规定周期);
3.这一步波形将除以(4规定幅值)并求余,来产生幅值为(4规定幅值)的锯齿波;
4.对每段锯齿波,我们将在三角波预设的最大/最小幅值处通过折叠以及正负变换的方式来产生三角波
最终输出如下:

基于积分的三角波

1.三角波延迟部分同样与与锯齿波部分相同,如上图中步骤1所示:
2.因为我们采用的方式是将PWM波进行积分的方法来构建三角波,所以波形需要额外延迟0.25个周期,来确保无延迟时,三角波是以下的效果:

3.之后求余-与半个周期大小的数值比较-switch模块判决部分与pwm波相同,这一步结束后我们得到了一个我们所设定幅值的pwm波;
4.对PWM波进行积分获得一个需要调整的三角波,三角波的上升部分波形斜率为大小等于幅值,其幅值正负值之差为(设定的幅值*周期/2);
5.向波形赋一个初始值,三角波假如存在延迟,y轴波形值并不是由0开始,因此需要给定一个值作为波形的起始值,这个初始值通过计算被延迟的已经延迟了0.25个周期的PWM波的积分得到,过程如下:
- 下图将输入线性函数 y=x通过折叠/绝对值变换为范围为[0,1]的三角波,得出的值为需要计算面积的PWM波的宽度比例;

-
将上图的比例乘以周期可以得到需要计算面积的PWM波的宽度;
-
最后乘以幅度即为波形的起始值,将其加入至三角波形中。
6.因为PWM波积分至三角波过程中的幅值产生了变化,我们需要将波形乘以(4/周期)(原因见步骤4),使得波形最终的幅值正负值之差为2*设定的幅值,输出结果如下:

模块的封装过程
Sysblock同样具有模块封装功能,其意义在于将内部复杂的子系统(如多个数学运算、逻辑控制等)隐藏起来,对外仅暴露必要的输入/输出接口和参数。
三角波
根据前文的描述,已知在构建的三角波信号发生器中幅度对应的是常量模块Constant2,周期对应的是常量模块Constant4,延迟角度值对应的是常量模块Constant7。因而假如需要将这三个参数作为模块对外的接口,需要我们在三角波信号发生器界面“右键——选择‘编辑封装’——在编辑器下方的的‘参数提升‘处选择前文所述的三个常量——选择‘提升’——修改常量的文本以提高使用者可读性’”:

封装后模块效果如下:

PWM波
构建的PWM波信号发生器中幅度对应的是常量模块Constant2,周期对应的是常量模块Constant4,延迟角度值对应的是常量模块Constant6,进行参数提升后效果如下:

锯齿波
构建的PWM波信号发生器中幅度对应的是常量模块Constant2,周期对应的是常量模块Constant1,延迟角度值对应的是常量模块Constant6,进行参数提升后效果如下:

最终成果与比较

我们将使用我们所构建的Sysblock模块与代码产生的波形进行比较精度:
PWM波比较,仅有波形跳变处存在一个类似于冲激函数的波形,可以认为精度较高:

锯齿波比较,由y轴处可以认为精度较高:

三角波比较,于锯齿波比较相似,由y轴处同样可以认为精度较高:

至于基于的积分三角波比较,我们可以发现存在一个较小的误差,随着周期数的增加,误差会越变越大。

检查发现因存在积分步骤,且三角波由PWM波变化而来,由上图PWM波比较时存在一个较小的冲激,导致积分时会比结果略大一点点,从而导致误差,而这需要在PWM波处尽量减小步长,提高精度,来避免误差出现,因此我们不采用这种设计