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 -------------------------------------------------
  -*------------------------------------------------ ------------------*/
  
  
  

猜你喜欢

转载自kbk325pw.iteye.com/blog/1359427
C51