2023年国赛电源组项目
TI C2000系列 DSP28379
只要符合思路中所述的标准,并且芯片运算速度足够(能够在一个采样周期内完成所有所需计算),那么无所谓用什么芯片。本项目中的代码修改后可以迁移到其他平台。
在本项目中,我将DSP28379的系统时钟频率从默认的200MHz降到了100MHz(节省功耗),PWM模块的频率为100MHz(需要设置从系统时钟频率到PWM模块频率的分频为1/1)。
见Simulink文件
先用Simulink搭仿真,然后照着仿真模型的控制部分进行编写。 基本思路:
- 对现实系统的状态变量(电压,电流等)进行ADC采样
- 基于采样结果进行控制相关的计算(所有计算都必须在下一次采样之前全部完成)
- 根据计算结果,通过PWM模块输出到现实系统
- 跳转到第1步
ADC与PWM的配置:
- PWM的载波设置为三角波(UPDOWN),载波周期为50us(20kHz),同一对PWM输出互补,两对PWM之间为单极性调制。
- 每到PWM的载波峰值时,触发ADC(SOC),接着ADC触发中断。这样,ADC的采样周期、单个开关管的开关周期和其中断函数的执行周期与PWM一致,都为Ts=50us,Ts是各个控制算法所必须的关键。Ts在代码中可调,在硬件允许的情况下尽量小。
- ADC的中断服务函数便是整个控制的关键了,一切控制相关的计算都放在这里进行。
关键在于PI控制器、PR控制器、SOGI以及PLL等算法如何实现:
- PI控制器:不说了,这个很简单,值得一提的是积分方式有两种可选,一是矩形积分,二是梯形积分。我选的是矩形积分,这其实完全够了。
- PR控制器:关键的传递函数G(s)不好拆分,我采取的方案是直接用MATLAB的c2d函数将连续形式G(s)暴力转成G(z),离散化方法用Tustin(双线性变换法)。当然也可以根据G(s)手算精确的G(z),参见自控原理的离散部分。
- SOGI:属于PLL的一部分。根据Simulink搭的模型写就行。
- PLL:这算是交流电题目都需要涉及到的关键,不仅需要根据Simulink搭的模型,还需要考虑到离散系统的特点。如果只是严格按照模型搭,会发现实际运行出来的结果居然超前所需跟踪的波两个采样周期Ts(在最终版本,采样周期为50us)。我就用了个“笨办法”(延迟队列)将SOGI的输出强行延迟了两个采样周期,这样最后输出的时候刚好抵消。后来发现超前问题其实是正常现象,也是符合理论和逻辑的(采样与PLL的输出之间有延迟),就连MATLAB自带的单相锁相环(虽然实现方式并不同)也用了同样的办法来解决这个问题。
- 以上所有涉及积分器的部分,都一定要注意积分初值和积分上限。这在实际运行中非常关键。
采用DSP28379中的XBar模块进行外部中断的输入(按键)。 OLED屏用两个GPIO实现IIC通信。用OLED卖家提供的代码稍加修改即可使用。
多读芯片的英文数据手册,多和硬件交流。