全国大学生电子设计竞赛(二)--电源常用技术与算法

2.1 有效值检波技术

2.1.1 均值检波技术

  在工业中,我们常用的检波技术主要由三种:均值检波技术、峰值检波技术以及均方根值检波技术。其中,均值检波法主要应用于交直流转换电路中,其主要实现方法是将交流信号进行半波或者全波整流,再对整流输出的脉动直流信号进行积分得到较为平缓的直流信号,最后再根据被测信号的半波整流平均值或全波整流平均值与有效值的关系即可计算出被测信号的有效值。图2.1为均值检波的典型电路图:
图2.1  均值检波电路

  图2.1为用于电流的交直流转换电路,图中二极管D1和D2构成半波整流电路,二极管D2用于保持被测回路电流的连续性,并非转换电路本身需要。当用于测量电压信号时,二极管D2可以省略。当输入处于正半周时,二极管D1导通,向电容C充电,微安表得到的是经电容平滑滤波之后的直流电,当输入处于负半周时,电流从D2流过,二极管D1截止,电容电荷通过微安表内阻放电,电容电压下降。
图2.2  均值检波电路电容两端电压波形

  电容两端的电压波形如图2.2所示,流过微安表的电流波形与图2.2电压波形相同,可见,只要输入交流电流幅值不变,流过电流表的波形非常接近一条直线。充放电电路的时间常数越大或信号频率越高,输出波形越接近直线。充放电电路的时间常数越大,当输入电流幅值发生变化时,输出响应越慢。因此,均值检波电路较适合于幅值相对稳定或变化缓慢,而频率较高的交流电测量。

  而峰值检波则是对交流信号进行半波或者全波整流,再用充电电容保持整流输出的脉动直流信号的峰值,得到较为平缓的直流信号。
图2.3  电压半波整流的均值检波电路
  均值检波电路通常采用电容充放电电路作为平均值电路,由于输出为整流平均值,要求电容充放电时间常数相等。由图2.1可知,电容充放电时间常数取决于微安表内阻,充电时,微安表内阻越大,电容越大,流过微安表的电流越小,电容充电电流越大,充电越快;放电时,微安表内阻越大,电容越大,放电越慢。为了使充放电速度相同,因此,只有在微安表内阻与电容符合特定关系时,才能使充放电速度相同。

  对于数字采样的仪表,图中微安表可用取样电阻替代。并且一般会先将电流信号转变为电压信号再作转换,电压半波整流的均值检波电路如图2.3所示。
  但是,上图存在一些问题:
  ① 由于二极管存在压降,当测量电压较小时,二极管压降带来的影响不能忽略。
  ② 这是电阻电容串联电路,并不是严格的平均电路。
  因此,图2.3电路不能实现严格的整流平均值,我们可以通过将变容二极管半波整流电路采用基于精密整流的绝对值电路替代来解决第一个问题,图2.4为实用的均值检波电路,图中只要去除C1,就是全波精密整流电路,本电路在A2构成反相加法器上增加积分电容,将其变为反相加法及积分电路。图中R3=2R4。
图2.4  实用的均值检波电路

2.1.2 峰值检波技术

  峰值检波法构建的交直流转换电路对交流信号进行半波或全波整流,再用充电电容保持整流输出的脉动直流信号的峰值,得到较平缓的直流信号,直流信号的幅值就是被测交流信号的峰值,再利用被测信号的峰值与有效值的关系即可计算出被测信号的有效值。与均值检波技术不同的是,它利用的是被测信号的峰值而不是均值来计算有效值。
  峰值因数是指信号的峰值与有效值的比值。因此,峰值检波法交直流转换电路得到的测量结果需要除以峰值因数才是被测信号的有效值。
图2.5  峰值检波的最简电路模型
  有趣的是,峰值检波的最简电路模型可以采用和交流电压检波电路一样的模型,如图2.5所示:
  但是实际上,峰值检波和均值检波还是有很多差别的,它们的最大差别在于:
  ① 峰值检波电路要求充电时间足够短,用于窄脉冲测试的峰值检波电路,要求在很短的时间之内,电容可以快速充电至峰值。而放电时间相对长,否则,输出波形不够平滑。对于正负对称并且幅值相对稳定的交流电而言,只要放电速度远远低于充电速度,即使充电速度较慢,也能使输出非常接近于峰值。
  ② 均值检波电路要求充放电时间相等,否则,得到的不是整流平均值,均值检波电路适用于正负对称并且幅值相对稳定的交流电的测量。
  与均值检波类似,在被测电压较小时,需要消除二极管压降带来的误差,我们同样对电路进行改进,得到如图2.6所示电路:
图2.6  改进的峰值检波电路
  我是红色当Vi大于Vo时,A1输出正电源电压,变容二极管D1截止,D2导通,电容C迅速充电至Vi。
  我是红色当Vi小于Vo时,A1输出负电源电压,变容二极管D1导通,D2截止,电容C通过电阻Rc缓慢放电。

2.1.3 均方根值检波技术

  均方根值检波技术可以用硬件方法或者软件算法来实现,如果要用硬件实现的话,可以采用专用的真有效值转换芯片来实现。常用真有效值转换芯片有AD536、AD637、LTC1966、LTC1967、LTC1968等。其用法可以参考芯片的datasheet,这里不再赘述。我们来详细探讨下软件算法的实现。
  均方根值,顾名思义,就是在输入信号的整数周期内,对输入信号进行平方,相加平均再开方。我们采用均方根值算有效值的流程通常是先将输入信号转化为电压信号,再根据信号的频率选用高速AD对信号进行采样,最后,我们将采样值输入FPGA或者单片机中进行算法处理,得到信号的有效值。这里有两点要特别注意:
  ① 对于频率较高的信号,我们最好选用采样率足够高的AD和主频足够高的FPGA来进行处理,否则的话,算出来的有效值误差会非常大。
  ② 在采样时,最好是按照周期的整数倍来进行采样和数据处理,如果数据处理时不是按照整数个周期来处理的话,得到的值将会是一个跳动的数字。
流程图如下:
图2.7  均方根值检波法流程图
  接下来,我们以FPGA为例来详细介绍一下如何利用算法实现有效值的计算。
  首先,搭建一个DDS平台来产生周期性累加的时钟信号,具体代码如下所示:

module dds_add
(
 input clk,rst_n,
 input [31:0]data_rate_square,
 output reg[31:0]outdata_square
);
reg [31:0]add_rate_san;
reg [31:0]add_rate_sin;
reg [31:0]add_rate_square;
always @(posedge clk or negedge rst_n) 
 if(!rst_n)begin 
	 add_rate_square<=32'd0;
 end 
 else begin 
	 add_rate_square<=add_rate_square+data_rate_square; 
 end
always @(posedge clk or negedge rst_n)
 if(!rst_n)begin 
	 outdata_square<=32'd0;
end 
 else begin
	 outdata_square<=add_rate_square;
 end 
endmodule

  这个时钟产生模块实际就相当于一个分频器,对输入的时钟信号进行分频,其中data_rate_square是和输入信号频率有关的一个量,此模块的作用就是产生一个和输入信号周期整数倍同步的一个时钟信号,以保证每次进行数据累加处理时,单个周期内的数据量是一定的。
  接下来,我们用时钟信号驱动周期平方平均模块,模块内部具体实现如下:

module sample
(
  input clk,rst_n,
  input [13:0]data3,
  output reg [47:0] 
  add_data 
);
reg [13:0] rdata;
reg [47:0] radd_data;
reg [2:0] i;
reg [9:0] cnt;
always @(posedge clk or negedge rst_n) 
 if(!rst_n) begin 
	 add_data<=48'd0;
	 rdata<=14'd0; 
	 i<=3'd0; 
	 cnt<=10'd200;
 end 
 else  
 case(i) 
	 3'd0: begin  i<=i+1'd1;rdata<=data3; end
	 3'd1: begin  if(rdata[13]) rdata<=~rdata;i<=i+1'd1; end 
	 3'd2: begin if(cnt) begin radd_data<=radd_data+rdata*rdata;cnt<=cnt-1'd1;
           end i<=i+1'd1; 
           end 
     3'd3: begin i<=3'd0;if(!cnt) begin  add_data<=radd_data;cnt<=10'd200;
           radd_data<=48'd0 ;
           end 
           end 
 endcase 
 endmodule

  代码很明了,就是对输入的信号进行平方累加,这里不再多说。最后,我们将以上模块输出的累加值进行平均和开根号:

module EFFECT_Cal
    (
	input clk,rst_n,
	input [47:0]EV_IN,
	output [13:0]EV_OUT
    );
wire [47:0]AVE_EVIN = EV_IN/200;
wire [31:0]SQ_OUT;
sqrt sqrt_inst 
    (
    .radical ( AVE_EVIN ),
    .q ( SQ_OUT ),
    .remainder ( remainder_sig )
    );
assign EV_OUT = SQ_OUT;
endmodule

  模块最终输出就是要求的有效值,经实测,用TLC3578采样,每个周期采样两百个点进行运算,最终得到的有效值精度可以到小数点后第三位,满足绝大部分应用场景。
  综上所述,均值检波电路输出结果等于被测信号有效值除以波形因数,峰值检波电路输出结果等于被测信号有效值乘以峰值因数,均方根检波电路输出结果等于被测信号有效值。三种方法各有优劣,应根据实际场景来选择最合适的方案。

2.2 高精度采样技术

  采样对于电源设计来说,是极其重要的一部分,采样精度往往决定了整个系统最终输出的精度,性能以及稳定性,因此,我们在设计系统的采样部分时,应尽可能地高标准。要想实现高精度采样,有两点最重要,第一是AD的选择,第二则是采样电路以及滤波算法的选择。

2.2.1 AD的选择

  根据A/D转换器的转换原理可以把A/D转换器分为两大类:直接型A/D和间接型A/D。
  直接型A/D将输入的模拟电压通过比较直接转换为数字量。而间接型A/D转换器,模拟电压先被转换为一种中间变量(像时间、频率、脉冲等),然后再把中间量转换成数字量。
  直接型A/D中应用较为广泛的主要有逐次逼近式A/D转换器、流水线A/D转换器;间接型A/D转换器中应用较为广泛的主要有双积分A/D转换器和V/F变换A/D转换器。
  这节主要介绍一下A/D的性能指标以及应用。

2.2.1.1 A/D转换器的性能指标

  在选择A/D转换器的时候,要根据需要选择性能指标合适的A/D转换器,这就需要我们对A/D的性能指标有一定的了解。
  (1)分辨率
  分辨率表示输出数字量变化一个数字量,输入的模拟电压的变化量,转换器的分辨率定义为满刻度电压与2的n次方的比值,其中n代表A/D转换器位数。
  (2)转换速率
  转换速率是指A/D转换器完成一次数据转换所需要的时间。不同的A/D的转换时间是不一样的,根据实际需要转换速率合适的A/D。
  (3)量化误差
  量化误差是由于A/D转换器的有限分辨率而引起的误差。量化误差是指量化结果和被量化模拟量的差值,显然量化级数越多,量化的相对误差越小。分辨率高的A/D具有较小的量化误差。
  (4)非线性度
  非线性度是指转换器实际的转换曲线与理想转换曲线的偏移,也可以称为线性度。
  (5)偏移误差
  偏移误差是指输入信号为零时,输出信号不为零的值,也叫做零值误差。偏移误差通常是由A/D转换器内部的放大器或比较器输入的失调电压或电流引起的。在使用A/D转换器前,要先将偏移误差降到最低,有的A/D转换器有零点调节的功能。
  (6)输入电压范围
  A/D转换器一般都有规定的输入电压范围,使用过程中尽量不要超出范围,因为这样会造成对A/D的永久损坏。

2.2.1.2 A/D转换器的选择

  对于品种繁多、性能各异的A/D转换器,在设计数据采集系统时要按照一下几点要求进行选择。
  (1)A/D转换器的位数
  A/D转换器的位数的确定与整个测量控制系统所要测量控制的范围和精度有关。A/D转换器的位数至少要比总精度要求的最低分辨率高一位。虽然分辨率与转换精度是不同的概念,但是没有基本的分辨率就谈不上转换精度。但是,选的太高也没有实际意义,而且会增加系统的成本。
  (2)确定A/D转换器的转换速率
  A/D的转换速率从s级到ns级都有,实际应用中根据系统需要选择合适的转换速率。像积分型的A/D转换速率就比较慢,一般用于对温度、压力、流量等缓变参量的测量和控制。逐次比较型A/D转换器属于中速转换器,常用于单片机控制系统、音频采集等。FLASHA/D转换器属于高速转换器,适用于雷达、数字传输、瞬态记录等实时要求高的测量系统。
  (3)确定工作电压和基准电压
  早期设计的集成A/D转换器需要±15V的工作电源,现在的A/D转换器大多可以在5V~12V范围内工作。基准电压是A/D转换准确的保证,有的A/D带有内部基准比较方便,对于要外接基准的A/D转换器,一定要保证基准电压幅度稳定、准确。必要时使用基准电压芯片。
  (4)输入电压范围
  A/D转换器根据用途不一,输入电压范围各异,选择A/D前一定要注意输入电压的范围,超范围的电压输入可能会导致A/D转换器的永久损坏。

2.2.1.3 A/D转换器的使用注意事项

  A/D转换器的启动一般需要外部控制启动转换信号,一般由CPU提供。A/D转换器的启动转换信号一般分为两种:脉冲控制启动和电平控制启动。对于电平控制类A/D转换器,电平应在转换的全过程中保持不变,否则会中止转换。
  在正常使用中,A/D转换芯片可能会电流突然增大、突然发热,这是可控硅现象,是所有CMOS集成电路在使用中都可能发生的现象。出现这种情况以后,要切断电源,然后重新打开,又会回复正常工作。为防止这种现象发生可采取一下措施:
  (1)尽量避免较大电流干扰窜入电路;
  (2)加强电源稳压滤波措施,在A/D转换芯片的电源入口处加去耦电路。为防止窄脉冲窜入,应加一个高频滤波电容(0.01µF左右)
  (3)在A/D转换芯片的电源端串一个100~200Ω的限流电阻,可在出现可控硅现象时有效地限定电流,保护芯片。
  另外现在使用的A/D中一般都自带采样保持电路,不需要外面再外接采样保持电路。

2.2.2 采样电路的设计

  说完了AD的选择,我们就来聊聊采样电路的设计。在电源系统的设计中,AD的采样管脚直接采样的一般都是电压信号,如果需要采样电流信号,我们可以先将电流信号转化为电压信号之后再进行采样,而电压采样一般也分为两种:直流电压采样和交流电压采样,接下来我们来分别讨论这两种采样的电路设计。

2.2.2.1 直流电压采样

  最简单,最直接的采样方法:判断采样电压的峰值是否在AD的采样范围之内,如果信号范围和AD采样范围相吻合,滤波后直接送入AD采样口进行采样,这里滤波可以用简单的LC或者RC滤波。如果信号的范围超出了AD的采样范围,可以用电阻分压之后再将信号送入AD采样口进行采样。如果分压之后信号幅值太小,可以用运放将信号放大之后再送入AD采样口采样。典型的电路图如图2.8所示:
图2.8  直流电压采样电路

2.2.2.2 交流电压采样

  在我国,交流电的频率一般都是50Hz,对交流电压的采样,我们可以先用电压电流互感器将强交流信号转化为较弱的交流信号,以方便后级采样。这里对交流互感器的选择也是有讲究的,普通的线圈互感器只能互感交流信号,如果采样信号是交流加上直流偏置的话,直流信号会被直接过滤掉,从而破坏信号的完整性,为了同时采集直流信号和交流信号,我们可以采用霍尔交流互感器,它可以同时互感直流和交流信号,最大程度地保证信号的完整性。然后,我们可以利用高速AD,以周期为单位采集信号的瞬时值并保存在数组里,为之后求信号有效值值或者峰值做准备,这里以求信号有效值为例,我们可以用FPGA搭建一个DDS信号发生器或者买一个DDS发生器模块,使得DDS信号发生器的周期和交流信号的周期成整数倍关系,然后根据DDS信号的节拍去对采样信号进行均方根运算,最后将结果除以那个整数,即可求得较为精确的交流电压有效值。典型采样电路如图2.8所示:
图2.9  交流电压采样电路

2.3 SPWM波调制技术

  逆变电路的控制方式主要是采用SPWM(正弦脉宽调制技术),DUK-AL20控制开关管的通断来实现正弦调制,正弦脉宽调制技术(SPWM)的基本思路是将一个正弦波按等宽间距分成N等份,对于每一个波形以一个等面积的脉冲来对应,使脉冲的中点与相应正弦波部分的中点重合,如图2.10所示,由于此脉冲序列的面积分布满足正弦规率,根据面积等效原理,将这个脉冲序列输出至负载时,将使负载得到相当接近正弦的输出电压和电流。
图2.10  SPWM示意图

  由于采用该方式输出的电压波形很接近正弦波,所以电压中的谐波成分较少,同时也可以提高功率因数。通过改变SPWM脉冲的宽度可以改变输出电压的幅值,调节电路的调制周期则可以改变输出电压的频率,方便对负载进行控制。

2.3.1 单极性正弦脉宽调制

  单极性正弦脉宽调制是以一个宽度正弦规律变化的正弦脉冲序列对应交流输出波形的正半周,再以一个宽度按正弦规率变换的负脉冲序列对应交流输出波形的负半周,这两个脉冲序列交替作用,控制开关器件产生近似于正弦波的输出电压波形。
  正弦脉宽调制的基本方法是将正弦波性的调制波与三角波形的载波进行比较,通过比较正弦波形各点的瞬时值确定该点对应的脉冲宽度。单极性正弦脉宽调制使用的三角波是单极性的,在正弦调制波为正半周时三角载波是正极性的;在正弦波为负半周时三角波载波为负极性。如图2.12所示。
图2.11  单相桥式逆变电路
图2.11  单相桥式逆变电路

2.3.2 双极性正弦脉宽调制

  双极性正弦脉宽调制是以一个宽度按正弦规率变化的正负双向脉冲序列对应交流输出波形的整个周期,通过正向脉冲与负向脉冲宽度的差产生出按正弦规率变换的正半周波和负半周波。
  双极性正弦脉宽调制使用的三角波是双极性的,其波形的形式如图2.13,通过正弦调制波与三角波比较,当正弦调制波值大于三角波时,输出正脉冲;而当正弦调制波的值小于三角载波时,输出负脉冲。如此得到的脉冲序列是正负交替的双向脉冲序列。
图2.13  双极性正弦脉宽调制

2.3.3 三相正弦脉宽调制

  三相正弦脉宽调制可以使用三个相角彼此相差120°的单相调制电路来合成,但是这样会使调制电路结构比较复杂。较简单的方法是采用一个双极性的三角载波对三相正弦调制波进行调制,其调制的波形如图2.14。
  调制过程中,双极性三角载波为三个正弦调制波共用,分别进行比较后获取脉宽调制信号,方式与双极性正弦脉宽调制方法相同。从而得到三个双向的脉冲序列,分别对应A、B、C三相,使用此三个脉冲序列控制逆变电路的A、B、C三相开关元件,可以将直流电压逆变为正弦波的三相交流输出电压。
图2.14  三相正弦脉宽调制电路
图2.15  三相正弦脉宽调制信号的产生
  三相脉宽调制波的三角载波只能是双极性的,因为单极性三角载波需要根据正弦调制波的正、负半周更换载波的极性。采用双极性正弦脉宽调制,H桥上同一相的上、下两个桥臂导通与截止都是互补的,为防止上下两个桥臂直通而造成的短路,需要在给一个桥臂施加关断信号后延迟一段时间,从而在波形中引入了死区时间,死区将会给输出的SPWM波形带来高次谐波。

2.3.4 正弦脉宽调制(SPWM)控制信号的生成

  早期的SPWM采用模拟控制方式来实现,通过信号发生器产生所需的信号,由比较器进行信号之间的比较,随着数字技术和微处理器在SPWM逆变技术中的应用,采用一定算法产生SPWM的数字控制方式越来越广泛。

2.3.4.1 模拟控制方式

  波形比较法,其基本的方法是由正弦信号发生器件产生正弦调制波,由三角波信号发发生器产生的三角载波,将正弦调制波与三角载波比较,通过比较器的判断而产生出对应的脉冲信号序列,对逆变电路进行控制从而得到所需的交流电压。

2.3.4.2 数字控制方式

(1)等效面积法
  其原理就是按面积等效原理构成与正弦波等效的一系列等幅但宽度按正弦规律变化的矩形脉冲。等效面积法适用于单极性控制,算法中计算的是正弦波形到横轴间的面积,这与模拟控制方式中的单极性正弦脉冲调制的方式一致。
(2)自然采样法与规则采样法
  自然采样法在算法上仿真模拟控制方式的双极性正弦脉冲调制,通过计算正弦调制波与三角载波的交点位置,确定调制的脉冲宽度。而规则采样法是对自然采样法的简化,其几何关系如图2.16。
图2.16
  规则采样法适用于双极性控制,因为算法中采用的三角载波是双极性。等效面积法和规则采样法都是数字控制的算法,可以由微处理器实时计算SPWM脉冲的宽度和位置,实现对逆变电路的控制,也可以事先计算好每个脉冲中心位置和脉冲宽度存入微处理器中,以查表的方式实现对逆变电路的控制。
  此外除了使用微处理器生成SPWM以外,目前还有专门产生SPWM波形的大规模集成芯片,有些微处理器也继承有SPWM波形发生器,如89XC196MC微处理器,其内部有三相互补SPWM波形发生器,可以直接输出6路SPWM波形信号。

2.4 PID算法

  在连续时间控制系统中,PID控制器应用非常广泛,其设计技术成熟,长期以来形成了典型的结构,参数整定方便,结构更改灵活。由于计算机程序的灵活性,数字PID控制比连续PID控制更为优越。

2.4.1 PID控制系统简介

  连续时间PID控制系统如图3-37所示,D(s)完成PID控制规律,称为PID控制器。PID控制器是一种线性控制器,用输出量y(t)和给定量r(t)之间的误差的时间函数e(t)=r(t)-y(t)的比例、积分和微分的线性组合构成控制量u(t),称为比例(Proportional)、积分(Integrating)、微分(Differentiation)控制,简称PID控制。
图2.17  连续时间PID控制系统
  PID控制组合了比例控制、积分控制和微分控制这三种基本控制规律,通过改变调节器参数来实现控制,其基本输入输出关系为:
在这里插入图片描述
  实际应用中,可以根据受控对象的特性和控制的性能要求,灵活采用比例(P)控制器、比例+积分(PI)控制器、比例+积分+微分(PID)控制器三种不同控制组合。

2.4.2 PID参数控制效果分析

  PID控制的三基本参数为KP、KI、KD,分别对应比例,积分,微分三个模,经实验测试,可总结出这三项参数的实际控制作用为:
  比例调节参数(KP):按比例反映系统的偏差,系统一旦出现偏差,比例调节立即进行。比例调节是主要的控制部分,但过大的比例会使系统的稳定性下降。增大KP,系统的反应变灵敏、速度加快、稳态误差减小,但振荡次数也会加多、调节时间加长。
  积分调节参数(KI):消除系统静态(稳态)误差 ,提高系统的控制精度。积分调节会使系统的稳定性下降,动态响应变慢,超调加大。积分控制一般不单独作用,而是与P或者PD结合作用。
  微分调节参数(KD):反映系统偏差信号的变化率,可以预见偏差的变化趋势,产生超前控制作用,使偏差在未形成前已被消除。因此,微分控制可以提高系统的动态跟踪性能,减小超调量,但对噪声干扰有放大作用,过强的微分调节会使系统剧烈震荡,对抗干扰不利。
  常规的PID控制系统中,减少超调和提高控制精度难以两全其美。主要是积分作用有缺陷造成的。如果减少积分作用,静差不易消除,有扰动时,消除误差速度变慢;而加强积分作用时又难以避免超调,这也是常规PID控制中经常遇到的难题。
PID

2.4.3 通俗易懂的理解PID

  P就是比例的意思。它的作用最明显,原理也最简单。
  需要控制的量,比如水温,有它现在的『当前值』,也有我们期望的『目标值』。
当两者差距不大时,就让加热器“轻轻地”加热一下。要是因为某些原因,温度降低了很多,就让加热器“稍稍用力”加热一下。要是当前温度比目标温度低得多,就让加热器“开足马力”加热,尽快让水温到达目标附近。
  这就是P的作用,跟开关控制方法相比,是不是“温文尔雅”了很多.实际写程序时,就让偏差(目标减去当前)与调节装置的“调节力度”,建立一个一次函数的关系,就可以实现最基本的“比例”控制了~
  KP越大,调节作用越激进,KP调小会让调节作用更保守。
  要是你正在制作一个平衡车,有了KP的作用,你会发现,平衡车在平衡角度附近来回“狂抖”,比较难稳住。如果已经到了这一步——恭喜你!离成功只差一小步了~


  D的作用更好理解一些,所以先说说D,最后说i。
  刚才我们有了P的作用。你不难发现,只有P好像不能让平衡车站起来,水温也控制得晃晃悠悠,好像整个系统不是特别稳定,总是在“抖动”。
tanhuang
  你心里设想一个弹簧:现在在平衡位置上。拉它一下,然后松手。这时它会震荡起来。因为阻力很小,它可能会震荡很长时间,才会重新停在平衡位置。
  请想象一下:要是把上图所示的系统浸没在水里,同样拉它一下 :这种情况下,重新停在平衡位置的时间就短得多。我们需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用。
  因为,当比较接近目标时,P的控制作用就比较小了。越接近目标,P的作用越温柔。有很多内在的或者外部的因素,使控制量发生小范围的摆动。D的作用就是让物理量的速度趋于0,只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力刹住这个变化。kD参数越大,向速度相反方向刹车的力道就越强。
  如果是平衡小车,加上P和D两种控制作用,如果参数调节合适,它应该可以站起来了~欢呼吧
  等等,PID三兄弟好想还有一位。看起来PD就可以让物理量保持稳定,那还要I干嘛?


  因为我们忽视了一种重要的情况:
  还是以热水为例。假如有个人把我们的加热装置带到了非常冷的地方,开始烧水了。需要烧到50℃。
  在P的作用下,水温慢慢升高。直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了。这可怎么办?
  P兄这样想:我和目标已经很近了,只需要轻轻加热就可以了。
  D兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。
  于是,水温永远地停留在45℃,永远到不了50℃。
  作为一个人,根据常识,我们知道,应该进一步增加加热的功率。可是增加多少该如何计算呢?
  前辈科学家们想到的方法是真的巧妙。设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。这样一来,即使45℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加。
  系统就会慢慢意识到:还没有到达目标温度,该增加功率啦!到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率。但是,温度是稳稳的50℃。
  Ki的值越大,积分时乘的系数就越大,积分效果越明显。所以,I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。
  I在使用时还有个问题:需要设定积分限制。防止在刚开始加热时,就把积分量积得太大,难以控制。


2.4.4 数字PID控制的实现

  数字PID控制是通过算法程序实现PID控制的。数字控制系统大多数是采样数据控制系统,进入系统的连续时间信号必须经过采样和量化后转换为数字量,方能进行相应的计算和处理,不论是积分还是微分,只能用数值计算去逼近。当采样周期相当短时,用求和代替积分,用差商代替微商,将描述连续时间PID算法的微分方程变为描述离散时间PID算法的差分方程。数字PID控制通常有以下两种实现:

2.4.4.1 位置式PID控制算法

  图2.18为位置式PID控制算法的实现框图,根据此框图得到差分方程:
2.2
  此式是数字PID算法的非递推形式,称全量算法,其中uo为控制量基值(n=0时的控制量);un为第n个采样时刻的控制量;Ts为采样周期。算法中为实现求和,必须存储系统偏差的全部值ei,得出的全量输出un是控制量的绝对数值,这种控制量确定了执行机构在控制系统中的位置(如阀门控制中,输出对应阀门的位置),因此将这种算法称为“位置算法”。
图2.18  位置式PID控制算法实现框图

2.4.4.2 增量式PID控制算法

  当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如驱动步进电动机)时,需要用PID的“增量算法”,其简化示意图如图2.19所示。
图2.19  增量式PID控制算法简化示意图
  增量式PID算法的差分方程为
在这里插入图片描述
  此时已看不出P、I、D作用的直接关系,只能体现各次误差量对控制作用的影响,但处理时只需要贮存最近的三个误差采样值en en-1 en-2 。

2.5 数字滤波算法

  说到滤波,大家第一反应可能就是各种电阻电容电感搭建成的无源滤波器或者是以各个不同型号的运算放大器为核心构建的有源滤波器,以上这些滤波器可以统称为硬件滤波,它们已经在电子行业的各个领域得到了广泛应用,但它们都有一个致命的缺点,那就是需要硬件电路作为支撑,费材料,费空间。随着计算机技术的发展,目前很多微型处理器已经具备很强大的运算能力了,我们可以利用CPU强大的计算运算功能,通过某种数值运算,达到改变输入信号中所含频率分量的相对比例、或滤除某些频率分量的目的,这种滤波方法我们称之为数字滤波。
  数字滤波相对于硬件滤波来说,在某些方面有着独到的优势,数字滤波不需要硬件电路的支持,为系统的设计节省了空间。我们在进行有源滤波时,需要对滤波电路中的各个运算放大器进行供电,而数字滤波就省去了这个麻烦,总之,数字滤波在业界的应用已经越来越广泛,熟练掌握一些基本的数字滤波技巧对于一名合格的电子工程师来说是非常有必要的。
  数字滤波的方法有很多种,下面介绍常用的几种,不同的滤波方法应用的场合和环境也不用,应根据具体情况选择使用。为了直观体现出这几种滤波方法对不同噪声的滤波效果,我们人为生成了几段基本信号的组合,然后在它们的波形上叠加上不同的噪声,测试这些滤波方法在不同信号、不同噪声下的输出结果,实验数据如图2.22所示:
图2.22  数字滤波实验采用的原始实验数据
  在这段长度为800点,最大值为65535的测试样本中,组合了以下几种情况:
  ① 起始阶段是一段表达式近似为x的数据,用来模拟大多数系统从0开始启动的采样波形,该段信号受到了约为信号本身1/5强度的随机噪声的干扰,用以测试滤波函数对噪声的过滤程度。
  ② 第二段是一段长度为200点的方波信号,其上叠加了幅度为信号本身1/10的毛刺噪声,测试函数对直流采样过程中毛刺的过滤效果以及对阶跃信号的响应速度。
  ③ 第三段为一段均匀上升的斜坡信号,但是叠加了几个三角形的噪声信号,用来模拟一些高惯性系统受到脉冲冲击后产生的周期较长的干扰杂波。
  ④ 第四段是一段混有信号本身1/10强度的随机噪声与1/4强度的毛刺噪声,模拟了平时在正弦逆变类题目中常常碰到的系统底噪与周期性开关噪声。
  ⑤ 最后一段是直流信号上叠加了一个长周期的小幅正弦纹波,同时伴有一定的毛刺,用来模拟DC-DC类题目中常出现的输出伴纹波信号。

2.5.1 限幅滤波

  限幅滤波又称为程序判断滤波,根据多次采集到的数据,如果当前采集值与前一次采集的数值相差一般维持在一定的偏差detaD内,则将每次采集到的数据和前一次的数据进行比较,如果他们的差的绝对值小于△D则本次采集到的数据有效,否则无效舍弃。
  示例代码

#include <stdlib.h>
/*********************限幅滤波***********************
/* sampleValue:当前采样值
/* return 滤波输出值
/***************************************************/
#define AMPLIMIT 8192
int lastValue = -1;
unsigned int AmpLimitFilter(unsigned int sampleValue)
{
	if(-1 == lastValue)
	lastValue = sampleValue;
	//限幅判断
	if(abs(sampleValue - lastValue) > AMPLIMIT)
	{
		return lastValue;
	}
	else
	{
		lastValue = sampleValue;
		return 
		     sampleValue;
	}
}


 &emsp滤波效果:可以看到,那些幅值变化很大的毛刺基本都被滤除了。
 &emsp适用性分析:
 &emsp限幅滤波程序设计简单、运算速度快、占用RAM少,是一种最简单的基本滤波方法。能够克服偶然因素引入的脉冲干扰,也可以消除波形上的尖峰毛刺,但是不能抑制周期性的干扰,而且其完全削除大幅度的阶跃信号,容易造成控制失调,一般不适用于开关电源这类变化剧烈,需要迅速反馈的场景,适用于水温控制等变化缓慢,安全性高的应用。
图2.23  限幅滤波实验效果

2.5.2 中值滤波

  其基本滤波思路是将原来的采样间隔T进行细分,也就是在原来的采样间隔T内采样N次,然后把N次采样值按照大小排序,取中间值为本次采样值。
  示例代码

/*********************中值滤波***********************
/* *sampleGet():采样函数指针,返回unsigned int类型
/* return 滤波输出值
/***************************************************/
#define MID_NUM 5
unsigned int MidFilter(unsigned int *sampleGet())
{
	unsigned char i;
	unsigned int value_buf[MID_NUM]={0};
	for (i=0;i < MID_NUM;i++)
	{
		value_buf[i] = sampleGet();
	}
	unsigned int mid;
	//冒泡排序
	for(i=0;i<MID_NUM;i++)
	{
		int j;
		for(j=i+1;j<MID_NUM;j++)
		{
			if(value_buf[i]>value_buf[j])
			{
				mid=value_buf[i];
				value_buf[i]=value_buf[j];
				value_buf[j]=mid;
			}
	    }
    }
	mid=value_buf[MID_NUM/2];
	return mid;
}

  滤波效果
图2.24  中值滤波实验效果
  可以看出,其滤波效果较限幅滤波较好,毛刺基本被滤除。
  适用性分析
  这种滤波方法能够有效的克服偶然因素引起的波动干扰,特别是对于像温度、液位等变化缓慢的被测参数有良好的滤波效果,但是对于流量、速度或者其他快速变化的信号参数则不适合使用这种方法。中值滤波法的程序设计要稍复杂一些,排序可以使用冒泡法或者选择排序法等,由于引入了排序算法,所以该方法不能处理速度要求很高的信号。其运算处理速度和占用的RAM直接受所选择的数值N决定

2.5.3 算术平均滤波

  该方法也是先将原来设计要求的采样间隔T进行细分,在T内采样N次,但是对于采集进来的数据不是进行排序,而是进行算术平均,算术平均的结果作为本次采样值。N值的选取比较关键,N值较大者处理信号的平滑度会较高,但是灵敏度降低;相反,N值较小者处理信号的灵敏度提高,但是平滑度降低。
  示例代码

/*********************均值滤波***********************
/* *sampleGet():采样函数指针,返回unsigned int类型
/* return 滤波输出值
/***************************************************/
#define AVG_NUM 5
unsigned int AvgFilter(unsigned int *sampleGet())
{
	unsigned char i;
	unsigned long int sum=0;
	for (i=0;i < AVG_NUM;i++)
	{
		sum += (unsigned int)sampleGet();
	}
	return (sum / AVG_NUM);
}

  滤波效果
图2.25  算术平均滤波实验效果
  适用性分析
  这种滤波方法是适用于对具有随机干扰的信号进行处理,并且被处理的信号必须具有一个平均值,信号在这个平均值上下波动。该方法对于高速信号并不适用。对于毛刺信号,可以看到均值滤波将其分担到了周围的采样点上,不如中值滤波那样能够完全去除。但是对于随机噪声信号,由于其理论均值为0,均值滤波对第一段噪声有良好的滤除效果。该滤波方法运算处理速度和RAM的占用率也受所选择的数值N决定,可以使用时间复杂度较低的排序方法降低运算开销。

2.5.4 递推平均滤波

  递推平均滤波又称为滑动平均滤波,是将连续N个采样值设为一个先入先出的队列,队列的长度为N,每次采样得到的新数据加入队尾,并扔掉原队列的队首,然后对队列中的N个数据进行算术平均,获得的结果作为此次采样值。
  示例代码

/*******************递推均值滤波*********************
/* sampleQueue[SLIDE_AVG_NUM]:采样队列
/* sampleValue:当前采样值
/* return 滤波输出值
/***************************************************/
#define SLIDE_AVG_NUM 5
unsigned int sampleQueue[SLIDE_AVG_NUM] = {0};
unsigned int SlideAvgFilter(unsigned int sampleValue)
{
	unsigned int i;
	unsigned long int sum=0;
	for(i = 0; i < SLIDE_AVG_NUM - 1; i ++) //刷新队列
	{
		sampleQueue[i] = sampleQueue[i + 1];
	}
	sampleQueue[i] = sampleValue;
	for (i=0;i < SLIDE_AVG_NUM;i++) //求和
	{
		sum += sampleQueue[i];
	}
	return (sum / SLIDE_AVG_NUM);//取平均
}

  滤波效果
图2.26  递推平均滤波实验效果
  适用性分析
  上图为滤波长度为5的输出波形,下图为滤波长度为20的输出波形。可以看到长度为20的波形更好但延迟也更大。可见该方法对于周期性干扰有良好的抑制作用,平滑度也很高。但是灵敏度较低,对于偶然出现的脉冲干扰的抑制作用较差,不适用于脉冲干扰比较严重的场合,其运算处理速度和RAM的占用率也直接受N值影响。
  另外,这种方法还有一个特殊用法:制作成软件陷波器,滤除某个单一频率信号的干扰(如工频干扰)。具体实现方法介绍如下:由于正弦波一个周期内任取N个等分点的幅值和为零,其它周期波形的N等分点的幅值和为常数C,设每次采样值为Xi,采样的平均值为
在这里插入图片描述
  若取N=s/f(其中S为每秒的采样次数即采样率;f是要消除的波形的频率,S和N都取整数),这样最终的结果就是Y-C,对于50Hz的工频干扰,C为零,只要选择合适的N和S就可以直接将其消除,构成一个陷波器。
  对于本测试样例,我们针对最后一段的纹波设计滤波器,由于这里是测试的一组数组,没有采样率概念,但是根据前面的关系换算,设置滤波点数为100点,对最后一段纹波进行了较好的滤除,由于这一段数据较少,加之前面数据的相移影响,读者可自己构造一段足够长的纹波信号验证,效果将更加明显。
图2.27  增加滤波点数的递推平均滤波实验效果

2.5.5 中值平均滤波

  中值平均滤波也称为防脉冲干扰平均滤波,相当于中值滤波和算术平均滤波思想的结合。连续采样N个数据,去掉其中的最大值和最小值,求剩下的N-2个数据的算术平均作为一次采样值。
  示例代码

/*******************中值平均滤波*********************
/* *sampleGet():采样函数指针,返回unsigned int类型
/* return 滤波输出值
/***************************************************/
#define MID_AVG_NUM 5
unsigned int MidAvgFilter(unsigned int *sampleGet())
{
	unsigned char i;
	unsigned int value_buf[MID_AVG_NUM]={0};
	unsigned int max,min;
	unsigned long int sum=0;
	for (i=0;i < MID_AVG_NUM;i++)
	{
		value_buf[i] = sampleGet();
	}
	max=0;
	min=0xffffffff;
	for(i=0;i<MID_AVG_NUM;i++)
	{
		sum += value_buf[i];//求和
	if(value_buf[i]>max)
	{
		max=value_buf[i]; //找出最大值
	}
	if(value_buf[i]<min)
	{
		min=value_buf[i]; //找出最小值
	}
	}
	return (sum-min-max)/(MID_AVG_NUM-2);//去掉最大最小值,取平均
}

滤波效果
图2.28  中值平均滤波实验效果

2.5.6 递推中值平均滤波

  递推中值平均滤波也称为滑动中值平均滤波,与上一种不同的是采用滑动方法对序列采样,不降低系统采样率与采样速度。设定一个长度为N的先进先出队列,同时为了方便排序同时构造一个同样长度为N的已排序数组,每个周期采样一个新的数值,插入采样队列队尾并移除队首的旧值。对这个队列进行插入排序(其他快速排序方法均可),然后去掉用户指定个数的较大值与较小值,取中间剩下值的平均数作为最终结果。
  示例代码

/*******************中值平均滤波*********************
/* SLIDE_MID_AVG:数据存储结构体,每路信号对应一个
/* *sma:本路信号对应结构体指针
/* newValue:本次采样值
/* cutNum:排序队列头尾要舍弃的数量
/* return 滤波输出值
/***************************************************/
#define SLIDE_MID_AVG_NUM 32
typedef struct SLIDE_MID_AVG
{
volatile unsigned int sample_queue[SLIDE_MID_AVG_NUM];
volatile unsigned int sort_queue[SLIDE_MID_AVG_NUM];
} SLIDE_MID_AVG;
SLIDE_MID_AVG sma;
unsigned int SlideMidAvgFilter(SLIDE_MID_AVG *sma,unsigned intnewValue,unsigned int cutNum)
{
	unsigned int i;
	unsigned int sum = 0;
	unsigned int insert_value = newValue;
	//在排序序列中移除采样序列中最早的值
	for(i = 0;i < SLIDE_MID_AVG_NUM;i ++)
	{
		if(sma->sort_queue[i] == sma->sample_queue[0])
		{
			unsigned int j;
			for(j = i;j< SLIDE_MID_AVG_NUM - 1;j ++)
			{
				//排序序列向前缩进
				sma->sort_queue[j] = sma->sort_queue[j + 1];
			}
		   break;
        }
    }
	//在排序序列中插入新的采样值(插入排序加快运算)
	for(i = 0;i < SLIDE_MID_AVG_NUM - 1;i ++)
	{
		if(insert_value < sma->sort_queue[i])
		{
			unsigned int j;
			for(j = SLIDE_MID_AVG_NUM - 1;j > i;j --)
			{
				//排序序列向后缩进
				sma->sort_queue[j] = sma->sort_queue[j - 1];
			}
	        sma->sort_queue[i] = insert_value;
		    break;
		}
		else
		{
			if(i == SLIDE_MID_AVG_NUM - 2)
			{
				sma->sort_queue[SLIDE_MID_AVG_NUM - 1] = insert_value;
			}
		}
	}
	//记录新的值到采样队列末尾
	for(i = 0;i < SLIDE_MID_AVG_NUM - 1;i ++)
	{
		sma->sample_queue[i] = sma->sample_queue[i + 1]; //移位刷新
	}
	sma->sample_queue[SLIDE_MID_AVG_NUM - 1] = insert_value; //采样新值
	//计算中间数的平均值
	for(i = cutNum; i < (SLIDE_MID_AVG_NUM - cutNum);i ++)
	{
		sum += sma->sort_queue[i];
	}
	return sum / (SLIDE_MID_AVG_NUM - (cutNum << 1));
}

  滤波效果
图2.29  递推中值平均滤波实验效果
  适用性分析
  上图采用了32点滤波长度,首尾去除8个点,波形平滑,没有突变的噪声与毛刺现象,对各种噪声适应性比较均衡,是我们电子竞赛实际中应用的最多的一种滤波方法。但是细心的读者可以发现,波形向后的延迟很高,差不多与滤波长度相当,这也是此方法的弊端。所以我们经常使用32点或者64点甚至更长的滑动中值平均滤波进行数据校准阶段的信号滤波,在恒压恒流等达到准确的稳态值后换用前面的中值滤波等高灵敏度方法进行PID的整定与调节,获得系统高速的动态响应。

上一章 全国大学生电子设计竞赛(一) – 电源简介
下一章 全国大学生电子设计竞赛(三)–线性电源设计

发布了48 篇原创文章 · 获赞 48 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_39400113/article/details/105723823