null

PID控制程序

  • 1星
  • 日期: 2018-01-20
  • 大小: 5.32KB
  • 所需积分:2分
  • 下载次数:2
  • favicon收藏
  • rep举报
  • free评论
标签: PID

PID=port ID,在STP(生成树协议)中,若在端口收到的BPDU中BID和path cost相同时,则比较PID来选择阻塞端口。数字电视复用系统名词 PID(Packet Identifier) 在数字电视复用系统中它的作用好比一份文件的文件名,我们可以称它为“标志码传输包” 。

关于PID用法的详细C语言程序源码,欢迎下载学习

文档内容节选

include REGX51H 定义 define u8 unsigned char define u16 unsigned int define u32 unsigned long u8 code L298FFW80x010x030x020x060x040x0c0x080x09 u8 code L298REV80x090x080x0c0x040x060x020x030x01 struct PID unsigned int SetPoint100 设定目标 Desired Value unsigned int Proportion10 比例常数 Proportional Const unsigned int Integral8 积分常数 Integral Const unsigned int Derivative6 微分常数 Derivative Const unsigned int LastError Error1 误差 unsigned int PrevError Error2 unsigned int SumError Sums of Errors ......

#include /*********************定义********************/ #define u8 unsigned char #define u16 unsigned int #define u32 unsigned long u8 code L298FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; u8 code L298REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; struct PID { unsigned int SetPoint=100; // 设定目标 Desired Value unsigned int Proportion=10; // 比例常数 Proportional Const unsigned int Integral=8; // 积分常数 Integral Const unsigned int Derivative=6; // 微分常数 Derivative Const unsigned int LastError; // Error[-1] 误差 unsigned int PrevError; // Error[-2] unsigned int SumError; // Sums of Errors }; struct PID spid; // PID Control Structure unsigned int rout; // PID Response (Output) 响应输出 unsigned int rin; // PID Feedback (Input)//反馈输入 /*********************引脚定义********************/ //1cd1602引脚定义 #define lcd_port P0//将1602的8个数据引脚定义到P0上,增加数据的可移植性 sbit lcd_rs = P2^7;//1602的RS脚 接单片机2.7口 sbit lcd_rw = P2^6;//1602的RW脚 接单片机2.6口 sbit lcd_en = P2^5;//1602的EN脚 接单片机2.5口 sbit beep = P3^0;//蜂鸣器引脚 /*********************函数声明********************/ //1602函数声明 void lcd1602_initialize(void);//1602初始化函数声明 void lcd1602_writestring(u8 *string , u8 x , u8 y);//1602按行写函数声明 //定时器和外部中断函数声明 void exit_time_initialize(void);//初始化定时器和外部中断函数声明 /*********************变量定义********************/ u32 Speed = 0;//当前转速 u32 Count = 0;//表示当前的计数值 u8 TIM_Count = 0;//在定时器里用作计算时间的变量 u16 s; /*********************延时********************/ void delayms(u16 ms) { u8 i; while(ms--) { for(i=0;i<120;i++); } } void PIDInit (struct PID *pp) { memset ( pp,0,sizeof(struct PID)); //用参数0初始化pp } unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) //PID计算 { unsigned int dError,Error; Error = pp->SetPoint - NextPoint; // 偏差 pp->SumError += Error; // 积分 dError = pp->LastError - pp->PrevError; // 当前微分 pp->PrevError = pp->LastError; pp->LastError = Error; return (pp->Proportion * Error//比例 + pp->Integral * pp->SumError //积分项 + pp->Derivative * dError); // 微分项 } /*********************主程序********************/ void main(void)//主函数 { u8 i=0; u8 DisplayBuff[6];//显示数组 lcd1602_initialize();//1602初始化 exit_time_initialize();//定时器和外部中断初始化 lcd1602_writestring("speed measu sys",0,0);//在第一行显示字符 英文为速度测量系统 lcd1602_writestring("speed:12000rpm",1,0);//在第二行显示速度 PIDInit ( &spid ); // Initialize Structure spid.Proportion= 10; // Set PID Coefficients spid.Integral = 8; spid.Derivative =6; spid.SetPoint =100; // Set PID Setpoint while(1)//无限循环 { u8 j; if(Speed > 3000)//如果速度超过3000则蜂鸣器响,否则蜂鸣器不响 { beep = 0;//控制蜂鸣器响 for(j=0;j<8;j++) { P1 = L298FFW[j]; delayms(50); rin = s; // Read Input rout = PIDCalc ( &spid,rin ); } } if(Speed<1000) { beep = 1;//控制蜂鸣器不响 for(j=0;j<8;j++) { P1 = L298REV[j]; delayms(50); rin = s; // Read Input rout = PIDCalc ( &spid,rin ); } } else { beep = 1;//控制蜂鸣器不响 } DisplayBuff[0] = Speed / 10000 + 0x30;//转速的万位 +0x30表示转换成ASCII码 DisplayBuff[1] = Speed % 10000 / 1000 + 0x30;//转速的千位 +0x30表示转换成ASCII码 DisplayBuff[2] = Speed % 1000 / 100 + 0x30;//转速百位 DisplayBuff[3] = Speed % 100 / 10 + 0x30;//转速十位 DisplayBuff[4] = Speed % 10 + 0x30;//转速个位 DisplayBuff[5] = 0;//加0表示结束 lcd1602_writestring(DisplayBuff,1,6);//将转速显示到屏幕上 } } void exit_time_initialize(void)//定时器和外部中断初始化程序 { TMOD = 0x11;//16位模式 TL0 = 0xb0;//定时时间为50MS TH0 = 0x3c;//定时时间为50MS TR0 = 1;//打开定时器 ET0 = 1;//打开定时器中断 EA = 1;//打开全局中断 IT0 = 1;//下降沿捕获 EX0 = 1;//打开外部捕获中断 } void exit_int(void) interrupt 0//外部中断服务函数 { Count ++;//计数变量自增 因为 } void Tm0_Isr() interrupt 1//定时器中断 { TL0 = 0xb0 ;//重新装载 定时时间为50ms TH0 = 0x3c ; TIM_Count ++; if(TIM_Count >= 20)//表示2s时间到 4*50ms =0.2s { TIM_Count = 0;//重新计时 Speed = Count * 60;//Count表示在0.2S内的计数个数,换算成1分钟需要*5*60 Count = 0;//清零 计算下一个1S } } //向1602中写一个字节 //dat为写的8位数据,d_or_c为选择写的是数据还是指令,d_or_c = 1数据 , d_or_c = 0指令 //无返回 void lcd1602_write(u8 dat , u8 d_or_c) { u8 i; lcd_en = 0;//将en拉低不使能 lcd_rs = d_or_c;//rs决定数据还是指令 lcd_rw = 0;//表示写 lcd_port = dat;//将数据送到端口 lcd_en = 1;//使能 for(i = 0;i < 200;i ++);//延迟已等待稳定 lcd_en = 0; } void lcd1602_clear(void) { lcd1602_write(0x01,0);//清楚屏幕 lcd1602_write(0x80,0);//预先写一个 lcd1602_write(0x30,1); } void lcd1602_initialize(void) { lcd1602_write(0x38,0);//设置模式 lcd1602_write(0x0c,0);//不显示光标 lcd1602_write(0x06,0);//指针自加 lcd1602_clear();//屏幕清零 } void lcd1602_writestring(u8 *string , u8 x , u8 y)//在x行 y列写字符 { lcd1602_write(0x80 + x * 0x40 + y,0);//将函数坐标写入 while(*string != '\0')//遇到0停止 { lcd1602_write(*string,1);//写字符 string ++;//变量自增 写下一个 } }
更多简介内容

推荐帖子

评论

登录/注册

意见反馈

求资源

回顶部

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })
×