本次PI设计的是增量式PI
遇见问题 :
- 输出被直接限幅
可以看出输出一直被限制为416
原因分析
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条件
修改
- 修改后的代码为第二段,不使用cnt_freq去进行判断比较, 而是使用我们当前希望得到的输出进行比较
- 将第一段代码中的等号去掉
效果
作出修改后,PI正常工作,就是参数还需要调整
Code Here... : https://github.com/tiruoQing/fpgas/blob/main/PID/PI.v