C51单片机的PID程序编写

发布时间:2023-09-06  

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

#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 -------------------------------------------------

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>