C51单片机的PID程序编写

控制/MCU

1877人已加入

描述

//主程序======================================================

#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 《 PID_MIN)

{

Control_new = PID_MIN;

}

}

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

-*------------------------------------------------------------------*/

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分