访问电脑版页面

导航:老古开发网手机版51单片机

C51单片机的PID程序编写

导读:
关键字:
PID程序,C51单片机,

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

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

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

来源:工程师周亮   作者:lhl545545  2018/12/4 14:53:00
栏目: [ 51单片机]

相关阅读

学C51的基础 11《 枚 举(enum) 》作者[cmh]©

16X2字符型液晶显示模块的驱动

C51怎样在绝对地址定义变量呢?  

AT89S52的中文简介

pdata型变量是如何分页的,如果我想把pdata型变量定义到eram的>256字节的高地址,怎样用P2口输入地址

有关单片机ALE引脚的问题

c51单片机实用通信协议

51内核8位单片机MAX7651的开发环境

学C51的基础 8 《 控制流程语句 》 作者[cmh]©

数字温度传感器DS18B20的原理与应用

51单片机与PC机通信的设计

51单片机常见的7种时钟电路介绍

51单片机自然优先级与中断服务入口地址的设置

volatile的作用是什么 作者[hudaidai]©

AT89C51单片机与74LS164动态显示接口

51单片机实现显示器显示日历与时钟和温度的设计

学C51的基础4 《 变 量 》 作者[cmh]©

学C51的基础5《 运算符 》 作者[cmh]©

linux环境下如何开发51单片机 基于codeblocks和SDCC

如何利用MCS-51单片机对周期波频率进行测量