用28335做数字控制器,调节器计算用到了controlSuite包含的DCL库中的DCL_runDF23()函数,但是输出结果与仿真和MATLAB计算结果不符,请用过的大神不吝赐教!
为添加和使用该库,代码中做了以下几处修改:
1.添加头文件:
#include "DCL.h"
#include "DCL_fdlog.h"
2.在main函数前,创建实体:
DF23 VolPR=DF23_DEFAULTS;
3.在main函数中,初始化实体:
VolPR.a1=-2.92f;
VolPR.a2=2.84f;
VolPR.a3=-0.92f;
VolPR.b0=5.77e-06f;
VolPR.b1=5.77e-06f;
VolPR.b2=-5.77e-06f;
VolPR.b3=-5.77e-06f;
4.在调用频次为150kHz的AD中断服务函数中调用实体:
SinVal=VP*sin(Kn*xn);
xn++;
if (xn==ModRatio) {xn=0.0f;}
Uc=DCL_runDF23(&VolPR,SinVal);
DCL_writeLog(&rBuf,Uc);
DCL_writeLog(&rBuf1,SinVal);
以简单验证此函数的输出。
其中,Kn=2*pi/3000,ModRatio=3000,即产生一个幅值为85,频率为50Hz,采样率为150kHz的正弦信号,直接给VolPR调节器,观察输出信号。用DCL_fdlog库记录输出数据Uc,并用CCS的graph功能画出波形:
其中,上图为调节器输出Uc,下图为调节器输入SinVal。
用PSIM仿真,搭建的原理图如下:
仿真波形如下:
为确保准确,又在MATLAB中利用上述VolPR调节器对应的时域离散表达式算出时域离散数列,画出波形如下:
可见,PSIM与MATLAB结果一致。
那么,DCL库计算错在哪了呢?
Shaojie Song:
啊啊啊,找了一天,终于发现原因了!float数赋值问题,本来的代码里写得赋值为:
VolPR.a1=-2.92f;VolPR.a2=2.84f;VolPR.a3=-0.92f;VolPR.b0=5.77e-06f;VolPR.b1=5.77e-06f;VolPR.b2=-5.77e-06f;VolPR.b3=-5.77e-06f
实际上用CCS Expressions看到的是:
就是这么点差别,把上图的参数用MATLAB画出的波形后,与楼上的DCL库函数计算的波形一致了:
好亏啊,所以问题变成了float精度的这个问题怎么解决啊,有没有大神在呀?