自写的一个简单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号