搜索
bottom↓
回复: 15

双闭环的PI调节哪个告诉我如何写??和同事真了一上午

[复制链接]

出0入0汤圆

发表于 2011-7-7 15:42:47 | 显示全部楼层 |阅读模式
单闭环的我我知道,,无非是给定和反馈做比较,,那双闭环列??外环的输出是直接给内环做给定还是杂的??


外环的输出是直接给内环做给定还是要搞什么函数或者什么东西处理下。。哪个最好帖个示例上来看下

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-7-7 15:44:51 | 显示全部楼层
回复【楼主位】guan  
单闭环的我我知道,,无非是给定和反馈做比较,,那双闭环列??外环的输出是直接给内环做给定还是杂的??
外环的输出是直接给内环做给定还是要搞什么函数或者什么东西处理下。。哪个最好帖个示例上来看下
-----------------------------------------------------------------------

直接给内环。
最多调节一下增益,再加下限幅。

出0入0汤圆

 楼主| 发表于 2011-7-7 15:46:34 | 显示全部楼层
哪个最好帖个示例上来看下

出0入0汤圆

发表于 2011-7-7 16:04:13 | 显示全部楼层
回复【2楼】guan  
哪个最好帖个示例上来看下
-----------------------------------------------------------------------

/* @brief  Top module of power controller
* @input  
* @output
* @remark  
*/
module power_controller(
        //Clock and reset
        clk_100,
        clk_200,
        rst_n,
        //ADC 0
        adc0_cs_n,
        adc0_clk,
        adc0_din,
        mux0_addr,
        mux0_en,
        //ADC 1
        adc1_cs_n,
        adc1_clk,
        adc1_din,
        mux1_addr,
        mux1_en,
        //DAC 0
        dac0_cs_n,
        dac0_clk,
        dac0_dout,
        //DAC 1
        dac1_cs_n,
        dac1_clk,
        dac1_dout,
        //PWM
        pwm0_out,
        pwm0_out_n,
        pwm1_out,
        pwm1_out_n,
        //Line syn.
        line_det_p,
        line_det_n,
        pls_pos,
        pls_neg,
        pls_en_n,
        //Relay control
        relay0_on,
        relay1_on,
        //Analon BUS
        address,
        chipselect_n,
        readdata,
        read_n,
        writedata,
        write_n,
        irq
);

/*******************************************************************************
* PARAMETER declarations
*******************************************************************************
*/

/* PORT declarations
*/       
//Clock and reset
input                        clk_100;
input                        clk_200;
input                        rst_n;
//ADC 0
output                        adc0_cs_n;
output                        adc0_clk;
input                        adc0_din;
output        [ 1: 0]        mux0_addr;
output                        mux0_en;
//ADC 1
output                        adc1_cs_n;
output                        adc1_clk;
input                        adc1_din;
output        [ 1: 0] mux1_addr;
output                        mux1_en;
//DAC 0
output                        dac0_cs_n;
output                        dac0_clk;
output                        dac0_dout;
//DAC 1
output                        dac1_cs_n;
output                        dac1_clk;
output                        dac1_dout;
//PWM
output                        pwm0_out;
output                        pwm0_out_n;
output                        pwm1_out;
output                        pwm1_out_n;
//Line syn.
input                        line_det_p;
input                        line_det_n;
output                        pls_pos;
output                        pls_neg;
output                        pls_en_n;
//Relay control
output                        relay0_on;
output                        relay1_on;
//Analon BUS
input        [ 6: 0]        address;
input                        chipselect_n;
output        [31: 0]        readdata;
input                        read_n;
input        [31: 0]        writedata;
input                        write_n;
output                        irq;
       
/******************************************************************************/
/* Parameters
*/

/* REG/WIRE declarations
*/
//Analon BUS
reg                                dac_write;
reg                [33: 0]        dac_reg;
reg                                write;

//Enable signals
wire                        boost_enable;
wire                        buck_enable;

//ADC trigger signals
wire                        adc0_trig;
wire                        adc1_trig;

//PWM duty
wire        [11: 0] pwm_duty0;
wire                        duty0_enable;
wire        [11: 0] pwm_duty1;
wire                        duty1_enable;

//ADC output data
wire        [11: 0] adc0_IL;
wire                        adc0_IL_en;
wire        [11: 0] adc0_VBUS;
wire                        adc0_VBUS_en;
wire        [11: 0] adc1_IL;
wire                        adc1_IL_en;

//Boost current reference
wire        [11: 0] Iref0;
wire                        Iref0_en;

//Buck current reference
wire        [11: 0] Iref1;
wire                        Iref1_en;

//Phase
wire        [ 9: 0] ins_phase;
wire                        phase_en;

/* MODULE Connections
*/
pwm mPWM_0(
        //Clock and reset
        .clk_200(clk_200),
        .clk_100(clk_100),
        .rst_n(rst_n),
        //PWM interface
        .pwm0_out(pwm0_out),
        .pwm0_out_n(pwm0_out_n),
        .pwm1_out(pwm1_out),
        .pwm1_out_n(pwm1_out_n),
        //ADC trigger signal
        .adc0_trig(adc0_trig),
        .adc1_trig(adc1_trig),
        //Enable signals
        .enable0_in(boost_enable),
        .enable1_in(buck_enable),
        //Data input interface
        .duty0_input(pwm_duty0),
        .duty0_enable(duty0_enable),
        .duty1_input(pwm_duty1),
        .duty1_enable(duty1_enable),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1),
        .irq(irq)
);

adc mADC_0(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //ADC interface
        .adc_cs_n(adc0_cs_n),
        .adc_clk(adc0_clk),
        .adc_din(adc0_din),
        .mux_addr(mux0_addr),
        .mux_en(mux0_en),
        //Trigger signal
        .adc_trig(adc0_trig),
        //Data output interface
        .Data0_out(adc0_IL),
        .Data0_enable(adc0_IL_en),
        .Data1_out(adc0_VBUS),
        .Data1_enable(adc0_VBUS_en),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

adc mADC_1(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //ADC interface
        .adc_cs_n(adc1_cs_n),
        .adc_clk(adc1_clk),
        .adc_din(adc1_din),
        .mux_addr(mux1_addr),
        .mux_en(mux1_en),
        //Trigger signal
        .adc_trig(adc1_trig),
        //Data output interface
        .Data0_out(adc1_IL),
        .Data0_enable(adc1_IL_en),
        .Data1_out(),
        .Data1_enable(),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

dac mDAC_0(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //DAC interface
        .dac_cs_n(dac0_cs_n),
        .dac_clk(dac0_clk),
        .dac_dout(dac0_dout),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

dac mDAC_1(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //DAC interface
        .dac_cs_n(dac1_cs_n),
        .dac_clk(dac1_clk),
        .dac_dout(dac1_dout),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

IIR_compI mBoost_IL_IIR(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Data input interface
        .fb_input(adc0_IL),
        .fb_enable(adc0_IL_en),
        .ref_input(Iref0),
        .ref_enable(Iref0_en),
        //Enable signal
        .enable_in(boost_enable),
        //Data output interface
        .y_output(pwm_duty0),
        .y_enable(duty0_enable),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

IIR_compI mBuck_IL_IIR(
        //

出0入0汤圆

发表于 2011-7-7 16:04:30 | 显示全部楼层
回复【2楼】guan  
哪个最好帖个示例上来看下
-----------------------------------------------------------------------

IIR_compI mBuck_IL_IIR(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Data input interface
        .fb_input(adc1_IL),
        .fb_enable(adc1_IL_en),
        .ref_input(Iref1),
        .ref_enable(Iref1_en),
        //Enable signal
        .enable_in(buck_enable),
        //Data output interface
        .y_output(pwm_duty1),
        .y_enable(duty1_enable),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

VBUS_control mVBUS_control(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Data input interface
        .vbus_input(adc0_VBUS),
        .vbus_enable(adc0_VBUS_en),
        //Data output interface
        .ref_output(Iref0),
        .ref_enable(Iref0_en),
        //Enable signal
        .enable_out(boost_enable),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

IL_control mIL_control(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Data input interface
        .phase_in(ins_phase),
        .phase_enable(phase_en),
        //Data output interface
        .ref_output(Iref1),
        .ref_enable(Iref1_en),
        //Enable signal
        .enable_out(buck_enable),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

line_syn SYN_0(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Input interface
        .line_det_p(line_det_p),
        .line_det_n(line_det_n),
        //Output interface
        .pol_pos(pls_pos),
        .pol_neg(pls_neg),
        .enable_n(pls_en_n),
        //Data output interface
        .phase_out(ins_phase),
        .phase_enable(phase_en),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

relay_IO mRelay_IO(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Output interface
//        .relay0_out(relay0_on),
//        .relay1_out(relay1_on),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

assign relay0_on = 1;
assign relay1_on = 1;


/* LOGIC Descriptions
*/

always @(posedge clk_100 or negedge rst_n) begin
        if(!rst_n) begin
        end
        else begin
        end
end

endmodule //power_controller

出0入0汤圆

发表于 2011-7-7 16:04:40 | 显示全部楼层
回复【2楼】guan  
哪个最好帖个示例上来看下
-----------------------------------------------------------------------

/* @brief  Inductor current controller
* @input  
* @output
* @remark  
*/
module IL_control(
        //Clock and reset
        clk_100,
        rst_n,
        //Data input interface
        phase_in,
        phase_enable,
        //Data output interface
        ref_output,
        ref_enable,
        //Enable signal
        enable_out,
        //Analon BUS
        address,
        chipselect_n,
        readdata,
        read_n,
        writedata,
        write_n
);

/*******************************************************************************
* PARAMETER declarations
*******************************************************************************
*/

/* PORT declarations
*/       
//Clock and reset
input                        clk_100;
input                        rst_n;
//Data input interface
input        [ 9: 0]        phase_in;
input                        phase_enable;
//Data output interface
output        [11: 0]        ref_output;
output        reg                ref_enable;
//Enable signal
output                        enable_out;
//Analon BUS
input        [ 2: 0]        address;
input                        chipselect_n;
output        [31: 0]        readdata;
input                        read_n;
input        [31: 0]        writedata;
input                        write_n;

       
/******************************************************************************/
/* Parameters
*/
parameter        ADDR_GAIN                        = 3'b000;
parameter        ADDR_ENABLE                        = 3'b010;

parameter        GAIN_DEFAULT                = 12'd46; //2316 for 5A


/* REG/WIRE declarations
*/
reg                [11: 0] amp_out;
wire        [11: 0] amp_in;
reg                [23: 0] amp_temp;

//Gain
reg                [11: 0] gain; //Gain value, 12-bit
reg                [11: 0] gain_shd; //Gain value shadow register, 12-bit

//Phase
reg                [ 9: 0] phase_last; //Laset phase

//Enable
reg                                enable_out;
reg                                enable_shd; //Enable shadow register

//Analon BUS
reg                [31: 0] readdata;
wire        [31: 0] readdata_mux;

/* MODULE Connections
*/
phase_to_amp mPhaseToAmp(
        .phase_in(phase_in),
        .amp_out(amp_in)
);

/* LOGIC Descriptions
*/
assign        ref_output = amp_out;

always @(posedge clk_100 or negedge rst_n) begin
        if(!rst_n) begin
                gain <= GAIN_DEFAULT;
                enable_out <= 0;
        end
        else begin
                if(phase_enable) begin
                        if(phase_last[9] && !phase_in[9]) begin //0 phase
                                gain       <= gain_shd;
                                enable_out <= enable_shd;
                        end
                        phase_last <= phase_in;
                       
                        amp_temp    = amp_in * gain;
                        amp_out    <= amp_temp >> 12;
                        ref_enable <= 1;
                end
                else begin
                        ref_enable <= 0;
                end
        end
end

//Analon BUS Read and Write
assign        readdata_mux = (address == ADDR_GAIN) ? gain_shd :
                                (address == ADDR_ENABLE) ? enable_shd : 0;

always @(posedge clk_100 or negedge rst_n) begin
        if(!rst_n) begin
                gain_shd <= GAIN_DEFAULT;
                enable_shd <= 0;
        end
        else begin
                if(!chipselect_n && !read_n) begin //Read
                        readdata <= readdata_mux;
                end
                if(!chipselect_n && !write_n) begin //Write
                        if(address == ADDR_GAIN) begin
                                gain_shd <= writedata[11: 0];
                        end
                        if(address == ADDR_ENABLE) begin
                                enable_shd <= writedata[0];
                        end
                end
        end
end

endmodule //IL_control

出0入0汤圆

发表于 2011-7-7 16:05:15 | 显示全部楼层
回复【2楼】guan  
哪个最好帖个示例上来看下
-----------------------------------------------------------------------

/* @brief  BUS voltage controller
* @input  
* @output
* @remark  
*/
module VBUS_control(
        //Clock and reset
        clk_100,
        rst_n,
        //Data input interface
        vbus_input,
        vbus_enable,
        //Data output interface
        ref_output,
        ref_enable,
        //Enable signal
        enable_out,
        //Analon BUS
        address,
        chipselect_n,
        readdata,
        read_n,
        writedata,
        write_n
);

/*******************************************************************************
* PARAMETER declarations
*******************************************************************************
*/

/* PORT declarations
*/       
//Clock and reset
input                        clk_100;
input                        rst_n;
//Data input interface
input        [11: 0]        vbus_input;
input                        vbus_enable;
//Data output interface
output        [11: 0]        ref_output;
output                         ref_enable;
//Enable signal
output                        enable_out;
//Analon BUS
input        [ 2: 0]        address;
input                        chipselect_n;
output        [31: 0]        readdata;
input                        read_n;
input        [31: 0]        writedata;
input                        write_n;

       
/******************************************************************************/
/* Parameters
*/
parameter        ADDR_VBUS_REF                = 3'b000;
parameter        ADDR_VBUS_AVG                 = 3'b001;
parameter        ADDR_ENABLE                        = 3'b101;

parameter        VBUS_REF_DEFAULT        = 12'd2458; //360V

/* REG/WIRE declarations
*/
reg                [11: 0] vbus_avg;
reg                [19: 0] vbus_sum;
reg                [ 7: 0] comp_cnt;

reg                [11: 0] vbus_ref;
wire        [11: 0]        vbus_fb;
reg                                vbus_fb_en;

reg                                enable_out;

//Analon BUS
reg                [31: 0] readdata;
wire        [31: 0] readdata_mux;

/* MODULE Connections
*/
IIR_compV IIR_0(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Data input interface
        .fb_input(vbus_fb),
        .fb_enable(vbus_fb_en),
        .ref_input(vbus_ref),
        .ref_enable(1),
        //Enable signal
        .enable_in(enable_out),
        //Data output interface
        .y_output(ref_output),
        .y_enable(ref_enable),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

/* LOGIC Descriptions
*/
assign        vbus_fb = vbus_avg;

always @(posedge clk_100 or negedge rst_n) begin
        if(!rst_n) begin
                vbus_avg <= 0;
                vbus_sum <= 0;
                comp_cnt <= 0;
        end
        else begin
                if(vbus_enable) begin
                        vbus_sum  <= vbus_sum + vbus_input;
                        comp_cnt  <= comp_cnt + 1;
                       
                        if(comp_cnt == 0) begin
//                                vbus_avg <= (vbus_sum + vbus_input) >> 8; //Setup time??????
                                vbus_avg <= (vbus_sum >> 8) + (vbus_input >> 8);
                                vbus_sum <= 0;
                                vbus_fb_en <= 1;
                        end
                end
                else begin
                        vbus_fb_en <= 0;
                end
        end
end

//Analon BUS Read and Write
assign        readdata_mux = (address == ADDR_VBUS_REF) ? vbus_ref :
                                (address == ADDR_VBUS_AVG) ? vbus_avg :
                                (address == ADDR_ENABLE) ? enable_out : 0;

always @(posedge clk_100 or negedge rst_n) begin
        if(!rst_n) begin
                vbus_ref   <= VBUS_REF_DEFAULT;
                enable_out <= 0;
        end
        else begin
                if(!chipselect_n && !read_n) begin //Read
                        readdata <= readdata_mux;
                end
                if(!chipselect_n && !write_n) begin //Write
                        if(address == ADDR_VBUS_REF) begin
                                vbus_ref <= writedata[11: 0];
                        end
                        if(address == ADDR_ENABLE) begin
                                enable_out <= writedata[0];
                        end
                end
        end
end

endmodule //VBUS_control

出0入0汤圆

发表于 2011-7-7 16:06:50 | 显示全部楼层
回复【2楼】guan  
哪个最好帖个示例上来看下
-----------------------------------------------------------------------

外环是电压环,内环电流环。
电压环内嵌一个PI控制:
IIR_compV IIR_0(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Data input interface
        .fb_input(vbus_fb),
        .fb_enable(vbus_fb_en),
        .ref_input(vbus_ref),
        .ref_enable(1),
        //Enable signal
        .enable_in(enable_out),
        //Data output interface
        .y_output(ref_output),
        .y_enable(ref_enable),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

输出作为电流环的基准,给到电流控制环:
IIR_compI mBoost_IL_IIR(
        //Clock and reset
        .clk_100(clk_100),
        .rst_n(rst_n),
        //Data input interface
        .fb_input(adc0_IL),
        .fb_enable(adc0_IL_en),
        .ref_input(Iref0),
        .ref_enable(Iref0_en),
        //Enable signal
        .enable_in(boost_enable),
        //Data output interface
        .y_output(pwm_duty0),
        .y_enable(duty0_enable),
        //Analon BUS
        .address(),
        .chipselect_n(1),
        .readdata(),
        .read_n(1),
        .writedata(),
        .write_n(1)
);

出0入0汤圆

发表于 2011-7-7 16:20:52 | 显示全部楼层
LS Verilog?
共享一下文件吧…… 谢谢

出0入0汤圆

 楼主| 发表于 2011-7-7 16:22:14 | 显示全部楼层
mitchell  好是好 ,,不过汇编现在 不想看 了 ,,都搞C
1.那 也就是说 外环输出可以 直接 赋值给 内环做 给定??
2.我经常看 什么 稳压限流,,这样的 双闭环有没有 PI程序看 下 ??看它如何做 到双闭环,,如何限制电流的 ,,要有 C程序 最好不过了 ,,我 写单闭环的 没问题,,双闭环的 怕 不 稳

出0入0汤圆

发表于 2011-7-7 16:26:18 | 显示全部楼层
回复【8楼】JSXA  
ls verilog?
共享一下文件吧…… 谢谢
-----------------------------------------------------------------------

是一个逆变器项目里的代码,整个工程就太复杂了,不解释你也不好搞清楚具体做什么用的啊
我把PI控制器代码传上来吧。差分方程用的IIR形式,直接设置系数B0和B1,A1固定为1。
控制是硬件实现的,软件可以通过总线对PI控制设置参数。

点击此处下载 ourdev_655559KFD9PJ.rar(文件大小:1K) (原文件名:IIR_compI.rar)

出0入0汤圆

 楼主| 发表于 2011-7-7 17:02:28 | 显示全部楼层
mitchell  双闭环  限流程序  C语言的  ,,有不 ?着急的很?我 单闭环没 问题 ,,还有个什么 限制输出的什么 意思 ??如何弄 ,,有 C程序实例不 ??或者 告诉我哪有下号不

出0入0汤圆

 楼主| 发表于 2011-7-7 17:03:36 | 显示全部楼层
和同事吵了一上午  也没结果

出0入0汤圆

发表于 2011-7-7 18:18:03 | 显示全部楼层
回复【12楼】guan  
-----------------------------------------------------------------------

负责任的告诉你:
如果是一个低速电压外环,高速电流内环(平均电流模式/峰值电流模式控制的开关电源,或者电机转速控制),用串联结构,外环输出直接给内环。
如果是电压电流环速度相近(恒压恒流线性电源,开关电源输出电流和电压反馈控制),使用并联结构,两个环同时计算,取输出小者。

出0入0汤圆

 楼主| 发表于 2011-7-8 08:16:31 | 显示全部楼层
mitchell    你有邮箱或者什么方便联系方式不》???交流下

出0入0汤圆

发表于 2011-7-8 11:11:19 | 显示全部楼层
回复【14楼】guan  
-----------------------------------------------------------------------

要不你重新开新帖,把你的具体问题阐述一下,大家好讨论讨论?

联系方式的话,你查下我的资料应该就有了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表