在之前的两篇文章中,我介绍了Boost和Buck电路数字控制环路的实现。初步实现了数字电源的基本PWM调节功能,但是也存在一些问题,有以下几点:
1)不能实现BUCK和BOOST电路的同时工作,本文将以两电路同时工作为目标,对软件进行改进。
2)在轻载或空载时,无法稳压,导致输出电压无法稳定。这需要在电流采样电路中加入一个上拉电阻,确保轻载或空载时,PWM脉宽能降为0。
3)将BOOST输出电压的采样通道由AN5移到AN1,因为AN1是独立的ADC内核,而AN5是共享ADC内核,所以AN1采样速度比AN5要快一些。
4)写入程序后,不能更改两电路的输出电压。在程序中增加串口通讯的功能,通过串口改变输出电压。
原理图和软件,会在文中附件中提供下载。
1.如何让两电路同时工作?
在前面的文中提到,控制环路的算法是在ADC采样中断中进行运算的,如果两电路同时工作,ADC采样中断就有可能发生冲突(也许冲突导致其中一个中断产生的延时并不会使环路不稳,但是笔者还没测试过)。为了解决ADC采样中断冲突的问题,可以把采样频率降低,即不在是每个PWM周期都采样,而是每两个PWM周期采样一次,同时错开两个电路的采样时间(在PWM的配置中可以设),就能实现同时工作且ADC采样不会产生冲突。具体设置如下:
在MCC中,点击PWM设置。
因为两个电路是PWM要同时工作,PWM时基就设为“主时基”,占空比设为“主占空比”
“Master Duty Cycle”为“主占空比”,“Period”为“主时基”。这里是将buck和boost的PWM频率都设为100KHz,占空比最大为50%。
设置PWM1
这里将“Duty Cycle Mode”和“Independent Time Base Mode”都选择“Master”。
请注意,在“Trigger Control”中,如下设置:
“Output Divider”中选择“2”,表示每两个PWM周期触发一次ADC采样,“Postscale Start Enable”中的“0”,表示从dsp上电后的第一个PWM开始计算ADC采样周期。
PWM2设置:
这里“Postscaler Start Enable”选择“1”,表示从dsp上电后第二个PWM周期开始计算ADC采样时间,这样PWM1和PWM2的ADC采样时间就错开了一个PWM周期,不会产生冲突。
然后进行ADC设置:(触发源应为PWM1 Primary和PWM2 Primary)
配置内部比较器1、2
当完成mcc设置后,将PI控制环路的差分方程写入程序中。
编绎后,烧录代码,两个电路能正常稳定工作。输入电压为15V,输出电压buck电路为4.26V,boost电路为19.95V。至于ADC采样频率降低后,对整体控制环路有什么影响?有时间会在以后的文章中讲述。
2.在上一版电路中,存在一个bug,电路空载时,两电路输出电压都会不受抑制的增高,这非常危险。导致这个现象发生的主要原因是:内部比较器在采样电流信号为零时,并不会使PWM输出0占空比,即使DAC的输出为0!这就导致PWM永远达不到0占空比!解决的方法很简单,用电阻上拉电流的采样,使DAC输出为0时,PWM能达到0占空比。
3.AN5通道的ADC采样,改到了AN3通道了。
4.增加了串口通讯功能
为了能通过通讯的方式调整输出电压,并且了解电源内部的工作状态,有必要增加串口通讯功能。串口通讯要求按照收到的电压值输出电压,并定时发送某些状态位。需要两个外设:UART和Timer。用32位Timer2,回调函数的执行周期为1秒。
Timer定时器中断和UART中断全部打开。设置完成后,生成代码。
定时器的代码相对简单,只需要在定时器2的回调函数中写入发送函数(UART1_Write())或接收函数(UART1_Read())即可。
如果要读取接收的数据,就用UART1_Read()函数。请注意,由mcc自动生成的UART代码,内部定义了一个缓冲区,缓冲区的大小可以自定义,比如缓冲区定义了8个字节。如果上位机一次发送了8个字节,那么就要用UART1_Read()函数一次性接收这8个字节(for循环8次UART1_Read()函数),再处理接收的数据。当dsp接收了8个字节后,缓冲区会满,不及时读出数据,将会丢失后面接收到的数据。这就要求读缓冲区数据的频率要高于UART接收并写满缓冲区的频率。如果发了8个字节,只用UART1_Read()函数接收了7个字节,则下一次再用UART1_Read()函数则会继续接收缓冲区的第8个字节。
UART的代码相对复杂,但是对于使用者来说只需要用UART1_Read()函数和UART1_Write()函数即可。不必关心内部的缓冲机制。
总结:
1)一颗芯片可以控制两个不同的电路的控制环路,增大了使用的灵活性。
2)增加了通讯功能,在此基础上,还可以把dsp内部状态通过通讯发送出来。