注册 登录
查看: 10655|回复: 80

[其他] 通俗易懂学PID

  [复制链接]
发表于 2015-1-28 00:04:38 | 显示全部楼层 |阅读模式
    很多同学都不清楚 PID 是个什么东西,因为很多不是自动化的学生。他们开口就要资料,要程序。这是明显的学习方法不对,起码,首先,你要理解 PID 是个什么东西。 本文以通俗的理解,以小车纵向控制举例说明 PID 的一些理解。 首先,为什么要做 PID?由于外界原因,小车的实际速度有时不稳定,这是其一,要让小车以最快的时间达达到既定的目标速度,这是其二。速度控制系统是闭环,才能满足整个系统的稳定要求,必竟速度是系统参数之一,这是其三.

    小车调速肯定不是线性的,外界因素那么多,没人能证明是线性的。如果是线性的,直接用 P 就可以了。比如在 PWM=60%时,速度是2M/S,那么你要它3M/S,就把 PWM 提高到90%。因为90/60=3/2,这样一来太完美了。完美是不可能的。

    那么不是线性的,要怎么怎么控制 PWM 使速度达到即定的速度呢?即要快,又要准,又要狠。(即快准狠)系统这个速度的调整过程就必须通过某个算法调整,一般 PID 就是这个所用的算法。

    可能你会想到,如果通过编码器测得现在的速度是2.0m/s,要达到2.3m/s 的速度,那么我把 pwm 增大一点不就行了吗?是的,增大 pwm 多少呢?必须要通过算法,因为 PWM和速度是个什么关系,对于整个系统来说,谁也不知道。要一点一点的试,加个1%,不够,再加1%还是不够,那么第三次你还会加1%吗?很有可能就加2%了。通过 PID 三个参数得到一个表达式:
△PWM = a* △V1 + b*△ V2 + c*△V3,a b c 是通过 PID 的那个长长的公式展开,然后约简后的数字,△1,△2,△3  此前第一次调整后的速度差  ,第二次调整后的速度差,第三次。。。。。一句话,PID 要使当前速度达到目标速度最快,需要建立如何调整 pwm 和速度之间的关系

输入输出是什么:
输入就是前次速度,前前次速度,前前前次速度。
输出就是你的 PWM 应该增加或减小多少。

           为了避免教科书公式化的说明,本文用口语化和通俗的语言描述。虽然不一定恰当,但意思差不多,就是那个事。如果要彻头彻尾地弄 PID,建议多调试,写几个仿真程序。
          PID 一般有两种:位置式 PID 和增量式 PID。在小车里一般用增量式,为什么呢?          位置式 PID 的输出与过去的所有状态有关,计算时要对 e(每一次的控制误差)进行累加,这个计算量非常大,而且没有必要。
           而且小车的 PID 控制器的输出并不是绝对数值,而是一个△,代表增多少,减多少。 换句话说,通过增量 PID 算法,每次输出是 PWM 要增加多少或者减小多少,而不是 PWM 的实际值。

          下面均以增量式 PID 说明。
  这里再说一下 P、I、D 三个参数的作用。P=Proportion,比例的意思,I 是 Integral,积分,D 是 Differential 微分。
打个比方,如果现在的输出是1,目标输出是100,那么 P 的作用是以最快的速度达到100,把 P 理解为一个系数即可;而 I 呢?大家学过高数的,0的积分才能是一个常数,I 就是使误差为0而起调和作用;D 呢?大家都知道微分是求导数,导数代表切线是吧,切线的方向就是最快到至高点的方向。这样理解,最快获得最优解,那么微分就是加快调节过程的作用了。
公式 本来需要推导 的,我就不 来这一套了。 直接贴出来 :


看看最后的结果:
△Uk=A*e(k)+B*e(k-1)+C*e(k-2)
这里 KP 是 P 的值,TD 是 D 的值,1/Ti 是 I 的值,都是常数,哦,还有一个 T,T 是采样周期,也是已知。而 A B C 是由 P I D 换算来的,按这个公式,就可以简化计算量了,因为 P I D 是常数,那
么 A  B  C 可以用一个宏表示。这样看来,只需要求 e(k) e(k-1) e(k-2)就可以知道△Uk 的值了,按照△Uk 来调节 PWM 的大小就OK 了。PID 三个参数的确定有很多方法,不在本文讨论范围内。
采样周期也是有据可依的,不能太大,也不能太小。
   ........................
   ........................

PID 实际编程的过程的,要注意的东西还是有几点的。PID 这东西可以做得很深。
1   PID 的诊定。凑试法,临界比例法,经验法。
2   T 的确定,采样周期应远小于过程的扰动信号的周期,在小车程序中一般是 ms 级别。
3   目标速度何时赋值问题,如何更新新的目标速度?这个问题一般的人都乎略了。目标速度肯定不是个恒定的,那么何时改变目标速度呢?
4    改变了目标速度,那么 e(k) e(k-1) e(k-2)怎么改变呢?是赋 0 还是要怎么变?
5    是不是 PID 要一直开着?
6   error 为多少时就可以当速度已达到目标?
7    PID 的优先级怎么处理,如果和图像采集有冲突怎么办?
8    PID 的输入是速度,输出是 PWM,按理说 PWM 产生速度,但二者不是同一个东西,有没有问题?
9    PID 计算如何优化其速度?指针,汇编,移位?都可以试!



  1. //*****************************************************
  2. //定义 PID 结构体
  3. //*****************************************************
  4. typedef struct PID   
  5. {   
  6.         int SetPoint; //设定目标  Desired Value   
  7.         double Proportion; //比例常数  Proportional Const   
  8.         double Integral; //积分常数  Integral Const   
  9.         double Derivative; //微分常数  Derivative Const   
  10.       int LastError; //Error[-1]   
  11.         int PrevError; //Error[-2]   
  12. } PID;
  13. //*****************************************************
  14. //定义相关宏
  15. //*****************************************************
  16. #define P_DATA 100
  17. #define I_DATA    0.6
  18. #define D_DATA    1 #define HAVE_NEW_VELOCITY 0X01
  19. //*****************************************************
  20. //声明 PID 实体
  21. //*****************************************************
  22. static PID sPID;   
  23. static PID *sptr = &sPID;   
  24. //*****************************************************
  25. //PID 参数初始化
  26. //*****************************************************
  27. void IncPIDInit(void)   
  28. {   
  29. sptr->LastError = 0; //Error[-1]   
  30. sptr->PrevError = 0; //Error[-2]   
  31. sptr->Proportion = P_DATA; //比例常数  Proportional Const   
  32. sptr->Integral = I_DATA; //积分常数 Integral Const   
  33. sptr->Derivative = D_DATA; //微分常数  Derivative Const   
  34. sptr->SetPoint =100;    目标是 100
  35. }
  36. //*****************************************************
  37. //增量式 PID 控制设计   
  38. //*****************************************************
  39. int IncPIDCalc(int NextPoint)   
  40. {   
  41.       int iError, iIncpid; //当前误差   
  42.       iError = sptr->SetPoint - NextPoint; //增量计算   
  43.       iIncpid = sptr->Proportion * iError //E[k]项   
  44.                           - sptr->Integral * sptr->LastError //E[k-1]项   
  45.                           + sptr->Derivative * sptr->PrevError; //E[k-2]项   
  46.         sptr->PrevError = sptr->LastError;      //存储误差,用于下次计算   
  47.         sptr->LastError = iError;   
  48.         return(iIncpid);                                                    //返回增量值   
  49. }
  50. Int g_CurrentVelocity;
  51. Int g_Flag;
  52. void main(void)
  53. {
  54.         DisableInterrupt
  55. InitMCu();   
  56.         IncPIDInit();
  57. g_CurrentVelocity=0;      //全局变量也初始化
  58. g_Flag=0;                                //全局变量也初始化
  59. EnableInterrupt;
  60.         While(1)
  61. {       if (g_Flag& HAVE_NEW_VELOCITY)
  62.             {
  63.                     PWMOUT+= IncPIDCalc(CurrentVelocity);
  64.                         g_Flag&=~ HAVE_NEW_VELOCITY;
  65. }
  66. }
  67. }
  68. //****************************************
  69. //采样周期 T
  70. //****************************************
  71. Interrrupt TIME void
  72. {
  73.       CurrentVelocity =GetCurrentVelocity;
  74.       g_Flag|= HAVE_NEW_VELOCITY;
  75. }


本帖子中包含更多资源

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

x

评分

参与人数 4互助 +8 收起 理由
642451882 + 2
suyonga + 2 很给力!
旋风小豪 + 2 很给力!
仰逸致 + 2 很给力!

查看全部评分

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2015-1-28 00:41:04 | 显示全部楼层
好帖!

CMSIS 库里面已经有了 PID 的控制算法代码,我也贴上来汇总一下:
结构体:
  1.   /**
  2.    * @brief Instance structure for the floating-point PID Control.
  3.    */
  4.   typedef struct
  5.   {
  6.     float32_t A0;          /**< The derived gain, A0 = Kp + Ki + Kd . */
  7.     float32_t A1;          /**< The derived gain, A1 = -Kp - 2Kd. */
  8.     float32_t A2;          /**< The derived gain, A2 = Kd . */
  9.     float32_t state[3];    /**< The state array of length 3. */
  10.     float32_t Kp;               /**< The proportional gain. */
  11.     float32_t Ki;               /**< The integral gain. */
  12.     float32_t Kd;               /**< The derivative gain. */
  13.   } arm_pid_instance_f32;

PID初始化函数
  1.   /**
  2.    * @brief  Initialization function for the floating-point PID Control.
  3.    * @param[in,out] *S      points to an instance of the PID structure.
  4.    * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.
  5.    * @return none.
  6.    */
  7.   void arm_pid_init_f32(
  8.   arm_pid_instance_f32 * S,
  9.   int32_t resetStateFlag);

PID复位函数
  1.   /**
  2.    * @brief  Reset function for the floating-point PID Control.
  3.    * @param[in,out] *S is an instance of the floating-point PID Control structure
  4.    * @return none
  5.    */
  6.   void arm_pid_reset_f32(
  7.   arm_pid_instance_f32 * S);



PID计算函数
  1. /**
  2.    * @brief  Process function for the floating-point PID Control.
  3.    * @param[in,out] *S is an instance of the floating-point PID Control structure
  4.    * @param[in] in input sample to process
  5.    * @return out processed output sample.
  6.    */


  7.   static __INLINE float32_t arm_pid_f32(
  8.   arm_pid_instance_f32 * S,
  9.   float32_t in)
  10.   {
  11.     float32_t out;

  12.     /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]  */
  13.     out = (S->A0 * in) +
  14.       (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]);

  15.     /* Update state */
  16.     S->state[1] = S->state[0];
  17.     S->state[0] = in;
  18.     S->state[2] = out;

  19.     /* return to application */
  20.     return (out);

  21.   }

上面列举的是浮点PID,实际上CMSIS库还有整型的PID,自己看看即可。

关于CMSIS 库的PID说明,可以看英文版的介绍:
  1.   /**
  2.    * @defgroup PID PID Motor Control
  3.    *
  4.    * A Proportional Integral Derivative (PID) controller is a generic feedback control
  5.    * loop mechanism widely used in industrial control systems.
  6.    * A PID controller is the most commonly used type of feedback controller.
  7.    *
  8.    * This set of functions implements (PID) controllers
  9.    * for Q15, Q31, and floating-point data types.  The functions operate on a single sample
  10.    * of data and each call to the function returns a single processed value.
  11.    * <code>S</code> points to an instance of the PID control data structure.  <code>in</code>
  12.    * is the input sample value. The functions return the output value.
  13.    *
  14.    * \par Algorithm:
  15.    * <pre>
  16.    *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
  17.    *    A0 = Kp + Ki + Kd
  18.    *    A1 = (-Kp ) - (2 * Kd )
  19.    *    A2 = Kd  </pre>
  20.    *
  21.    * \par
  22.    * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant
  23.    *
  24.    * \par
  25.    * \image html PID.gif "Proportional Integral Derivative Controller"
  26.    *
  27.    * \par
  28.    * The PID controller calculates an "error" value as the difference between
  29.    * the measured output and the reference input.
  30.    * The controller attempts to minimize the error by adjusting the process control inputs.
  31.    * The proportional value determines the reaction to the current error,
  32.    * the integral value determines the reaction based on the sum of recent errors,
  33.    * and the derivative value determines the reaction based on the rate at which the error has been changing.
  34.    *
  35.    * \par Instance Structure
  36.    * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure.
  37.    * A separate instance structure must be defined for each PID Controller.
  38.    * There are separate instance structure declarations for each of the 3 supported data types.
  39.    *
  40.    * \par Reset Functions
  41.    * There is also an associated reset function for each data type which clears the state array.
  42.    *
  43.    * \par Initialization Functions
  44.    * There is also an associated initialization function for each data type.
  45.    * The initialization function performs the following operations:
  46.    * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains.
  47.    * - Zeros out the values in the state buffer.
  48.    *
  49.    * \par
  50.    * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.
  51.    *
  52.    * \par Fixed-Point Behavior
  53.    * Care must be taken when using the fixed-point versions of the PID Controller functions.
  54.    * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.
  55.    * Refer to the function specific documentation below for usage guidelines.
  56.    */




点评

山外哥现真身了?  发表于 2016-1-18 22:05
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2015-1-28 00:36:45 | 显示全部楼层
PID实指“比例proportional”、“积分integral”、“微分derivative” , 这三项构成PID基本要素。每一项完成不同任务对系统功能产生不同的影响。 搞软件的往往对硬件不屑 ,却忘了软件再牛B也是为硬件服务的 , PID的数字化算法就完全是为硬件而生的 , 这是控制电机算法的一个难点 , 没有一定的对软硬件的理解 , 就连调试装定PID参数都会很为难 ! 飞思卡尔智能车项目里面就会用到PID算法 , 比如车爬坡和平地连续拐弯时 , 代码里面没有PID算法 , 控制和驱动起来就会很拙急 , 对不对 ? 不过 ,搞清楚问题还是有个前提的 , 那就是懂点微积分 , 不会微积分嘛 , 下面的内容无需关注  

实际上 , PID算法的应用基础始于对PCB板上的运放的PID参数进行调校 , P对应于运放增益  ; I 就是运放输入和输出端之间接一个电容引入反馈 , 就是控制器的输出与输入误差会积累起来影响输出 ;  D 就是运放输入端串接一个电容 ,起的微分作用是阻止输出与输入误差的变化 .  结合示波器来观察控制电机的PID参数设定的话 , 网上有一首诗 , 它就代表我的心声了 :

参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢,微分时间应加长
理想曲线两个波,前高后低四比一
一看二调多分析,调节质量不会低 !

下面贴段代码 (真的是仅供参考):
  1. #include <mc9s12dg128.h> /* derivative information */

  2. /*

  3. ***********************************************************************************

  4. * 宏定义

  5. **********************************************************************************/

  6. #define STABMAX 50

  7. #define SENSORNUM 8

  8. #define SAMPLETIMES 5

  9. /*

  10. ***********************************************************************************

  11. * FUNCTION PROTOTYPES

  12. **********************************************************************************/

  13. int CalculateP(void);

  14. float CalculatePID(void);

  15. /********************************** PID控制程序 ********************************/

  16. struct CARSTATE

  17. {

  18. int E0;

  19. int E1;

  20. int E2;

  21. int E3;

  22. float Integral;

  23. }CarState;

  24. /*

  25. ***********************************************************************************

  26. * 初始化PID参数

  27. **********************************************************************************/

  28. void Init_PID()

  29. {

  30. CarState.E0 = 0;

  31. CarState.E1 = 0;

  32. CarState.E2 = 0;

  33. CarState.E3 = 0;

  34. CarState.Integral = 0;

  35. }

  36. /*

  37. **********************************************************************************

  38. * 信号处理函数

  39. *

  40. * 程序描述: 对传感器采集过来的数据进行处理,得到一些基本的计算参数

  41. *

  42. **********************************************************************************/

  43. int SignalProcess( unsigned int signal )

  44. {

  45. const int BitValue[8] = {43,26,12,6,-6,-12,-26,-43}; //MAX:28

  46. int i,CurrPoint=0,LastPoint=0,BitNum=0;

  47. unsigned char SignalBit[8];

  48. for(i=0;i<8;i++)

  49. {

  50. SignalBit = signal & 0x0001;

  51. BitNum += SignalBit;

  52. signal >>= 1;

  53. }

  54. switch(BitNum)

  55. {

  56. case 1:

  57. for(i=0;i<8;i++)

  58. if(SignalBit != 0)

  59. CurrPoint += BitValue;

  60. CarState.E0 = CurrPoint;

  61. break;

  62. case 2:

  63. for(i=0;i<8;i++)

  64. if(SignalBit != 0)

  65. CurrPoint += BitValue;

  66. CurrPoint >>= 1;

  67. CarState.E0 = CurrPoint;

  68. break;

  69. default:

  70. CarState.E0 = CarState.E1;

  71. break;

  72. }

  73. return CalculateP()*100;

  74. }

  75. /*

  76. **********************************************************************************

  77. *

  78. * PID计算函数

  79. *

  80. * 程序描述: 计算P参数

  81. *

  82. **********************************************************************************/

  83. int CalculateP(void)

  84. {

  85. CarState.E1 = CarState.E0;

  86. return((int)CarState.E0);

  87. }



  88. /*

  89. ***********************************************************************************

  90. * PID计算函数

  91. *

  92. * 程序描述: 对传感器采集过来的数据进行处理,得到一些基本的计算参数

  93. *
  94. ******************************************************************* ***************/

  95. float CalculatePID(void)

  96. {

  97. float P, I = 0, D;

  98. /* parameter const */

  99. float Kp = 1.0, Ki = -0.0002, Kd = -0.0002;

  100. /* P parameter */

  101. P = CarState.E0 * Kp;

  102. /* I parameter */

  103. if(P+I<2)

  104. {

  105. CarState.Integral += Ki * CarState.E0;

  106. I = CarState.Integral;

  107. }

  108. /* D parameter */

  109. D = Kd * ( CarState.E0 + 3*CarState.E1 - 3*CarState.E2 - CarState.E3 )/6.0;

  110. CarState.E3 = CarState.E2;

  111. CarState.E2 = CarState.E1;

  112. CarState.E1 = CarState.E0;

  113. return (P+I+D);

  114. }

回复 支持 1 反对 0

使用道具 举报

发表于 2015-1-28 09:19:03 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2015-1-28 09:42:42 | 显示全部楼层
学习了~拜谢楼主,拜谢山外大大~
回复 支持 反对

使用道具 举报

发表于 2015-1-28 14:11:39 | 显示全部楼层
好贴
回复 支持 反对

使用道具 举报

发表于 2015-1-28 14:53:56 | 显示全部楼层
好东西啊,顶~~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2015-1-29 12:23:15 | 显示全部楼层
                                                     
回复 支持 反对

使用道具 举报

发表于 2015-1-29 14:53:41 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

发表于 2015-1-29 15:09:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2015-1-29 16:51:42 | 显示全部楼层
好贴
回复 支持 反对

使用道具 举报

发表于 2015-1-29 17:29:37 | 显示全部楼层
支持一下!
回复 支持 反对

使用道具 举报

发表于 2015-1-29 19:58:31 | 显示全部楼层
楼主好人,作为一名自动化相关专业的学生,虽然学过自控,还是在此有收获
回复 支持 反对

使用道具 举报

发表于 2015-1-30 15:35:46 | 显示全部楼层
好贴,帮顶,
回复 支持 反对

使用道具 举报

发表于 2015-1-30 19:53:33 | 显示全部楼层
此贴已超神!
回复 支持 反对

使用道具 举报

发表于 2015-2-2 12:05:59 | 显示全部楼层
pitceixbuj 发表于 2015-1-28 00:36
PID实指“比例proportional”、“积分integral”、“微分derivative” , 这三项构成PID基本要素。每一项完 ...

曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢,微分时间应加长


LZ能不能解释一下?
振荡频繁和频率快、、回复慢和周期长怎么区分
感觉都是一样的意思
谢谢LZ,求解
回复 支持 反对

使用道具 举报

发表于 2015-2-9 08:16:20 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2015-2-25 09:50:32 | 显示全部楼层
这真是好贴,先收藏了,顶!
回复 支持 反对

使用道具 举报

发表于 2015-2-28 10:36:33 | 显示全部楼层
菜鸟还处于看不懂得阶段。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2015-3-4 23:56:45 | 显示全部楼层
好贴,学习了。
回复 支持 反对

使用道具 举报

发表于 2015-3-8 10:08:19 | 显示全部楼层
好帖
回复 支持 反对

使用道具 举报

发表于 2015-3-10 19:32:45 | 显示全部楼层
学习
回复 支持 反对

使用道具 举报

发表于 2015-3-10 20:00:22 | 显示全部楼层

回复 支持 反对

使用道具 举报

发表于 2015-3-11 22:20:13 | 显示全部楼层
不错不错,顶一下!
回复 支持 反对

使用道具 举报

发表于 2015-3-20 20:20:20 | 显示全部楼层
楼主厉害、、、
回复 支持 反对

使用道具 举报

发表于 2015-3-29 20:41:27 | 显示全部楼层
真是好贴,学习了!  真心感谢楼主!
回复 支持 反对

使用道具 举报

发表于 2015-4-10 10:28:58 | 显示全部楼层
dingding
回复 支持 反对

使用道具 举报

发表于 2015-4-12 20:25:56 | 显示全部楼层
相当nice
回复 支持 反对

使用道具 举报

发表于 2015-4-17 09:43:25 | 显示全部楼层
66666666666666666
回复 支持 反对

使用道具 举报

发表于 2015-4-19 21:33:17 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2015-4-29 10:06:19 | 显示全部楼层
好帖,精华,受教了
回复 支持 反对

使用道具 举报

发表于 2015-5-3 15:07:44 | 显示全部楼层
好贴,受教了。
回复 支持 反对

使用道具 举报

发表于 2015-5-9 14:23:55 | 显示全部楼层
山外メ雲ジ 发表于 2015-1-28 00:41
好帖!

CMSIS 库里面已经有了 PID 的控制算法代码,我也贴上来汇总一下:

山外哥,kl26也可以调用PID此库吧,如果不调用,也可以自己定义吧
回复 支持 反对

使用道具 举报

发表于 2015-5-9 14:25:09 | 显示全部楼层
CSW孤狼 发表于 2015-5-9 14:23
山外哥,kl26也可以调用PID此库吧,如果不调用,也可以自己定义吧


来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-5-10 11:36:27 | 显示全部楼层
CSW孤狼 发表于 2015-5-9 14:23
山外哥,kl26也可以调用PID此库吧,如果不调用,也可以自己定义吧

pid是纯软件算法。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-5-10 14:38:19 | 显示全部楼层
山外メ雲ジ 发表于 2015-1-28 00:41
好帖!

CMSIS 库里面已经有了 PID 的控制算法代码,我也贴上来汇总一下:

山外哥,这个是电机控制库函数,舵机同理用这个??
回复 支持 反对

使用道具 举报

发表于 2015-5-10 14:39:13 | 显示全部楼层

哦哦,了解,谢谢你
回复 支持 反对

使用道具 举报

发表于 2015-5-11 17:34:26 | 显示全部楼层
三外哥,你说CMSIS 库里面已经有了 PID 的控制算法代码,我这可能用的是老库,里面没有,能不能给我发一个(只发pid控制算法就行)
回复 支持 反对

使用道具 举报

发表于 2015-5-12 22:30:39 | 显示全部楼层
顶起~
回复 支持 反对

使用道具 举报

发表于 2015-5-13 22:14:22 | 显示全部楼层
支持一个
回复 支持 反对

使用道具 举报

发表于 2015-5-20 20:03:15 | 显示全部楼层
黑夜里的一盏明灯

回复 支持 反对

使用道具 举报

发表于 2015-5-24 17:23:35 | 显示全部楼层
精品啊!!!受教了!
回复 支持 反对

使用道具 举报

发表于 2015-6-10 01:42:33 | 显示全部楼层
顶好帖
回复 支持 反对

使用道具 举报

发表于 2015-6-16 10:46:33 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

发表于 2015-7-4 23:18:45 | 显示全部楼层
感谢辛勤付出的山外哥,谢谢!受益匪浅
回复 支持 反对

使用道具 举报

发表于 2015-8-1 17:27:23 | 显示全部楼层
受教
回复 支持 反对

使用道具 举报

发表于 2015-8-3 11:44:07 | 显示全部楼层
都是神人呀                        
回复 支持 反对

使用道具 举报

发表于 2015-10-6 21:24:59 | 显示全部楼层
好帖!!!!!!
回复 支持 反对

使用道具 举报

发表于 2015-10-16 15:47:14 | 显示全部楼层
太感谢了,清晰易懂,顶!
回复 支持 反对

使用道具 举报

发表于 2015-10-19 10:19:59 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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