你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何在STM32上实现增量式PID转  

[复制链接]
又是一年春来到 发布时间:2016-6-14 13:52
虽然PID不是什么牛逼的东西,但是真心希望以后刚刚接触这块的人能尽快进入状态。特地分享一些自己如何实现的过程。
( T2 i) O  j  p% d  D5 ~+ W0 N首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异。3 a! R; L$ V; ~0 |  G
资料上比较多的是:" o( T# I/ F, G: M
111111.jpg
1 L: V3 K. d  t* L
% T, v6 h1 A' a% f3 i- h% F3 ]4 j) \0 o# ?. l" Z
7 |; K' H7 T0 y. I( \4 l: ]' C
还有一种的算法是:  f$ j8 w3 u) ~2 y

% K4 \; e& ]3 Z( D 11112.jpg
7 y) \5 |1 W6 {) T8 C
0 _: b( ~) v1 r
* P- M. W- \; E) C# q, d
这里主要介绍第二种,具体会分析比例、积分、微分三个环节的作用。
7 M! x- q9 p2 M
  W2 ~4 }0 f4 i; S* W% ~硬件部分:% S7 S: l5 i* M; \1 R! e
控制系统的控制对象是4个空心杯直流电机,电机带光电编码器,可以反馈转速大小的波形。电机驱动模块是普通的L298N模块。
, z8 A" J$ y& P( s' [- ]" X7 X( w芯片型号,STM32F103ZET6% X8 ]; u8 A4 e7 N5 F! }9 b

+ A2 N; Y7 K1 W) `) O8 m" J0 t3 z软件部分:$ D1 I  ]4 D9 |! i
PWM输出:TIM3,可以直接输出4路不通占空比的PWM波
" |5 F  B$ j! R8 x& z( UPWM捕获:STM32除了TIM6 TIM7其余的都有捕获功能,使用TIM1 TIM2 TIM4 TIM5四个定时器捕获四个反馈信号
1 A& t/ @" L& M5 dPID的采样和处理:使用了基本定时器TIM6,溢出时间就是我的采样周期,理论上T越小效果会越好,这里我取20ms,依据控制对象吧,如果控制水温什么的采样周期会是几秒几分钟什么的。  Q: z$ k! r( l6 y4 d* m+ v

  h. T( |2 P" m9 S+ \* X上面的PWM输出和捕获关于定时器的设置都有例程,我这里是这样的:3 O+ L- r1 }0 P+ ~/ }9 a
TIM3输出四路PWM,在引脚 C 的 GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9输出9 y& ~! @$ s# s5 r/ a
四路捕获分别是TIM4  TIM1  TIM2  TIM5   ,对应引脚是:  PB7 PE11 PB3 PA13 t+ |! V1 D) }* E. X% Y7 k( b+ e
高级定时器tim1的初始化略不同,它的中断”名称“和通用定时器不同。具体的内容,请大家看一下我分享的代码就明白了。
0 M; n/ y+ e# \% I& t% R3 ^2 H( y5 ~$ d" E. n$ ?8 l9 T  o
程序.zip (2.51 KB, 下载次数: 148)
1 收藏 12 评论23 发布时间:2016-6-14 13:52

举报

23个回答
zhjunwei 回答时间:2020-4-6 09:35:09
iincpid=                                                          //增量计算
# Q/ y/ F. g9 Q* a/ C9 S! A& `9 \! fPIDx->proportion*(iError-PIDx->last_error). v8 x3 c- e( X& Q9 ^$ W/ D
+PIDx->integral*iError
% j: K4 ~7 R. }4 Q. l+PIDx->derivative*(iError-2*PIDx->last_error+PIDx->prev_error);
: Y; f& y; y8 l8 E请教下,如果是纯比例控制的话,就是PIDx->proportion*(iError-PIDx->last_error),如果开始的时候iError=1,last_error=0,然然后输出就是比例*1,然后last_error = iError=1,此时的输出如果执行器没有动作,那么接下来就是iError-PIDx->last_error=0,一直都是0,那不是输出一直都是0了* h$ t% g/ W7 Z5 O6 E
zhp218 回答时间:2017-1-10 16:47:57
PID1.sum_error+=(incPIDcalc(&PID1,frequency1));         //计算增量并累加
1 Z5 [6 H9 l1 d8 m% C, L
! Z& s5 @1 ?  Q# y9 B楼主  这句代码该怎样理解
天臆弄人 回答时间:2019-6-24 10:24:12
像我这样的菜鸟不懂啥PID,我只知道 程序 写,速率快了,就降低,速率慢了,就加速,用个while循环,检测 这是不是 就是PID算法哦
Stm32McuLover 回答时间:2016-6-14 16:30:49
那个4.6875怎么计算的呢?有什么理论依据没有?
jtc_88 回答时间:2016-6-14 17:10:20
恩 顶 不错的帖子
z258121131 回答时间:2016-6-14 21:49:20
学习啦,谢谢楼主
那片清茶 回答时间:2016-6-14 21:50:48
不错,赞 一个。
加拿大 回答时间:2016-6-15 10:13:39
,谢谢分享,学习一下!
zero99 回答时间:2016-6-15 15:37:33
谢谢楼主分享
lzts 回答时间:2016-6-15 18:40:38
谢谢分享, 学习了
mogogomo 回答时间:2016-8-5 17:21:00
学习中.....
车厘子 回答时间:2016-8-5 19:44:30
赞一个
噜噜噜啦嘞 回答时间:2016-8-5 21:13:04
学习学习
lost1421 回答时间:2016-8-9 13:10:38
运用增量PID方式,必须使用浮点运算,MCU的运行效率下降不少。
disheng4688 回答时间:2016-12-9 08:49:23
谢谢分享
konway 回答时间:2016-12-10 13:04:21
感谢分享。还不会
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版