PID算法完全讲解-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: 对折之内

PID算法完全讲解

  [复制链接]
发表于 2015-5-22 15:49 | 显示全部楼层
你好,对折之内,我现在用Arduino uno做毕业设计,是通过点击控制太阳能板正反转。要求加入PID控制电机。Arduino 和PID都是初步接触,不是很熟,所以想请教一下。我是根据东西方向光敏电阻的分压值来控制转动方向的,我的PID的输入应该是两者之差吗?KP KI KD的值怎么确定啊?谢谢了
 楼主| 发表于 2015-5-23 09:09 | 显示全部楼层
咳咳咳 发表于 2015-5-22 15:49
你好,对折之内,我现在用Arduino uno做毕业设计,是通过点击控制太阳能板正反转。要求加入PID控制电机。Ar ...

哦,你只要理解PID是一个封闭的系统。你输入一个现在被控制量的值和希望被控制量变成的值,PID就会很智能得把你现在需要怎么做告诉你。因此,你用一个光敏电阻,并设定一个希望光敏电阻读入的值。当光敏电阻读入的值和你希望的值有偏差的时候,pid就会输入一个值,这个值会告诉你电机转多少。pid参数的调试,你百度吧,有很多的。
发表于 2015-8-7 11:09 | 显示全部楼层
请问楼主帖子中122行的代码起什么作用?
[mw_shl_code=c,true]       if(iTemp) iTemp--;      //只有iTemp>0,才有必要减“1”[/mw_shl_code]
发表于 2015-8-7 16:03 | 显示全部楼层
楼主厉害   不是理解很透彻无法举出这么形象的例子啊  支持楼主
发表于 2015-8-14 11:59 | 显示全部楼层
感谢楼主!学到了
发表于 2015-9-29 10:24 | 显示全部楼层
讲得非常好
发表于 2015-12-3 19:10 | 显示全部楼层
看了楼主的帖子受益良多
发表于 2015-12-3 19:11 | 显示全部楼层
看了这个帖子受益颇多
发表于 2015-12-17 12:06 | 显示全部楼层

        int rise,hold,fall;//PID算法控制升温降温
         rise = 0;
                hold = 0;
                fall = 0;
            if(AD_tem<set_tem)                      //如果板内温度小于设定温度,执行循环
                {       
                t=set_tem-AD_tem;                              
                           
                if(t>3*t_gate)                              //大幅调节
                        {
                    if(rise==0)                     
                                {
                        rise=1;                         //进行升温
                        hold=0;                             //系统不控温
                        tc_data=255;                            //标志位=255
                        DA_send(tc_data);           //??DAC????
                                }
                        }
                           
                else                                            //进行控温
                        {
                    if(hold==0)                     //???????????????
                                {
                        if(set_tem>=t_room)   
         //?????????????
                                        {
                            tc_data=dbasa;          //?????????????????????
                                        }
                        else                                        //???????????
                                        {
                            tc_data=dbasb;          //???????????????????
                                        }
                        hold=1;                             //??????????
                        rise=0;                             //???????????
                                }               
                    data_inc=1.0*(t-t_1)+1.5*t+3*(t-2*t_1+t_2);     //PID??????
                    tc_data=tc_data+data_inc;       //??DAC????
                    if(tc_data>255)  tc_data=255;   //??????????
                    if(tc_data<0)  tc_data=0;
                    DA_send(tc_data);               //??DAC????
                        }
                    }
   

            else                                            //????????????,????
                    {
                t=AD_tem-set_tem;                               //??????
                           
                if(t>3*t_gate)                              //???????????
                        {
                    if(fall==0)                                 //???????
                                {
                        fall=1;                         //?????????????
                        hold=0;                             //??????????
                        tc_data=0;                              //??DAC???0
                        DA_send(tc_data);           //??DAC????
                                }
                        }
                else                                            //?????????????
                        {
                    if(hold==0)                                     //??????
                                {
                        if(set_tem>=t_room)             //?????????????
                                        {
                            tc_data=dbasa;          //?????????????????????
                                        }
                        else                                        //???????????
                                        {
                            tc_data=dbasb;          //???????????????????
                                        }
                        hold=1;                             //??????????
                        fall=0;                             //???????????       
                                }
                               
                    t=-t;                                                   //???????
                    data_inc=1.0*(t-t_1)+1.5*t+3*(t-2*t_1+t_2);     //PID??????
                    tc_data=tc_data+data_inc;       //??DAC????
                    if(tc_data>255)  tc_data=255;   //??????????
                    if(tc_data<0)  tc_data=0;
                    DA_send(tc_data);               //??DAC????
                        }
                    }
            t_2=t_1;
            t_1=t;
            }
      
        
       }

  }
t_1 t_2初值都是零 能帮我看看吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:38 , Processed in 0.158512 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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