C51的PID程序

C51的PID程序
2011年12月22日
  //主程序================================================== ====
  #include "Main.h"
  #include "PID_f1.h"
  /* .................................................. ............. */
  /* .................................................. ............. */
  void main(void)
  {
  float x,y,z;
  while(1)
  {
  x = PID_Control(y,z);
  }
  }
  //PID子程序================================================== ===
  /*------------------------------------------------ ------------------*-
  PID_f1.C (v1.00)
  -------------------------------------------------- ----------------
  Simple PID control implementation.
  See Chapter 35 for details.
  COPYRIGHT
  ---------
  This code is from the book:
  PATTERNS FOR TIME-TRIGGERED EMBEDDED SYSTEMS by Michael J. Pont
  [Pearson Education, 2001; ISBN: 0-201-33138-1].
  This code is copyright (c) 2001 by Michael J. Pont.
  See book for copyright details and other information.
  -*------------------------------------------------ ------------------*/
  #include "PID_f1.h"
  // ------ Private constants ----------------------------------------
  #define PID_KP (0.2f) // Proportional gain
  #define PID_KI (0.01f) // Integral gain
  #define PID_KD (0.01f) // Differential gain
  #define PID_MAX (1.0f) // Maximum PID controller output
  #define PID_MIN (0.0f) // Minimum PID controller output
  // ------ Private variable definitions------------------------------
  static float Sum_G; // Integrator component
  static float Old_error_G; // Previous error value
  /*------------------------------------------------ ------------------*-
  PID_Control()
  Simple floating-point version.
  See text for details.
  -*------------------------------------------------ ------------------*/
  float PID_Control(float Error, float Control_old)
  {
  // Proportional term
  float Control_new = Control_old + (PID_KP * Error);
  // Integral term
  Sum_G += Error;
  Control_new += PID_KI * Sum_G;
  // Differential term
  Control_new += (PID_KD * SAMPLE_RATE * (Error - Old_error_G));
  // Control_new cannot exceed PID_MAX or fall below PID_MIN
  if (Control_new > PID_MAX)
  {
  Control_new = PID_MAX;
  }
  else
  {
  if (Control_new error value
  Old_error_G = Error;
  return Control_new;
  }
  /*------------------------------------------------ ------------------*-
  ---- END OF FILE -------------------------------------------------
  -*------------------------------------------------ ------------------*/
  //头文件Main.H============================================ =============
  /*------------------------------------------------ ------------------*-
  Main.H (v1.00)
  -------------------------------------------------- ----------------
  'Project Header' (see Chap 9) for project PID_f1 (see Chap 35)
  COPYRIGHT
  ---------
  This code is from the book:
  PATTERNS FOR TIME-TRIGGERED EMBEDDED SYSTEMS by Michael J. Pont
  [Pearson Education, 2001; ISBN: 0-201-33138-1].
  This code is copyright (c) 2001 by Michael J. Pont.
  See book for copyright details and other information.
  -*------------------------------------------------ ------------------*/
  #ifndef _MAIN_H
  #define _MAIN_H
  //------------------------------------------------ ------------------
  // WILL NEED TO EDIT THIS SECTION FOR EVERY PROJECT
  //------------------------------------------------ ------------------
  // Must include the appropriate microcontroller header file here
  #include
  // Include oscillator / chip details here
  // (essential if generic delays / timeouts are used)
  // -
  // Oscillator / resonator frequency (in Hz) e.g. (11059200UL)
  #define OSC_FREQ (12000000UL)
  // Number of oscillations per instruction (4, 6 or 12)
  // 12 - Original 8051 / 8052 and numerous modern versions
  // 6 - Various Infineon and Philips devices, etc.
  // 4 - Dallas, etc.
  //
  // Take care with Dallas devices
  // - Timers default to *12* osc ticks unless CKCON is modified
  // - If using generic code on a Dallas device, use 12 here
  #define OSC_PER_INST (12)
  //------------------------------------------------ ------------------
  // SHOULD NOT NEED TO EDIT THE SECTIONS BELOW
  //------------------------------------------------ ------------------
  typedef unsigned char tByte;
  typedef unsigned int tWord;
  typedef unsigned long tLong;
  // Misc #defines
  #ifndef TRUE
  #define FALSE 0
  #define TRUE (!FALSE)
  #endif
  #define RETURN_NORMAL (bit) 0
  #define RETURN_ERROR (bit) 1
  //------------------------------------------------ ------------------
  // Interrupts
  // - see Chapter 13.
  //------------------------------------------------ ------------------
  // Generic 8051/52 timer interrupts (used in most schedulers)
  #define INTERRUPT_Timer_0_Overflow 1
  #define INTERRUPT_Timer_1_Overflow 3
  #define INTERRUPT_Timer_2_Overflow 5
  // Additional interrupts (used in shared-clock schedulers)
  #define INTERRUPT_EXTERNAL_0 0
  #define INTERRUPT_EXTERNAL_1 2
  #define INTERRUPT_UART_Rx_Tx 4
  #define INTERRUPT_CAN_c515c 17
  //------------------------------------------------ ------------------
  // Error codes
  // - see Chapter 14.
  //------------------------------------------------ ------------------
  #define ERROR_SCH_TOO_MANY_TASKS (1)
  #define ERROR_SCH_CANNOT_DELETE_TASK (2)
  #define ERROR_SCH_WAITING_FOR_SLAVE_TO_ACK (3)
  #define ERROR_SCH_WAITING_FOR_START_COMMAND_FROM_MASTER (3)
  #define ERROR_SCH_ONE_OR_MORE_SLAVES_DID_NOT_START (4)
  #define ERROR_SCH_LOST_SLAVE (5)
  #define ERROR_SCH_CAN_BUS_ERROR (6)
  #define ERROR_I2C_WRITE_BYTE (10)
  #define ERROR_I2C_READ_BYTE (11)
  #define ERROR_I2C_WRITE_BYTE_AT24C64 (12)
  #define ERROR_I2C_READ_BYTE_AT24C64 (13)
  #define ERROR_I2C_DS1621 (14)
  #define ERROR_USART_TI (21)
  #define ERROR_USART_WRITE_CHAR (22)
  #define ERROR_SPI_EXCHANGE_BYTES_TIMEOUT (31)
  #define ERROR_SPI_X25_TIMEOUT (32)
  #define ERROR_SPI_MAX1110_TIMEOUT (33)
  #define ERROR_ADC_MAX150_TIMEOUT (44)
  #endif
  /*------------------------------------------------ ------------------*-
  ---- END OF FILE -------------------------------------------------
  -*------------------------------------------------ ------------------*/ //头文件 PID_f1.H
  // ------ Public function prototypes -------------------------------
  float PID_Control(float,float);
  // ------ Public constants -----------------------------------------
  #define SAMPLE_RATE (1) // Hz
  /*------------------------------------------------ ------------------*-
  ---- END OF FILE -------------------------------------------------
  -*------------------------------------------------ ------------------*/
  
  
  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值