使用Maltab等工具设计得到的控制器或者滤波器通常是s域传递函数,但是单片机C语言 无法实现s域传递函数。因此需要进行z变换,转换成C语言可实现的离散域传递函数。

定义符号

syms k w2 w1 z Ts双线性变换

s=2/Ts*(z-1)/(z+1);定义s域传递函数

s_tf=k*(s+w2)/(s*(s+w1));转换形式z_tf=collect(s_tf,z) z_tf = ((k*w2*Ts^2 + 2*k*Ts)*z^2 + (2*Ts^2*k*w2)*z + k*w2*Ts^2 - 2*k*Ts)/((2*Ts*w1 + 4)*z^2 - 8*z - 2*Ts*w1 + 4) 替换Ts一般采样频率Ts会在设计好后会固定,因此可以进一步简化, 假定 Ts=0.01;

z_tf_Ts=subs(z_tf,'Ts',0.01') z_tf_Ts = -((k/50 + (k*w2)/10000)*z^2 + (k*w2*z)/5000 - k/50 + (k*w2)/10000)/((- w1/50 - 4)*z^2 + 8*z + w1/50 - 4) 替换更多参数如果Ts,w1,w2均不需要调整,只有k值需要调整,则可以替换更多, 假定 Ts=0.01,w1=0.01,w2=0.2