PID控制算法代码 PID控制算法的原理

一. 简介
相信大家对于pid控制算法,都不感到陌生了,平衡车就是靠它平衡起来的,还有飞控的平衡算法也是它,以及foc中的闭环控制中也是用的它,它不仅简单,而且易于理解。那么本篇文章将简要介绍一下算法的原理,然后带大家使用fpga来实现(c语言实现过程特别简单)。
二. pid算法
pid取自比例、积分、微分三个英文字母的首字母。意味着算法由这三部分组成。
1. p 比例
    运算过程为 期望值 减去 当前值 ,然后再乘上一个p系数,就得到了一个反馈值。比例的作用主要是为了让 期望值 与 当前值相等
2. i 积分
    将误差值不断累加,然后再乘上一个i系数,就得到了一个反馈值。积分的作用主要是为了消去静态误差,但当前值接近 期望值的时候,这个时候,比例的作用就非常小了,可能会接近于0,而且相邻两次的误差值也近似为0,d微分也起不了多大作用,假如这时候系统外部的阻力和pd反馈值抵消了,这个时候就需要不断的累加这个误差值来使当前值等于期望值
3. d 微分
    当前的误差值 减去 上一次运算的误差值,然后再乘上一个d系数,就得到了一个反馈值。微分的作用主要为了减少系统的震荡,在系统变化的方向上,施加一个反方向的反馈,使系统朝这个方向的变化得到抑制
可以到,pid算法主要涉及到三种运算: 加法,减法和乘法。这三种运行在fpga上也是很容易实现的。
三.  fpga实现
首先需要注意的是,pid的三个系数均为浮点数,为了便于实现,这里将浮点数扩大100倍,然后取整就可以了。然后将反馈的结果缩小100倍就可以了。
1. p 比例实现
    实现代码如下,只需要两个时钟周期即可完成。这里通过左移来实现缩小100操作,实际上是缩小了102.倍,不太会影响结果。为了和 i 积分 和 d 微分 运算周期数相同,这里打了一拍操作。
//p -------------------------------------------------always@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0)       kp_fb <= 1'b0;   else if( pid_en == 1'b1)       kp_fb <= ( desired_value - current_value ) * kp;   else       kp_fb <= kp_fb;endalways@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0)       kp_fb_reduce > 7) + (kp_fb >>> 9); // /102.4   else       kp_fb_reduce <= kp_fb_reduce;endalways@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0)       kp_fb_reduce_d0 <= 'd0;   else if( cal_delay_1 == 1'b1)       kp_fb_reduce_d0 <= kp_fb_reduce;   else       kp_fb_reduce_d0 $signed('d0) )           ki_integral <= ki_integral;       else if( ki_integral < $signed(-'d3000) && ( desired_value - current_value ) < $signed('d0) )           ki_integral <= ki_integral;       else           ki_integral <= ki_integral + ( desired_value - current_value );   else       ki_integral <= ki_integral;endalways@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0 )       ki_fb <= 'd0;   else if( cal_delay_1 == 1'b1 )       ki_fb <= ki_integral * ki;   else       ki_fb <= ki_fb;endalways@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0 )       ki_fb_reduce > 7) + (ki_fb >>> 9); // /102.4   else       ki_fb_reduce <= ki_fb_reduce;end//-------------------------------------------------------------------  
代码片段:可切换语言,无法单独设置文字格式
3. d微分 实现
    d 微分操作实现如下,按照公式来即可
//d    ---------------------------always@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0)       kd_error <= 'd0;   else if( pid_en == 1'b1)       kd_error <= ( desired_value - current_value );   else       kd_error <= kd_error;endalways@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0)       kd_fb <= 'd0;   else if( cal_delay_0 == 1'b1)       kd_fb <= (kd_error - kd_last_error) * kd;   else       kd_fb <= kd_fb;endalways@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0)       kd_last_error <= 'd0;   else if( cal_delay_0 == 1'b1)       kd_last_error <= kd_error;   else       kd_last_error <= kd_last_error;endalways@(posedge clk or negedge rst_n)begin   if( rst_n == 1'b0)       kd_fb_reduce > 7) + (kd_fb >>> 9); // /102.4   else       kd_fb_reduce <= kd_fb_reduce;end//--------------------------------  
代码片段:可切换语言,无法单独设置文字格式
四. 仿真验证
测试代码如下,初始化当前值为500,然后根据期望值和pid输出的反馈值,来调节当前值。
always@(posedge clk or negedge rst_n) begin       if( rst_n == 1'b0)           current_value <= 'd500;       else if( pid_ack == 1'b1)           current_value <= current_value + out;       else           current_value <= current_value;   endpid_control pid_control_i(   .clk            (   clk),   .rst_n          (   rst_n),  .pid_en          (   1'b1),  .pid_ack         (   pid_ack),   .desired_value  (   desired_value),   .current_value  (   current_value),   .kp             (   'd10),   .ki             (   'd1),   .kd             (   'd10),     .out            (   out));  
代码片段:可切换语言,无法单独设置文字格式
仿真波形如下
这个是设置了d为0的情况,可以看到系统的震荡


多晶硅及其他光电转换材料
三千万个树莓派单板电脑售出,第一代是七年前
创鑫互联服务机器人实测:视、音AI双赋能,服务更人性化
RFID医疗器械如何自动化消毒
遥控器集成检测系统检测CAN总线遥控器操作过程简介
PID控制算法代码 PID控制算法的原理
电机控制模块是否更精准,其发展趋势如何
Bosch将关停Akustica子公司
日本推出GPS自驾联合收割机,可自动化作业,极大的提升了农业效率
新思科技携手三星加快3nm节点设计的收敛和签核
NVIDIA Maxine视频效果SDK帮助解决视频质量问题
NIDays携手NI共创物联时代
研华嵌入式宝藏新品大揭秘!
风向风速仪是什么,它的工作原理是怎样的
高温投入式液位计的原理
我国制造业GDP比重与美英日德等国相比呈现出过早过快下降特征
安全光幕是什么,安全光幕的工作原理介绍
解读ADC采样芯片(EV10AQ190A)的采样(工作)模式(双通道模式)
两分钟让你了解是什么限制了区块链技术的应用
EBA电子控制制动辅助系统的解析和使用方法