积分分离PID程序C语言,积分分离pid控制的verilog程序,请帮助修改。

博主正在使用FPGA进行直流电机的点位控制毕业设计,遇到了关于积分分离PID控制器Verilog程序的问题。主要问题包括:1. 小数参数kp、ki、kd如何处理;2. 即使参数转换为整数,综合仍然无法通过。代码中定义了参数并进行了错误检查,但需要专家帮助进行修正和完善。
摘要由CSDN通过智能技术生成

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x

积分分离pid控制的verilog程序,请帮助修改。

积分分离pid控制的verilog程序

小弟刚接触eda,现在在进行毕业设计,方向是用FPGA控制直流电机,进行点位控制。资料太少。

刚编的pid控制的verilog程序,采用积分分离方式,m是视场切换指令,现在问题多多,请各位高手帮忙修改。

万望各位大侠拉小弟一把 ,切切! 问题1:kp=1.1, ki=0.0286, kd=10.2是小数应该如何处理? 问题2:为何即使将kp、 ki 、kd都改成整数,综合还是不能通过?

module pid(

rst,clk,clk2,m,p_cur,         //input

uout,dataout

);                                 //output

input rst,clk,clk2;

input[7:0] m;                              //m is option

input[11:0] p_cur;                                //pcur is position

output[11:0] uout;

output[7:0] dataout;

reg[11:0] q0,q1,qa,qb;

reg[11:0] u_0,u_1,u3_1,u;

reg[11:0] e_0,e_1,e_2;

reg[11:0] ke;

reg[23:0] u1,u2,u3;

reg[23:0] b1,b2,b3,b4,b5;

reg[11:0] e_01,e_k;

reg[11:0] uout;

reg[7:0]  dataout;

parameter r=400, p1_0=12'b100100000000,  p2_0=12'b010000000000,                              //initial

kp=1.1, ki=0.0286, kd=10.2;

assign p1_1 = ~p1_0+1;

assign p2_1 = ~p2_0+1;

assign pcur_1 = ~p_cur+1;

always@( posedge rst )

if(rst==1'b1)

begin

u_0 <= 0;

u_1 <= 0;

e_0 <= 0;

e_1 <= 0;

e_2 <= 0;

dataout <= 0;

uout <= 0;

end

always@( posedge clk2)

begin

case(m)

1'b0 :  begin

e_0 =p1_1-p_cur;      //e_0<=p1-p_cur

if (e_0[11]==1)

e_01 = ~e_0+1;

else e_01 = e_0;

end

1'b1 :  begin

e_0 <= p2_1-p_cur;     //e_0<=p2-p_cur

if (e_0[11]==1)

e_01 = ~e_0+1;

else e_01 = e_0;

end

endcase

end

always@( posedge clk )

begin

if (e_01>r)                                      //pd

begin

e_k = e_01-e_1;

u1 = kp*e_01;

u2 = kd*e_k;

u3 = u1+u2;

u3_1 = u3[15:4];

u = u_1+u3_1;

end

else                                             //pid

begin

ke = ki+kd;

q0 = kp+ke;

qa = (-1)*kp;

qb = (-2)*kd;

q1 = qa+qb;

b1 = kd*e_2;

b2 = q1*e_1;

b3 = b1+b2;

b4 = q0*e_0;

b5 = b3+b4;

u = u_1+b5[15:4];

end

end

always@(posedge clk2)

begin

uout=~u+1;                   //link to DAC

end

always@(negedge clk2)

begin

u_1 = u;

e_2 = e_1;

e_1 = e_0;

end

endmodule

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值