本次PI设计的是增量式PI

遇见问题 :

  1. 输出被直接限幅
    可以看出输出一直被限制为416
    image

原因分析

Code

// 对比1, 被限幅
always@(posedge clk or posedge rstp) begin
	if(rstp)
		cnt_freq <= DEFAULT_CNT;
	else if(cnt_freq >= CNT_MAX)
		cnt_freq <= CNT_MAX;
	else if(cnt_freq <= CNT_MIN)
		cnt_freq <= CNT_MIN;
	else
		cnt_freq <= cnt_freq_last + cnt_freq_deta;
end


// 对比2, 正常工作
always@(posedge clk or posedge rstp) begin
	if(rstp)
		cnt_freq <= DEFAULT_CNT;
	else if(cnt_freq_last + cnt_freq_deta >= CNT_MAX)
		cnt_freq <= CNT_MAX;
	else if(cnt_freq_last + cnt_freq_deta <= CNT_MIN)
		cnt_freq <= CNT_MIN;
	else
		cnt_freq <= cnt_freq_last + cnt_freq_deta;
end

从不正常工作代码中可以看出, 当只要输出一次被限幅, 那么这段代码就会进入被限幅的死循环,
else if(cnt_freq >= CNT_MAX)
cnt_freq <= CNT_MAX;
以这句为例, 如果输出cnt_freq = CNT_MAX后,他就会一直等于CNT_MAX, 一是因为代码本身的设计, 还有就是else if的优先级会使得代码一直先判断if条件

修改

  1. 修改后的代码为第二段,不使用cnt_freq去进行判断比较, 而是使用我们当前希望得到的输出进行比较
  2. 将第一段代码中的等号去掉

效果
image
作出修改后,PI正常工作,就是参数还需要调整

Code Here... : https://github.com/tiruoQing/fpgas/blob/main/PID/PI.v

posted on 2024-10-21 11:21  天若手提滑铲  阅读(9)  评论(0编辑  收藏  举报