电机控制杂谈——“双采样双更新模式”对模型预测控制/PI控制的提升有多大?

1.采样频率与PWM开关频率的关系

一般有以下两种采样模式。

如下图(a)所示,这种方式称之为单采单更模式,即在一个PWM周期内,采样一次,更新一次PWM占空比,在这种情况下,采样频率=PWM开关频率(这也是最最最最常用的模式)。

如下图(b)所示,这种方式称之为双采双更模式,即在一个PWM周期内,采样两次,更新两次PWM占空比,在这种情况下,采样频率=2*PWM开关频率。

单采单更模式
双采双更模式

2.为什么要有双采双更模式?

一般而言,PMSM+FOC算法,在DSP28377(控制频率200Mhz)中执行,程序执行包括:转子位置采样,转速计算,电流采样,参考电压计算以及PWM生成,大概需要25us作用。这个程序计算时间与个人代码量有关。如果是采用比较复杂的控制算法,可能会使得程序运算时间超过50us,50us就是对应20kHz,所以这时候就没办法采用20kHz的控制频率

不过,个人看来,现在大部分的实验平台,基本都是用10kHz的开关器件。如果采用“单采单更模式”,那么开关周期和控制周期都是100us。但是呢,大部分算法都不需要用到100us。比如下面我截取了华科的两篇论文,里面涉及了他们提出的算法的运行时间。

可以看到呢。这两篇论文里面涉及的算法运行时间远不及100us,甚至也没达到50us。那么这样的话,其实DSP还有很多的空闲时间。

 

那我现在的想法就是,把DSP的空闲时间给运用起来,提高系统的控制性能。

那怎样提高控制性能呢?往期以及讲了很多的软件算法(扩展状态观测器。。。)。今天就想从硬件的方面(充分利用硬件资源)去提升控制性能。

那我可以试试这个“双采双更”的模式。

前段时间在b站回复别人消息。还被别人说我讲到的这个“双采双更”的模式是没有意义的。

这肯定是有意义的啊。双采双更能够使得我在开关频率不变的情况下提高控制精度,那控制效果肯定是更好的。

下面这是某篇TPE中使用到的双采双更模型波形图。

实现双采双更的理论依据应该是什么?

我个人认为有以下两点:

  1. DSP执行一次控制算法的时间,达不到一个控制周期的一半。
  2. 电机控制中涉及的SVPWM算法,实际上是在一个开关周期内完成了两次相同的调制。

如下图所示,由于SVPWM是左右对称的,实际上在左半周,已经完成了所需的电压调制。右半轴接着又完成了一次完全相同的电压调制。理论上左右两边产生的电压大小都是一致的。

既然经过半个周期就能完成我想要的调制了,那我干嘛不根据实际电流情况来实时调整下半周期所需的电压呢?

下面我们就来仿真验证一下双采双更的益处吧。

 

单采单更模型对应的开关管驱动信号、三角载波、开关切换时间波形

 

双采双更模型对应的开关管驱动信号、三角载波、开关切换时间波形

3.双采双更-DPCC模型的仿真验证

我下面是以无差拍预测电流控制(DPCC)来验证“双采双更模式”的有效性。

仿真参数如下表所示:

 

 Simulink仿真图:

 仿真工况:初始给定参考转速为1200RPM,0.2突加10Nm负载,0.35s减速至1000RPM。

3.1 电感失配两倍情况下的仿真对比

 

单采单更模式,控制器电感为实际电感的两倍时,三相电流、转矩、转速波形
双采双更模式,控制器电感为实际电感的两倍时,三相电流、转矩、转速波形
单采单更模式,控制器电感为实际电感的两倍时,d-q电流波形
双采双更模式,控制器电感为实际电感的两倍时,d-q电流波形
单采单更模式,控制器电感为实际电感的两倍时,相电流FFT分析
双采双更模式,控制器电感为实际电感的两倍时,相电流FFT分析

从上述仿真波形来看:

(1)采用“双采双更模式”的DPCC在电感失配两倍的情况下,电流脉动要明显小于采用“单采双单更模式”的DPCC的电流脉动。

(2)在d-q电流方面,可以看到,采用“单采双单更模式”的DPCC的d轴电流脉动超过了±1A;采用“双采双更模式”的DPCC的d轴电流脉动大概都在±0.5A以内。

(3)电流THD方面,可以看到,采用“单采双单更模式”的DPCC的相电流THD为4.24%;采用“双采双更模式”的DPCC的相电流THD仅为2.99%。

3.2 磁链失配2.5倍情况下的仿真对比

 

单采单更模式,控制器磁链为实际磁链的2.5倍时,三相电流、转矩、转速波形
双采双更模式,控制器磁链为实际磁链的2.5倍时,三相电流、转矩、转速波形
单采单更模式,控制器磁链为实际磁链的2.5倍时,d-q电流波形
双采双更模式,控制器磁链为实际磁链的2.5倍时,d-q电流波形

从上述仿真波形来看:

采用“双采双更模式”的DPCC在磁链失配2.5倍的情况下,电流的稳态误差要明显小于采用“单采双单更模式”的DPCC的电流的稳态误差。

 

4.双采双更-PI模型的仿真验证

Simulink仿真图:

 

 

注意:我的PI都采用“带宽配置法”,也就是电流环比例增益Kp=2*pi*fc*Ls,积分增益Kp=2*pi*fc*Rs。fc为带宽频率,单位是Hz

4.1 500Hz电流环带宽情况下的仿真对比

 

单采单更模式,三相电流、转矩、转速波形
双采双更模式,三相电流、转矩、转速波形

从上述仿真波形来看:

在电流环带宽设置为500Hz的时候,对于采用PI调节器的电流而言,双采双更模式和单采单更模型并没有明显区别

4.2 2000Hz电流环带宽情况下的仿真对比

单采单更模式,三相电流、转矩、转速波形
双采双更模式,三相电流、转矩、转速波形
单采单更模式,d-q电流波形(启动阶段)
双采双更模式,d-q电流波形(启动阶段)

从上述仿真波形来看:

在电流环带宽设置为2000Hz的时候,对于采用PI调节器的电流而言,双采双更模式和单采单更模式的q轴电流响应速度都差不多,电机启动时的q轴电流基本都是在0.00125s到达给定值;但是在达到参考电流之后,单采单更模式下的d-q电流都开始出现上下波动,而双采双更模式下的d-q电流仍能保持非常好的稳定性

5 仿真对比总结

5.1结论

从上述仿真波形来看,可以得到以下结论:

(1)对于无差拍预测控制的电流环而言,无论在电感失配还是磁链失配的情况下,采用“双采双更模式”的DPCC明显具有更好的控制效果或者说采用“双采双更模式”的DPCC明显具有更好的参数鲁棒性。(这里为什么不讨论电阻失配,因为电阻失配的影响其实比较小)

(2)对于PI调节器控制的电流环而言,采用“双采双更模式”可以使系统在高带宽的情况下,拥有更好的稳定性(或者说,采用“双采双更模式”可以使在保证稳定性的情况下,拥有更高的电流环带宽,从而具有更快的电流动态响应能力)

 

5.2解释

这里解释一下为什么会有这两个结论。

(1)为什么双采双更模式能提高DPCC的参数鲁棒性?

假设电流误差是随时间线性变化的。

现在控制器参数与实际电机的参数不匹配,在参数失配且控制器周期为100us时(单采单更),预测的电流与实际电流的误差是2A。

那我现在在同样的参数失配情况下,采用双采双更模式,此时的控制器周期变为50us,那么预测的电流与实际电流的误差就会变成1A。

这样一来,我预测电流误差缩小了,预测控制的鲁棒性也就相当于通过硬件得到了提高。

(2)对于PI调节器控制的电流环而言,为什么采用“双采双更模式”可以使系统在高带宽的情况下,拥有更好的稳定性

我这里举一个例子,现在有一辆大货车以100km/h的速度驶向十字路口,大货车距离达到路口的时间为1s,且大货车司机观察路况的时间间隔为1s。(单采单更模式)

现在,大货车的时速是100km/h,经过1s之后,大货车司机开始观察路况,发现此时已经达到路口了,即使现在减速,也来不及了,很容易发生事故。

那假如司机观察路况的时间间隔为0.5s呢?(双采双更模式)

现在,大货车的时速是100km/h,经过0.5s之后,大货车司机开始观察路况,发现此时已经离路口很近,但是也还没到达路口,司机开始减速。那么大货车再经过>0.5s后达到路口,此时的车速<100km/h,发生事故的可能性也就会相对低一些。

5.3注意事项

上面我说采用双采双更模式是尽可能利用了数字控制芯片的资源。但其实还要考虑硬件问题。比如说你的电流传感器的采集频率是否可达20kHz;再或者是你采集电流的方式能否使用“双采双更”(如下图)?

 

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于Java对GPIB接口控制,可以使用NI-VISA库来进行控制。NI-VISA(National Instruments Virtual Instrument Software Architecture)是一种通用的VISA编程接口,可以用来控制各种类型的仪器和设备,包括GPIB、USB、以太网、串口等等。 以下是一个使用NI-VISA库来进行GPIB通信的Java示例代码: ```java import java.util.concurrent.TimeUnit; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import visa32.*; public class GPIBControl { private static final int GPIB_ADDRESS = 4; // GPIB地址 private static final int BUFFER_SIZE = 1024; // 缓冲区大小 public static void main(String[] args) { // 初始化NI-VISA库 VisaLibrary visaLibrary = (VisaLibrary) Native.loadLibrary("visa32", VisaLibrary.class); visaLibrary.viOpenDefaultRM(); // 打开GPIB设备 String deviceName = "GPIB0::" + GPIB_ADDRESS + "::INSTR"; Pointer instrument = new Memory(GpibLibrary.ViUInt32.SIZE); visaLibrary.viOpen(visaLibrary.getResourceManager(), deviceName, new GpibLibrary.ViAccessMode(GpibLibrary.VI_NO_LOCK), new GpibLibrary.ViUInt32(0), instrument); Pointer session = instrument.getPointer(0); // 设置超时时间 visaLibrary.viSetAttribute(new GpibLibrary.ViSession(session), new GpibLibrary.ViAttrState(GpibLibrary.VI_TMO_VALUE), new GpibLibrary.ViUInt32(5000)); // 写入命令 String command = "*IDN?"; visaLibrary.viWrite(new GpibLibrary.ViSession(session), command.getBytes(), new GpibLibrary.ViUInt32(command.length()), new IntByReference()); // 读取响应 byte[] buffer = new byte[BUFFER_SIZE]; visaLibrary.viRead(new GpibLibrary.ViSession(session), buffer, new GpibLibrary.ViUInt32(BUFFER_SIZE), new IntByReference()); String response = new String(buffer).trim(); System.out.println("Instrument response: " + response); // 关闭设备 visaLibrary.viClose(new GpibLibrary.ViSession(session)); visaLibrary.viClose(visaLibrary.getResourceManager()); } } ``` 在这个示例中,我们使用NI-VISA库来打开GPIB设备,设置超时时间,写入命令并读取响应。需要注意的是,GPIB_ADDRESS变量需要设置为实际的GPIB地址,BUFFER_SIZE变量可以根据需要进行调整。 希望这个示例代码能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烦恼归林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值