<div id="sina_keyword_ad_area2">
<div>
目录:
</div>
<div>
一、什么是
<span style="color:#444444;">增量式</span>
<span style="color:#444444;">PID</span>
</div>
<div>
<span style="color:#444444;">二、硬件部分</span>
</div>
<div>
<span style="color:#444444;">三、软件部分</span>
</div>
<div>
</div>
<div>
---------------------------------------------------------------------------------------------------------------
</div>
<div>
<span style="color:#444444;">一、什么是增量式PID</span>
</div>
<span style="color:#444444;">虽然PID不是什么牛逼的东西,但是真心希望以后刚刚接触这块的人能尽快进入状态。特地分享一些自己如何实现的过程。</span>
<a href="http://blog.sina.com.cn/s/blog_453226290102wady.html">PID控制算法介绍与C程序实现</a>
<br>
<span style="color:#444444;">首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来的,不同的是系数的差异。</span>
<a href="http://bbs.elecfans.com/jishu_484125_1_1.html">http://bbs.elecfans.com/jishu_484125_1_1.html</a>
<div>
<span style="color:#444444;">资料上比较多的是:</span>
<div>
<a href="http://album.sina.com.cn/pic/001gz4SZzy7g1wzUxIrf7"><img alt="STM32上实现增量式PID" name="image_operate_18571511396618286" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-290e3d025028701f841f870113e6557f.png"></a>
<br>
<span style="color:#444444;">还有一种的算法是:</span>
</div>
<div>
<a href="http://album.sina.com.cn/pic/001gz4SZzy7g1wBmx3s3a"><img alt="STM32上实现增量式PID" height="228" name="image_operate_29631511396618345" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-5137a50e2a37d7c6ac31dee7b64d3d0c.png" width="577"></a>
<br>
<span style="color:#444444;">这里主要介绍第二种,具体会分析比例、积分、微分三个环节的作用。</span>
</div>
<div>
<br> ---------------------------------------------------------------------------------------------------------------
<br>
<span style="color:#444444;">二、硬件部分</span>
<br>
<span style="color:#444444;">控制系统的控制对象是4个空心杯直流电机,电机带光电编码器,可以反馈转速大小的波形。电机驱动模块是普通的L298N模块。</span>
<span style="color:#444444;">芯片:STM32F103ZET6</span>
<br>
<br> ---------------------------------------------------------------------------------------------------------------
<br> 三、软件部分
<br>
<span style="color:#444444;">PWM输出:</span>
</div>
<div>
<span style="color:#444444;">TIM3,可以直接输出4路不同占空比的PWM波</span>
<br>
<span style="color:#444444;">PWM捕获:</span>
</div>
<div>
<span style="color:#444444;">STM32除TIM6、TIM7其余的都有捕获功能,本处使用TIM1、TIM2、TIM4、TIM5四个定时器捕获四个反馈信号</span>
<br>
<span style="color:#444444;">PID的采样和处理:</span>
</div>
<div>
<span style="color:#444444;">使用了基本定时器TIM6,溢出时间就是我的采样周期,理论上T越小效果会越好,这里我取20ms,依据控制对象吧,如果控制水温什么的采样周期会是几秒几分钟什么的。</span>
<br>
<br>
<span style="color:#444444;">上面的PWM输出和捕获关于定时器的设置都有例程,我这里是这样的:</span>
<br>
<span style="color:#444444;">TIM3输出四路PWM,在引脚 C 的 GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9输出</span>
<br>
<span style="color:#444444;">四路捕获分别是TIM4、TIM1</span>
<span style="color:#444444;">、</span>
<span style="color:#444444;">TIM2</span>
<span style="color:#444444;">、</span>
<span style="color:#444444;">TIM5 ,对应引脚是: PB7、PE11、PB3、PA1</span>
<br>
<span style="color:#444444;">高级定时器ti</span>
<span style="color:#444444;">m1的初始化略不同,它的中断”名称“和通用定时器不同。具体的内容,请大家看一下我分享的代码就明白了。</span>
</div>
<div>
<div>
void TIM3_PWM_Init(u16 arr,u16 psc)
</div>
<div>
{
</div>
<div>
GPIO_InitTypeDef GPIO_InitStructure;
</div>
<div>
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
</div>
<div>
TIM_OCInitTypeDef TIM_OCInitStructure;
</div>
<div>
</div>
<div>
</div>
<div>
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
</div>
<div>
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
</div>
<div>
//使能GPIO外设和AFIO复用功能模块时钟使能
</div>
<div>
</div>
<div>
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer3全映射 GPIOC-> 6,7,8,9 //用于TIM3的CH2输出的PWM通过该LED显示
</div>
<div>
</div>
<div>
//设置该引脚为复用输出功能,输出TIM3 CH1 CH2 CH3 CH4 的PWM脉冲波形
</div>
<div>
GP |
|