文档库 最新最全的文档下载
当前位置:文档库 › 自写的一个简单PID函数,请大家指点指点!! 中国电子开发网(www_ourdev_cn)

自写的一个简单PID函数,请大家指点指点!! 中国电子开发网(www_ourdev_cn)

自写的一个简单PID函数,请大家指点指点!! 中国电子开发网(https://www.wendangku.net/doc/c713307196.html,) 你尚未登录 |登录 |快速注册 |退出 首页 酷贴
搜索 在线 个人功能 -------------------- 末登录不能使用本功能 本网站由阿莫电子邮购独家赞助
论坛首页 -> AVR (原https://www.wendangku.net/doc/c713307196.html,) 技术论坛 -> 自写的一个简单PID函数,请大家指点指点!! (属于论坛:AVR) 跳转至:
╟—虚拟总论坛╟┬AVR (原https://www.wendangku.net/doc/c713307196.html,) 技术论坛║├AVR32技术论坛║├STM32/STM8
技术讨论区║├CPLD/FPGA║├PSoC(Cypress)可编程片上系统技术讨论区║├ARM技术论坛║├其它Cortex-M3技术讨论区(ST除外)║├51单片机║├PIC单片机║├DSP║├MSP430║├瑞萨单片机(原NEC单片机)║├其它单片机║├都江堰操作系统(djyos)║├RT-Thread实时线程操作系统║└嵌入式操作系统╟┬开源雕刻机DIY活动(及机械、机器人分论坛)║├“春风”数控电源║├GPS应用开源活动║├白沙开源专栏(段式液晶,怀表等)║├四轴飞行DIY论坛║├网站逻辑分析仪开源活动║├开源PLC(暂时关闭,2010春节假期后重开)║├磁悬浮开源设计活动║└“魏坤手持数字示波仪”开源DIY活动╟┬STM8手持示波仪(已完成)║├开源充电器设计活动(已完成)║├Mini
DVD 应用与DIY(已完成)║├ATmel蜗牛触摸演示板Snail
Touch(已完成)║├RF通信应用(筹备)║└PLC开源设计活动(已经暂停)╟┬电子产品║├USB║├电源║├通信技术║├视频捕捉与处理║├电子零件与线路║├行业标准与规范║├PCB(Protel等)║├电路仿真(Proteus等)║├音响、高清视频║└手机╟┬Fluke(福禄克)仪器专栏║├示波器║├万用表║├信号发生器║├基准源║└其它仪器╟┬西门子PLC║├三菱PLC║├台系PLC║├大陆PLC║└其它PLC╟┬电脑综合论坛║├Google(浏览器Chrome)║├上位机软件开发(Delphi,C++等)║└网页编程(网站开发)讨论区╟┬智能小车║├航空模型讨论区║└开源自充电清扫小车╟┬马潮AVR专栏║├小俊(qwernet)专栏║├傻孩子(Gorgon
Meducer)专栏║└shaoziyang专栏╟┬
水坛,招聘,淘宝超值,二手交易,寻找器件等║└垃圾收集区(定期删除)╙┬阿莫淘金正在进行中 ├阿莫淘金网友置换、讨论区 ├阿莫淘金技术讨论区 └阿莫淘金(已经完成)
未登录
↓↓ 自写的一个简单PID函数,请大家指点指点!! 回复数:48,点击数:3723
【楼主位】 dejun
积分:79
派别:
等级:------
来自:
void PID(int w_Present, int w_Purpose,tByte tb_Suit, tWord* ptw_PWM)
{
int w_Error = 0;//当前误差
static int w_Error_Old = 0;//上次误码

int w_PWM_temp = 0;//PWM占空比缓冲器
static int w_Sum = 0;//积分和
int w_Error_ABS = 0;//当前绝对值
static int w_Purpose_Old =0;//上次的设定值

static int w_PID_P = 1;//比例部分
static int w_PID_I = 1;//积分部分
static int w_PID_D = 1;//微分部分

static tWord tw_PWM_Buff[4] = {0,0,0,0};

//设定值改变清零积分和
if(w_Purpose != w_Purpose_Old)
{
w_Purpose_Old = w_Purpose;
w_Sum = 0;
}

//选择合适的PID:因为闭环参数变化有时可能需要改变PID
switch(tb_Suit)
{
case 0x01:{
w_PID_P = 6;
w_PID_I = 0;
w_PID_D = 0;
}break;
case 0x02:{
w_PID_P = 7;
w_PID_I = 0;
w_PID_D = 0;
}break;
case 0x03:{
w_PID_P = 8;
w_PID_I = 0;
w_PID_D = 0;
}break;
default: {
w_PID_P = 8;
w_PID_I = 0;
w_PID_D = 0;
}break;
}

//取当前误差
w_Error = w_Purpose - w_Present;

//取当前绝对值
if(w_Purpose > w_Present){w_Error_ABS = w_Purpose - w_Present;}
else{w_Error_ABS = w_Present - w_Purpose;}

//转存占空比值
w_PWM_temp = (int)(*ptw_PWM);

//比例部分
w_PWM_temp += (w_Error / w_PID_P);

//积分部分
if(w_PID_I)
{
if(w_Error_ABS < 20)//阈值20:积分分离
{
w_Sum += w_Error;

if(w_Sum > 100)//遇限削弱积分
{
w_Sum = 100;
}
if(w_Sum < -100)//遇限削弱积分
{
w_Sum = -100;
}

w_PWM_temp += (w_Sum / (1 + w_PID_I));
}
}

//微分部分
if (w_PID_D)
{
w_PWM_temp += (w_Error - w_Error_Old) / (1 + w_PID_D);
w_Error_Old = w_Error;//更新误差值
}

// 上顶死保护
if (w_PWM_temp > 1000)
{
w_PWM_temp = 1000;
}
// 下顶

死保护
if (w_PWM_temp < 0)
{
w_PWM_temp = 0;
}

//PWM平均值滤波
tw_PWM_Buff[0] = tw_PWM_Buff[1];//数据递推
tw_PWM_Buff[1] = tw_PWM_Buff[2];
tw_PWM_Buff[2] = (tWord)w_PWM_temp;
tw_PWM_Buff[3] = (tw_PWM_Buff[0]+tw_PWM_Buff[1]+tw_PWM_Buff[2]);
tw_PWM_Buff[3] /= 3;

//遇限削弱PWM
if(tw_PWM_Buff[3] > (*ptw_PWM))
{
if(tw_PWM_Buff[3] - (*ptw_PWM) > 20)
{
(*ptw_PWM) += 20;
}
else
{
*ptw_PWM = tw_PWM_Buff[3];
}
}
else
{
if((*ptw_PWM) - tw_PWM_Buff[3] > 20)
{
(*ptw_PWM) -= 20;
}
else
{
*ptw_PWM = tw_PWM_Buff[3];
}
}

}


2008-02-20,12:31:23 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【1楼】 dejun
积分:79
派别:
等级:------
来自:
自己顶一下!!

这个函数要根据系统需要进行周期性的调用,
形参是:(当前值,目标值,适合的PID,需调节的PWM)
在函数里定制需要的PID值,积分分离值,上下顶死值, 积分最大限值,PWM增量的最大限值.


2008-02-20,13:06:47 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【2楼】 dejun
积分:79
派别:
等级:------
来自:
看来写得太烂了!!

2008-02-20,13:09:50 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【3楼】 sunxin19810125
积分:10
派别:
等级:------
来自:
兄弟写得不错,大家一起交流,你的联系方式是?

2008-03-28,19:49:18 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【4楼】 ylshu
积分:72
派别:
等级:------
来自:
好 写的好 关键是能够共享思想 顶

2008-07-20,10:32:04 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【5楼】 guaibaobao 乖宝宝

积分:159
派别:
等级:------
来自:
顶一下!

2008-07-20,21:59:57 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【6楼】 wsl16805
积分:138
派别:
等级:------
来自:
先顶一个.有时间再来看看.

2008-07-26,15:22:46 资料 邮

件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【7楼】 avr_appli
积分:305
派别:
等级:------
来自:
mark

2008-07-28,19:58:11 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【8楼】 bjj9217
积分:1007
派别:
等级:------
来自:
mark
__________________________
淘宝地址:https://www.wendangku.net/doc/c713307196.html, 公司网站:https://www.wendangku.net/doc/c713307196.html,/ STM32开发板
STM32F103VBT6 STM32学习板 CORTEX-M3核ARM学习板
https://www.wendangku.net/doc/c713307196.html,/item.htm?id=5676975050 LM2576 DC-DC电源模块 CAN
2008-07-28,20:23:06 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【9楼】 totoko163
积分:57
派别:
等级:------
来自:
up

2009-07-08,16:42:17 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【10楼】 z_zt 米老鼠

积分:683
派别:
等级:------
来自:我家圐圙
有点意思,顶

2009-07-08,19:30:48 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【11楼】 lanlanx 蜗牛
积分:65
派别:
等级:------
来自:
留个位,以后回来学习

2009-07-08,20:34:39 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【12楼】 shdzbsl
积分:621
派别:
等级:------
来自:西安
占位,顶一下,慢慢研究。
__________________________
AVR、AVR32交流群:31172776
2009-07-09,00:15:32 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【13楼】 lcw_swust 小李飞刀
积分:602
派别:
等级:------
来自:地球
楼主强人!
小弟来一个增量式的,献丑了。

#define KP 10
#define KI 1
#define KD 2

signed int tempset,tempnow,tempctrl;
//温度设置,现在温度,温度控制量
void dopid(void)
{
static signed int err=0,err1=0,err2=0;//本次、上次、上上次误差
signed int add;//增量
err=tempset-tempnow;
add=KP*(err-err1)+KI*err+KD*(err-2*err1+err2);//计算增量
tempctrl=tempctrl+add;
if(tempctrl>255)tempctrl=255;//限幅
if(tempctrl<-255)tempctrl=-255;
err1=err;//保存误差
err2=err1;
}

2009-07-09,12:29:37 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【14楼】 lcw_swust 小李飞刀
积分:602
派别:
等级:------

来自:地球
上面我的程序修正一下:
(最后两句交换位置)

#define KP 30
#define KI 1
#define KD 2

signed int tempset,tempnow,tempctrl;
//温度设置,现在温度,温度控制量
void dopid(void)
{
static signed int err=0,err1=0,err2=0;//本次、上次、上上次误差
signed int add;//增量
err=tempset-tempnow;
add=KP*(err-err1)+KI*err+KD*(err-2*err1+err2);//计算增量
tempctrl=tempctrl+add;
if(tempctrl>255)tempctrl=255;//限幅
if(tempctrl<-255)tempctrl=-255;
err2=err1;//保存误差
err1=err;
}

2009-07-16,13:27:25 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【15楼】 cuikai12345
积分:991
派别:
等级:------
来自:家在石家庄,人在北京
参考一下。

__________________________
https://www.wendangku.net/doc/c713307196.html,/aini80225/ 个人博客
2009-07-16,19:57:42 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【16楼】 zhengjiawei

积分:29
派别:
等级:------
来自:
挺短的嘛~

2009-07-30,20:29:24 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【17楼】 xiaobendan 仲跻东
积分:2592
派别:
等级:------
来自:
14楼的程序我正在用来做可控硅斩波调速,现在的问题是当设定值比较小比如100时,反应速度比较慢,要怎样解决?我测速用的是60P/R的编码器
__________________________
那个160*80的液晶现在用不到了,剩下很多,原价转让,邮费自负,QQ3776214
2009-07-30,20:37:39 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【18楼】 steven 独钓一江秋
积分:777
派别:
等级:------
来自:
不懂,帮顶一下!

2009-07-30,22:16:59 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【19楼】 lcw_swust 小李飞刀
积分:602
派别:
等级:------
来自:地球
To【17楼】
反应速度比较慢,可以试下把积分项系数KI加大.
有问题欢迎来信:lcw_0504@https://www.wendangku.net/doc/c713307196.html,

2009-07-31,12:34:06 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【20楼】 marshallemon
积分:260
派别:
等级:------
来自:
MARK

2009-07-31,13:08:49 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【21楼】 plc_avr 哥只是传说



积分:1241
派别:
等级:------
来自:火星
MARK......

2009-07-31,13:22:09 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【22楼】 rube 永丰庵
积分:1761
派别:
等级:------
来自:深圳
学习


2009-07-31,14:58:15 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【23楼】 googse 老僧

积分:465
派别:
等级:------
来自:邵阳
马克

2009-07-31,16:27:51 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【24楼】 HONGXP0
积分:2
派别:
等级:------
来自:
正在学PID

2009-08-01,08:25:21 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【26楼】 anxiangbo
积分:805
派别:
等级:------
来自:山东
记号
__________________________
qq 15287336
2009-08-15,13:44:37 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【27楼】 xuetingxun2010 高速路上的板车

积分:134
派别:
等级:------
来自:湖南湘潭湖工
呵呵,学习中

2009-08-23,10:02:50 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【28楼】 mick
积分:119
派别:
等级:------
来自:
记号

2010-02-02,17:31:24 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【29楼】 by886
积分:70
派别:
等级:------
来自:
正在研究,MARK......

2010-02-02,22:10:51 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【30楼】 acer
积分:103
派别:
等级:------
来自:
ding

2010-02-02,22:19:01 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【31楼】 MCU678
积分:176
派别:
等级:------
来自:
MARK

2010-02-03,02:24:33 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【32楼】 html110
积分:56
派别:
等级:------
来自:
mark


2010-02-03,09:46:13 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【33楼】 mick
积分:119
派别:
等级:------
来自:
楼主,14楼:
你们好!能不能给出一个

完整的示范程序看看,刚学这个,不知道怎么用来调整电机转速?

2010-02-08,15:36:45 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【34楼】 fnems

积分:265
派别:
等级:------
来自:
回复【楼主位】dejun
-----------------------------------------------------------------------

w_PID_I 、w_PID_D 貌似没用到?

修改:
原来是开关……开始没看仔细

本贴被 fnems 编辑过,最后修改时间:2010-02-08,17:56:03.

2010-02-08,17:50:16 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【35楼】 xinyou
积分:171
派别:
等级:------
来自:
mark

2010-02-09,08:56:45 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【36楼】 cgxlmq
积分:9
派别:
等级:------
来自:
标记一小下下

2010-02-22,17:19:46 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【37楼】 wyb668
积分:2
派别:
等级:------
来自:
不错,好像研究PID的人很少。

有完全的说明思路就好了

学习

2010-02-22,18:17:25 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【38楼】 cuikai12345
积分:991
派别:
等级:------
来自:家在石家庄,人在北京
mark
__________________________
https://www.wendangku.net/doc/c713307196.html,/aini80225/ 个人博客
2010-02-22,18:28:04 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【39楼】 cjc2010
积分:78
派别:
等级:------
来自:
MARK


2010-07-30,13:14:08 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【40楼】 peavey
积分:181
派别:
等级:------
来自:
记认,做

2010-11-22,08:57:25 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【41楼】 lin1936 林鸿贵
积分:74
派别:
等级:------
来自:
看到一个更好的pid调节,今天真是太爽了
__________________________
以其说别人让你痛苦,不如说你自己修养不够
2011-01-02,17:20:56 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【42楼】 xuejianhua1986
积分:1141
派别:
等级:------
来自:江苏东台--上海--?
mark

2011-01-02,22:44:50 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【43楼】 up101

积分:127
派别:
等级:------
来自:
简单,作简例还是不错的。
__________________________
---- 多看多思 ----
2011-01-03,00:08:57 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【44楼】 xyang18 狗头军师
积分:483
派别:
等级:------
来自:
谢谢
__________________________
不要相信我所说过的,希望大家能更多的指出我的不足
2011-01-03,01:24:06 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【45楼】 jack_yu
积分:281
派别:
等级:------
来自:
mark!!

2011-01-03,17:19:30 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【46楼】 woshinlb
积分:20
派别:
等级:------
来自:
mark

2011-01-04,22:53:28 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【47楼】 jxglg
积分:14
派别:
等级:------
来自:
学习中。

2011-01-12,20:05:04 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【48楼】 mcu2007 努力出国

积分:314
派别:
等级:------
来自:不想提的地方
学习

2011-01-12,20:10:16 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

【49楼】 tcwb201

积分:102
派别:
等级:------
来自:浙江*杭州
看过

2011-01-13,08:42:31 资料 邮件 回复 引用回复 ↑↑ ↓↓ 编辑 删除

↑↑ 快速回复帖子主题:自写的一个简单PID函数,请大家指点指点!!

你尚未登录,不能回复以上帖子。
论坛首页 -> AVR (原https://www.wendangku.net/doc/c713307196.html,) 技术论坛 -> 自写的一个简单PID函数,请大家指点指点!! (属于论坛:AVR) 跳转至:
╟—虚拟总论坛╟┬AVR (原https://www.wendangku.net/doc/c713307196.html,) 技术论坛║├AVR32技术论坛║├STM32/STM8
技术讨论区║├CPLD/FPGA║├PSoC(Cypress)可编程片上系统技术讨论区║├ARM技术论坛║├其它Cortex-M3技术讨论区(ST除外)║├51单片机║├PIC单片机║├DSP║├MSP430║├瑞萨单片机(原NEC单片机)║├其它单片机║├都江堰操作系统(djyos)║├RT-Thread实时线程操作系统║└嵌入式操作系统╟┬开源雕刻机DIY活动(及机械、机器人分论坛)║├“春风”数控电源║├GPS应用开源活动║├白沙

开源专栏(段式液晶,怀表等)║├四轴飞行DIY论坛║├网站逻辑分析仪开源活动║├开源PLC(暂时关闭,2010春节假期后重开)║├磁悬浮开源设计活动║└“魏坤手持数字示波仪”开源DIY活动╟┬STM8手持示波仪(已完成)║├开源充电器设计活动(已完成)║├Mini
DVD 应用与DIY(已完成)║├ATmel蜗牛触摸演示板Snail
Touch(已完成)║├RF通信应用(筹备)║└PLC开源设计活动(已经暂停)╟┬电子产品║├USB║├电源║├通信技术║├视频捕捉与处理║├电子零件与线路║├行业标准与规范║├PCB(Protel等)║├电路仿真(Proteus等)║├音响、高清视频║└手机╟┬Fluke(福禄克)仪器专栏║├示波器║├万用表║├信号发生器║├基准源║└其它仪器╟┬西门子PLC║├三菱PLC║├台系PLC║├大陆PLC║└其它PLC╟┬电脑综合论坛║├Google(浏览器Chrome)║├上位机软件开发(Delphi,C++等)║└网页编程(网站开发)讨论区╟┬智能小车║├航空模型讨论区║└开源自充电清扫小车╟┬马潮AVR专栏║├小俊(qwernet)专栏║├傻孩子(Gorgon
Meducer)专栏║└shaoziyang专栏╟┬
水坛,招聘,淘宝超值,二手交易,寻找器件等║└垃圾收集区(定期删除)╙┬阿莫淘金正在进行中 ├阿莫淘金网友置换、讨论区 ├阿莫淘金技术讨论区 └阿莫淘金(已经完成)
未登录
中国电子开发网(https://www.wendangku.net/doc/c713307196.html,),友好交流气氛,乐于开源共享,“这里远比混乱的现实世界美好”。
网站负责人: 阿莫(armok,莫进明),134********(仅限于投诉。技术咨询请发帖交流),电邮:armok
https://www.wendangku.net/doc/c713307196.html,(请将空格改成@)
地址与电话: 东莞市东城八一路同沙工业园内,0769-********,传真请按4
 阿莫邮购门市与雕刻机展示厅:东莞市莞城区莞太路和生文具礼品批发市场A2018,A2035 杨小姐 137********
 雕刻机的技术咨询、订单查询、生产进度,可查询:136********吴先生(雕刻机设计人员kaif_w)

声明: 本网站由东莞科士通(Infostone)科技有限公司属下的阿莫电子邮购部提供独家赞助。
 有正式的工商注册与网站备案。详情可到东莞工商局查询。
 本网站(https://www.wendangku.net/doc/c713307196.html,)原名称为https://www.wendangku.net/doc/c713307196.html,(我们的AVR),自2007-09-01起从专业的AVR网转成综合电子网站。
 本网站系统由armok Using Oracle + Java/JSP + WebLogic + Linux 2001/12/20 --
2007/09/13
 本BBS所有代码均为原创,版权归 armok 所有。本网站自:2004-10-03,16:31:17 起开始运行。
法律顾问: 本网站尊重知识产权,自2007年08月15日起,魏龙律师担任https://www.wendangku.net/doc/c713307196.html,(原https://www.wendangku.net/doc/c713307196.html,)常年法律顾问。


中国电子开发网(https://www.wendangku.net/doc/c713307196.html,) 粤ICP备090471

43号

相关文档