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

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


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

相关文章

    如何创建51单片机KEIL工程步骤;1. 什么是Keil软件 Keil软件是一款专为嵌入式系统开发而设计的集成开发环境(IDE),常用于51、STM32单片机软件开发的编程软件。Keil编程......
    进行集成,提供一系列的库和工具,方便开发者进行快速开发和调试。 以上是STM32单片机编程中常用的一些语言和工具,开发者可以根据具体应用需求选择适合自己的编程方式。 STM32单片机编程的工作原理可以简单地分为以下几个步骤......
    语言和编译指令系统等方面对51单片机编译指令系统进行详细介绍。 1. 编译原理 编译指令系统是一种将高级语言转换为机器指令的过程。在编译指令系统中,编译器将源代码文件转换为目标代码文件,这个过程通常被称为编译。编译过程主要包括以下几个步骤......
    是怎么记住这么多代码格式的?而且错了一个标点符号,整个程序都会有影响。 一个程序几千行,错一个标点符号都不行这也太难了吧? 带着新手的灵魂拷问,作为从业单片机编程10年的开发者,我来为大家拨开云雾。 看完以后你就会明白,其实......
    上;开发板用来运行单片机程序,验证实际效果;视频教程就是手把手教你单片机开发环境的使用、单片机编程和调试。 对于单片机初学者来说,视频教程必须看,尤其是网上的单片机教材,学了之后,面对真正的单片机......
    单片机是什么?单片机编程怎么入门?;我不是电子专业毕业,后面是通过自学的单片机进入了这个行业。 当初我和很多人一样,不知道单片机是什么。 网上搜集了一些资料,说的太学术化,看的云里雾里。 今天......
    盘点那些常见的单片机编程框架!;随着科技的不断发展,单片机已经广泛应用于各种各样的领域。而随着单片机编程的需求越来越大,编程框架也变得越来越重要。本文将为大家盘点常见的单片机编程框架。 1......
    很多人说单片机很简单,有些本专业学生为什么学起来这么吃力?;在网上看到这么一个话题,自己特别有感触,不自觉的想写一下自己的看法。 单片机编程,我们的教材是《单片机原理及应用》。 当时我们的很多同学都觉得单片......
    一个月可以学会单片机嘛?单片机编程学多久?;这个是大家非常关心的话题,我们有些小伙伴以及周边想学单片机开发的朋友,都会咨询我,学会单片机大概要多久? 老郭出了一套经典的“十天征服单片机”教程,相信......
    开发环境的使用、单片机编程和调试。 对于单片机初学者来说,视频教程必须看,要不然,哪怕把教材看了几遍,还是不知道如何下手,尤其是院校里的单片机教材,学了之后,面对真正的单片机时可能还是束手无策;单片机......

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

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

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

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

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

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

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