虽然PID不是什么牛逼的东西,但是真心希望以后刚刚接触这块的人能尽快进入状态。特地分享一些自己如何实现的过程。 首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异。3 a! R; L$ V; ~0 | G 资料上比较多的是:" o( T# I/ F, G: M - h% F3 ]4 j) \0 o# ?. l" Z 7 |; K' H7 T0 y. I( \4 l: ]' C 还有一种的算法是: f$ j8 w3 u) ~2 y 这里主要介绍第二种,具体会分析比例、积分、微分三个环节的作用。 硬件部分:% S7 S: l5 i* M; \1 R! e 控制系统的控制对象是4个空心杯直流电机,电机带光电编码器,可以反馈转速大小的波形。电机驱动模块是普通的L298N模块。 芯片型号,STM32F103ZET6% X8 ]; u8 A4 e7 N5 F! }9 b 软件部分:$ D1 I ]4 D9 |! i PWM输出:TIM3,可以直接输出4路不通占空比的PWM波 PWM捕获:STM32除了TIM6 TIM7其余的都有捕获功能,使用TIM1 TIM2 TIM4 TIM5四个定时器捕获四个反馈信号 PID的采样和处理:使用了基本定时器TIM6,溢出时间就是我的采样周期,理论上T越小效果会越好,这里我取20ms,依据控制对象吧,如果控制水温什么的采样周期会是几秒几分钟什么的。 Q: z$ k! r( l6 y4 d* m+ v 上面的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的初始化略不同,它的中断”名称“和通用定时器不同。具体的内容,请大家看一下我分享的代码就明白了。 5 ~$ d" E. n$ ?8 l9 T o |
PIDx->proportion*(iError-PIDx->last_error). v8 x3 c- e( X& Q9 ^$ W/ D
+PIDx->integral*iError
+PIDx->derivative*(iError-2*PIDx->last_error+PIDx->prev_error);
请教下,如果是纯比例控制的话,就是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
楼主 这句代码该怎样理解