Pid算法在闭环dc-dc中的应用

时间:2019.10.25
至此,已经初步完成闭环pid算法应用的仿真。以下对本次工作作关键性笔记记录。

PART1:项目简述
第一, 项目内容与试验目的。
项目内容:搭建硬件BUCK平台(开环,平台上包括栅极驱动电路),使用fpga完成数据采集和数据处理,设计一个fpga数控电源。本次设计,采用的adc型号为ad9200。

试验目的:
1】 在fpga开发平台上成功运行pid算法;
2】 熟悉数字设计中的小数处理方式;
3】 利用fpga平台完成闭环信号处理;

PART2:方案设计
这是一个闭环数模混合系统,fpga主要实现数据获取和处理,并输出控制pwm波,容易得到系统的控制框图如下:
Pid算法在闭环dc-dc中的应用_第1张图片

其中,灰色方框为在fpga中处理。整个控制框图很清晰,输入目标输出电压,通过取样输出值并反馈,两者的误差值进行pid处理得到控制量输出,最后送给执行环节生成,目标pwm波,当系统由于干扰失稳时,由于闭环控制,又会快速将系统拉回预定轨道运行。

那么,要实现上述系统,使用数字设计,需要的主要模块包括:pid模块、adc驱动模块、pwm发生器模块。除此之外,整个系统加入了加法器、乘法器以及打拍器模块。

NOTE:具体每个子模块的设计这本文中不做具体讲解,会放在其他博文中单独介绍。

再介绍之前,先给出系统综合处的RTL试图如下:

Pid算法在闭环dc-dc中的应用_第2张图片
本系统涉及到信号处理,罗列出系统中相关的数据关系:
Pid算法在闭环dc-dc中的应用_第3张图片

其中,R1=1.1K,R2=9.1K,VIN=16V为输入电压,Duty表示占空比,Vfb为分压电阻中点电压,Vadc为adc模块采集的电压值(因为使用的adc模块前端添置了相关信号处理电路,限定了adc模块的采集范围在0-2V,其输出数据位宽为8bit)。由此可见,整个系统的运算关系并不复杂,但注意到,上述数据中包含小数,所以说整个系统就是浮点数(小数)系统,那么自然要涉及到小数处理方式。其次,因为包含pid运算,所以又是有符号数系统。即本系统是一个有符号小数闭环系统。

由上述RTL试图知,先由ADC模块获取到输出电压值,但这其中需要作电压转换(式1可知),得到实际电压值后,送入pid模块进行运算,进而得到控制量输出,本设计将控制量直接作为映射到duty上,即利用duty=duty0+ctrl_out,duty0是上一周期的占空比,经过一次pid运算后,叠加上ctrl_out得到新的占空比,再利用duty0=duty如此迭代,知道整个系统稳定。

谈小数处理,之前的一篇博文中已经做了简单介绍,这里采用的是Q12定点数表示法,则实际数据和建模中的数据,就是一个2^12(4096倍)的关系。建模中使用的加法器和乘法器模块,均是配套有符号数操作。
有关加法器和乘法器,会在相关博文中介绍。这里不做过多介绍。
再谈pid参数整定,这里查阅了相关文章,具体可参见如下博客:https://blog.csdn.net/zyboy2000/article/details/9418257/

本次设计工作在modelsim下作了仿真,最终系统的仿真波形如下:
Pid算法在闭环dc-dc中的应用_第4张图片

从中可以看到,adc_reg为采集到的电压值(即上文中说的Vadc),具体地,本次设计中使用的adc模块,当输入为0时,adc采集到电压为1V,所以实际中,当输出Vout=5V时,转换到adc采集到的电压值约为1.107843V,转换为8bit数据为141。上述仿真为目标输入为8192(2*4096,即目标电压2V),经过上述系统之后,adc采集到的电压约为134,因为Vout每变化1V,映射到adc采集的电压值,就变化128*(1.1/51)=2.76,则输出Vout=2V时,仿真结果6与实际2.76*2=5.52相近。此外,由adc_reg的波形可知,曲线的变化趋势符合pid调节规律,最终稳定下来能够反映实际BUCK电路的输出情况。

附:本设计的主要目的在于pid算法的应用以及有符号小数的数据处理方式,这在信号处理中是十分重要,接下来,会将本设计的代码下载到fpga开发板中进行实际验证。

你可能感兴趣的:(FPGA设计开发,数字电路设计)