单片机学习小组
直播中

大红枣

11年用户 630经验值
私信 关注

控制器的传递函数该怎么在单片机中实现呢

控制器的传递函数该怎么在单片机中实现呢?该怎么编程呢?

回帖(1)

徐慧

2022-1-19 10:46:36
假如设计好了一个控制器,得到了它的传递函数,那么该怎么在单片机中实现它呢?里面都是微积分,该怎么编程呢?这就要设计到传函的离散化了。
1:离散化
1.1、离散化的目的



  • 将s域下的传递函数转换为离散的z域函数;
  • 将离散域下的函数转化为差分方程,然后在单片机中实现;
1.2、离散化的种类
我们这里讲的离散化都是借助matlab工具进行的,matlab提供多种离散化的方法;
dsys=c2d(sys,ts,’method’); % 传函离散,其中ts表示离散的采样周期,method表示离散的方法;sys表示s域传函,dsys表示对应的z域传函;
其中method包括以下几种方法:



  • zoh 零阶保持器;
  • foh 一阶保持器;
  • tustin 双线性逼近;
  • matched 零极点匹配法;
2:传函到单片机实现的例子
假设一个低通滤波器的传函为:

我们先用matlab工具看下他的特性;

>> num=1;
den=[6.687e-4,1];
sys=tf(num,den);
p=bodeoptions;
p.FreqUnits= 'Hz';
bode(sys,p)


看下他的伯德图:

从图中可以看到该低通滤波器截止频率为237Hz,截止频率处的相移位45度;
我们也用simulink搭建一个仿真,验证下当该滤波器输入一个237HZ的正弦波时,输出是不是一个为-3dB衰减,且相移45度的正弦波;
仿真如下:

波形如下:

图中sine ware和sin wave1两个波形是相差90度的,而滤波出来的Transfer Fcn波形可以正好相差45度,衰减-3dB;
我们现在用matlab对他进行离散化

num=1;
den=[6.687e-4,1];
sys=tf(num,den);
ts=64e-6;
>>  dsys=c2d(sys,ts,'z')


dsys =

   0.09127
  ----------
  z - 0.9087


然后我们用simulink再搭建他对应的离散传函下的系统特性有没有变化;

采样时间为ts=64e-6;
波形如下:

从图中可以看出滤波出来的DiscreteTransfer Fcn波形正好相差45度,衰减-3dB;所以他的离散下的特性没变;
下面将离散域下的函数转化为差分方程
假设输入为x,输出为y;

转化为上面的差分方程后,就可以在单片机中实现了,我们也可以在simulink中用sfun仿真;
看下转化为数字滤波后的特性是否发生变化。同样输入赋值为1,频率为237HZ的正玄波。
仿真如下:

sfun如下:

function y = fcn(u)
persistent yl;  %定义一个静态变量
if isempty(yl)  %给静态变量赋初值
   yl=0;
end
persistent ul;
if isempty(ul)
    ul=0;
end


y=0.9086*yl+0.09136*ul;
yl=y;
ul=u;
仿真波形如下:

从图中可以看出滤波出来的MATLAB Function波形正好相差45度,衰减-3dB;
注意:可能有的人会问,一阶低通滤波器的差分方程的形式不应该是 :

是的。这个是用一阶后项差分法离散后得出的差分方程;
因为没有找到,matlab中传函怎么进行一阶后项差分离散
其实我们也可以定义符号变量进行替代。
>> syms s z Ts;%定义符号变量 s=(1-z^-1)/Ts;%一阶后项差分sys=1/(s+1);subs(sys,,[z])%传递函数中用z替代s ans = -1/((1/z - 1)/Ts - 1) 化成差分方程的形式:

以上整个就是传函的离散化的单片机实现的过程了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分