C51的PID程序

发布者:skyhcg最新更新时间:2016-11-16 来源: eefocus关键字:C51  PID程序 手机看文章 扫描二维码
随时随地手机看文章

//主程序======================================================
#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 -------------------------------------------------
-*------------------------------------------------------------------*/


关键字:C51  PID程序 引用地址:C51的PID程序

上一篇:C51+CH375读U盘实例
下一篇:STC12C5608AD测脉冲宽度

推荐阅读最新更新时间:2024-03-16 15:20

C51自学笔记】LCD1602
LCD1602: (16*2字符 A:当前显示 B:当前无法显示 初始化: #include reg52.h #define uchar unsigned char #define uint unsigned int sbit rs=P2^4; sbit rw=P2^5; sbit e=P2^6; uchar table1 = www.tlxmcu.com ; uchar table2 = LCD1602 test ok! ; //************************************************ //延时函数,在12MHz的晶振频率下 //大约50us的
[单片机]
【<font color='red'>C51</font>自学笔记】LCD1602
LCD1602+ADC0832数字电压表(asm/c51
..................................LCD1602+ADC0832数字电压表(已调试通过 )................................. rs bit P2.4 rw bit P2.5 e bit P2.6 clk bit P1.3 do bit P1.4 di bit P1.5 cs bit P1.6 com data 60h dat data 61h adcb data 62h adcs data 63h adcg data 64h adc data 65h chx data 66h org 0000h sjmp main org 0030h main:mov sp
[单片机]
LCD1602+ADC0832数字电压表(asm/<font color='red'>c51</font>)
关于C51中“大小端存储”问题的详解
1. Little-Endian(小端存储),即将低字节的数据存储于低地址中,Big-Endian(大端存储)反之。 2. 小端存储称为Intel模式,大端存储称为Motorola模式。 3. C51中LCALL指令将下一指令的执行地址压入堆栈中(堆栈地址由低向高增长),先存入低字节地址,再存入高字节地址,亦即使用“小端模式(Intel模式)”;除此之外,C51中的其它指令和数据,均使用“大端模式(Motorola模式)”。 The 8051 is an 8-bit machine and has no instructions for directly manipulating data objects that a
[单片机]
如何用C51实现单片机和PLC之间通讯的实例
1、 HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。 它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机 作为其核心控制器,以实现实时快速处理。PLC和单片机结合不仅可以提PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。 2、Modbus通讯协议 Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。 Mo
[单片机]
如何用<font color='red'>C51</font>实现单片机和PLC之间通讯的实例
keil c51中定义XDATA,CODE等类型的结构体方法
定义CODE型: typedef struct MenuItem { int i; unsigned char j; }code _MenuItem; //数据存放于FLASH中 定义XDATA型: typedef struct MenuItem { int i; unsigned char j; }xdata _MenuItem; //数据存放在外部RAM中 使用示例: _MenuItem m0_main ; //定义一个_MenuItem 类型的结构体数组
[单片机]
KEIL C51程序中如何嵌入汇编
模块内接口: 使用如下标志符: asm 汇编语句 endasm 注意:如果在程序中使用了,注意在Keil编译器中需要激活Properties中的 “Generate Assembler File” 和“Assembler File ”两个选项 1、把 xx.c 加入工程中,右击 xx.c 选择“options for file xx.c 选择 “Generate Assembler File”和“Assemble SRC File”打上黑勾有效; 2、根据选择的编译模式,把相应的库文件象加 xx.c 一 样加入工程中并放在 xx.c 下面,如smail模式下选 keil\\lib\s.lib 加入工程中,如果要进行把 keil\c
[单片机]
KEIL <font color='red'>C51</font><font color='red'>程序</font>中如何嵌入汇编
Keil C51对C语言的关键词扩展之八: far
far的出现,是Keil 编译器为了支持新出现的8051家族增强型MCU,这些增强型MCU可能拥有大于64KB的存储器。使用far可访问扩展的RAM,使用const far可访问扩展的ROM。 NXP 51MX架构51单片机提供通过通用指针访问多达8MB的code和xdata存储空间。Dallas 390架构的51单片机通过24位的DPTR寄存器结合传统MOVX 、MOVC指令来访问扩展的RAM和ROM。
[单片机]
C51单片机的中断号以及中断向量
一、中断号 二、interrupt 和 using 在C51中断中的使用 8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下:
[单片机]
<font color='red'>C51</font>单片机的中断号以及中断向量
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved