最近在用TI的TMS320F28035芯片做一款数字电源,为了进一步了解这颗芯片的功能,笔者设计了一个数字电源实验板,用28035作为PWM控制芯片,来更好的学习。本节用到的程序代码在附件中提供下载。
对于电源工程师来说,TI的28035芯片比较适合做数字开关电源,它有下面的几个优点:
1)成本比较低,便宜。
2)有6对(共12路)功能完善的PWM,可以组合成多种生成PWM波的方式,并有多种的触发ADC的模式,还带有一个Trip-Zone子模块快速触发PWM的动作。
3)快速的ADC采样,并有多种触发方式。
4)3个模拟比较器能直接关闭PWM(适合峰值电流型控制)。
5)60MHz工作频率的定点内核C28x,还有一个相同工作频率的浮点型协处理器——控制律加速器(CLA)。
6)带斜率补偿功能和10位的DAC。
与2833x相比,适用于开关电源的外设更多,但是工作频率不如2833x高。另外,28035内核是定点型的。CLA就是为了弥补定点内核算力的不足,而专门增加的。
笔者设计的28035数字电源实验板,主要包含两个开关电源电路:同步buck和boost。如下图:
其实这个数字电源电路在笔者以前的系列文章《通向数字电源之路——初学者入门》中也用到过。这次就是把原来的microchip的dspic33ep128gs806芯片换成了28035。
首先,要安装CCS(TI的dsp的集成编译环境)。没必要装太新的版本,笔者安装的是CCS7.4。安装完后,一定要下载安装controlSUITE,里面有要用到的程序框架和大量的代码示例。
对比之前用的MicroChip的集成开发环境MPLAB X IDE,现在用的TI的CCS并不能通过可视化的代码配置器来自动生成代码。但是TI提供了一系列内容丰富的库和程序框架,来帮助程序员编写代码,这些库和程序框架大部分在controlSUITE中,在这里,可以应用一个数字电源程序框架的工程模板,在该模板中,根据需要添加或修改代码。
打开之前安装好的CCS ,然后将工程模板导入。
单击Finish,完成工程导入后的CCS会生成一个工程文件夹,文件夹的结构如图:
其中包含两种类型的文件,带有箭头的链接文件和不带箭头的本地文件,所有代码的修改或添加都是在本地文件中进行的,一定不要随意修改链接文件,因为其它工程需要导入该模板时,还会用到这些链接文件,如果修改了,在其它工程中有可能报错。
该工程模板实现了PWM1A和PWM2A的占空比可调的方波输出。其中PWM1是通过CLA来实现,PWM2是通过定点内核的中断实现,同时,还有一路的ADC采样。下面就以buck电路为例,看看如何实现数字电源的基本功能。
首先,介绍一下buck电路的基本参数:
输入电压:12V-30VDC
输出电压:5V-10VDC
输出电流:0-2A
开关频率:100KHz
控制环路应用buck电路最常用的峰值电流型。
用到的芯片资源:
ADCINA3:输入电压采样
ADCINB4:输出电压采样
Comp3A:buck峰值电流比较器正向输入端
PWM1A:buck主MOS管驱动
PWM1B:buck同步MOS管驱动
开始分步骤进行代码的编写:
1)PWM1的配置
因为PWM1A和PWM1B的输出引脚是复用的GPIO引脚,这就要求先定义功能。双击打开‘ProjectName-DevInit_F2803x.c’文件。找到下面的代码:
改为:
注释掉一行代码的快捷键为Ctrl+/。
接下来,要导入一个文件到工程文件夹中。依次如图操作:
可以看到,在工程文件夹中,已经出现该文件了。
双击刚才导入的文件,可以看到里面的代码都是ePWM相关的寄存器的配置,该文件中包含两个函数PWM_ComplPairDB_CNF()和PWM_ComplPairDB_UpdateDB()。因为这两个函数需要在ProjectName-Main.c中调用,所以需要在ProjectName-Main.c中先声明。
下面要用PWM_ComplPairDB_CNF()这个函数初始化PWM1。注意应该注释掉模板自带的PWM1的配置函数PWM_1ch_CNF(),否则会产生冲突。
因为工程模板原来的PWM1就是用CLA内核产生PWM波的,所以有关的CLA设置不变。CLA是独立于28035内核的并行协处理器,它主要的作用是进行浮点数学运算,减轻内核CPU的运算开销,减少环路控制算法运算时间,降低控制环路延时,增大系统的相位裕度。它有自己独立的程序和数据空间,有独立的数据和地址总线,能够读取ADC、ePWM和Comp相关的寄存器,配置起来比较复杂,好在工程模板已经替我们完成了这项工作,我们只需要修改个别的寄存器就行。另外就是CLA程序的代码以前只支持汇编,现在也完全支持C语言了,模板就是以C语言编写的,后缀.cla的程序文件就是CLA的C代码写成的。
双击“ProjectName-CLA_Shared.h”,在该头文件中可以看到包含了“DPlib.h”
然后按住Ctrl键,单击鼠标左键,点击“DPlib.h”,就会打开“DPlib.h”,因为编译时要用到‘PWMDRV_CLA_C.h’头文件,所以应该在DPlib.h中去掉注释,但是“DPlib.h”不是工程的本地文件,不能改动,所以要在ProjectName-CLA_Shared.h中将其包含进来。
因为PWM1A和1B是互补的且不能直通,所以要设置一定的死区。可以把死区的设置函数放在初始化函数中。
设置工程的仿真器和编译器的版本。
在调试的阶段,一般是将代码放在RAM中运行。
最后编译工程,全部通过。将代码写入RAM运行,波形如下:
因为mos管的驱动芯片IR2181s驱动下降速度较慢,所以留有较大的死区。该PMW波形的占空比是通过CLA_Duty1变量来设置的,此处占空比设为0.4。
由于互补死区的存在,实际波形的占空比小于0.4。
2)模拟比较器的配置
28035芯片内部集成了3个模拟比较器(Comp),可以用来做峰值电流比较器。在该模拟比较器中还提供了DAC和斜率补偿的功能。下面看看如何配置:
首先将Comp的配置文件导入工程,导入的文件名和路径如下:
也是要以本地文件的形式导入工程中。在ProjectName-Main.c中声明DAC_CNF.c定义的函数。
在“ProjectName-DevInit_F2803x.c”中使能Comp3的时钟。
然后用DacDrvCnf()函数初始化Comp3。
先禁止斜率补偿器的工作,调试Comp3和DAC是否正常。
Comp3的输出做为ePWM1的控制信号,在峰值电流超过DAC的设定值时,要关断PWM1A的输出(即主MOS管的驱动),因此还要重新配置ePWM1。主要就是配置ePWM1的Trip-Zone(TZ)子模块中的寄存器。
写入TZ动作逻辑的代码:
TZ配置的420和421行表明,当Comp3输出高电平时PWM1A输出低电平,而PWM1B的输出状态不变。415行的代码表明,Comp3的高电平会产生PWM1A关断信号,并在下个PWM周期开始时,自动清除该PWM1A的关断信号,即逐周期限流。
因为主mos管开通的瞬间,会在电感电流中产生一个尖刺,如果不处理,将会导致PWMA误关断,所以还需要用到TZ的前沿消隐功能。
为了能清楚的观察Comp3的输出情况,需要将Comp3的out脚使能
现在可以在开环状态下进行电流内环的调试。在前面代码中,设置了一个固定的DAC值300,DAC是10位的,所以换算成电流峰值的限流值为:
实测波形如下:
从波形来看模拟比较器在电流采样波形达到1V时翻转,比较器工作正常,DAC工作正常。但是由于主mos管的驱动芯片IR2181s本身的关断延时,导致电感电流继续上升。从下图中,可以看到由于前沿消隐的作用,比较器能正确的关断PWM1A。同时也能看到主mos管的开通也存在明显的延时现象。
下面将斜率补偿加入,先包含斜率补偿用到的头文件。
修改Comp3初始化配置。
添加斜率补偿调用函数
编译通过,斜率补偿也能正常工作了。
在下一篇中,将进行电压闭环的代码实现。