PID:从入门到放弃
前言
前段时间参加了智能小车的比赛,为了方便和快速性,我们采用了四个麦克纳姆轮结构的小车,并用openmv做视觉导航定位。由于这个项目是第一次做,而且没有学长学姐的指导,不过好歹跌跌撞撞的走过来了。现在,横跨在我们面前的是“如何使小车启动后直走”这一个大魔王。为了战胜它,我们决定去寻找传说中的“pid调节器”圣剑……
什么是模拟量
前情回顾:
首先,单片机的一般GPIO口输入输出量为0和1,也就是对应的0V和5V(或3.3V),但是现在的STM32系列的单片机不仅可以输入输出0V和5V,同时也可以输入输出05V之间的电压。但由于05V电压变化范围很小,并且电压值属于一个物理量,这个量并不直观,并且这个量并不能由单片机直接输入输出或处理。我们可以把这个物理量转变为更加直观的数字量,这个数字量不仅可以表现出电压的相对高低,而且这个数字量可以直接给单片机进行数据处理。我们把05这一段区域等分成256等份(这里的256是单片机标准库里所提供的对于模拟量精度的设置,当然用户也可以自己去写一个精度更高的模拟量输出函数),那么05V电压我们就可以用0~255这些整数来表示。这样用一个直观的数字量去表示一个测量量(电压、电流、频率、温度等),这个数字量就是称为模拟量。
————by 李杰大佬
什么是PWM:
我们普通的控制,只需要给其高电平,或者是低电平就可以进行控制了,如果想让其在中间某个值进行控制,就需要使用pwm来控制,也就是快速的对该器件进行开关动作。一个比较常用的pwm控制情景就是,来调节灯的亮度,根据占空比的不同,就可以完成灯亮度的不同控制。pwm的占空比,就是指高电平保持的时间,与该pwm时钟周期时间之比。一般用单片机来产生pwm,有以下几种方法,第一种就是用指令来形成pwm,这种方法可以产生,分辨率很高的pwm,但是这样会影响其他任务的运行,一般使用在比较简单的控制中。另外一种就是用,定时器来产生pwm,还有的单片机本身具有pwm模块功能。
————by 度娘
怎么测量直流电机的转速:
电机测速
什么是PID
要了解什么是PID,我们得先弄清楚为什么要PID。众所周知,我们的电机驱动模型在假设输入量确定(为目标转速),输出量确定(PWM一定)时,系统的传递函数模型可以用一个表达式进行表征(这里看不懂的同学可以翻开控制工程看一下),并且该传递函数只和系统本身的特性有关。就好比输入x,传递函数就是y=2x,输出的自然就是2x了。但是,实际情况下输入量和系统都会有一个干扰量,输入电压也会波动,并且输入输出也并不完全成线性关系,这就导致了我们无法实际准确的表达传递函数,这会导致两点后果:第一,哪怕是同一型号规格,两个不同的电机在同PWM输出的时候转速是不同的;第二,同一个电机同PWM在不同路况下会受到干扰的影响,速度也是波动的。
这就意味着我们用恒定PWM输出控制小车走直线的愿望破灭了。为了改善速度曲线,经典控制理论习惯使用添加串联校正或者反馈校正,但是刚才提到,我们的实际电机模型是未知的,明确的环节校正是比较困难的。我们联想,在数学中对于一条曲线,在某点附近可以用泰勒展开变成用一个多项式表述一段曲线,而在控制中也是类似,只不过这里的“多项式”变成了PID,即:比例环节,积分环节和微分环节(之所以选择这几个环节的原因参考传递函数的数学表达模型,同样参考控制工程)。
在找宝物“pid调节圣器”之前,需要向当地的村民问路是一种常识,百度村的村民们都很热情,提供的资料多种多样,不过因为时间原因,村民们表述不清,个人能力不够等原因,很多资料都是过时的,错误的,甚至无法理解的。作为勇者的我们没有办法,只好拿着钱包抵……抱歉,串台了,只好拿着资料一点点学习对照,终于锁定了若干条有价值的情报: