查看: 15310
回复: 18
进化传说 之 上古蜥蜴 第二帖:电机驱动电路

主题

回复
发表于2017-06-24 23:34:38 | 显示全部楼层
1# 电梯直达

在参赛贴里面说过,电机驱动这类电路不作为项目重点,暂时先尽快弄一个能动的,先玩着,后期再看情况改进。

所以采取一个简单的控制方案:

用现成的常用、低成本电机驱动芯片,由STM32输出PWM驱动,码盘加光耦模块反馈速度,算法采用PID。为简单快速,不做电流环,不做s域(复频域)建模我得意的笑

 

下面详细分析。



>>>本帖是第二届立创商城电子制作节开源作品参赛《进化传说 -- 上古蜥蜴》的分帖之一,索引主帖:http://club.szlcsc.com/article/details_7053_1.html#floor_5

编辑原因:增加返回主帖入口



主题

回复
发表于2017-06-25 23:39:32   |  显示全部楼层
2#

本帖是参赛贴《进化传说之上古蜥蜴》的分贴之一,主贴在此

http://club.szlcsc.com/article/details_7053_1.html#floor_7


主题

回复
发表于2017-08-21 22:11:10   |  显示全部楼层
3#
在第一帖中,电机做过更改,现在用的是带测速的减速电机
http://club.szlcsc.com/article/details_7855_1_16.html#floor_16
--------------------------------------------------------------------------------------------------
蜥蜴项目作为一个移动装置,肯定要采用电池供电。其中电源至少包含两部分,一是电池管理,包括充放电、电压转换、保护,这个用一片TP5602可以搞定,响应立创商城号召,夹带广告:http://www.szlcsc.com/product/details_81512.html
3A充放电,管理常规3.6V锂离子电池,带各种保护。

第二部分专门给电机用,因为电机是12V额定电压。确实也能找到5V的,但是比较少,猜测是因为效率低或者不得不做成更大体积吧。这样我们就需要一个升压电路。TPS61088,老规矩 http://www.szlcsc.com/product/details_93676.html

直流电机调速比较常规的做法是PWM驱动,仍然需要一个芯片L9110H,像是一个简单的电平转换电路,可以用3.3V输入,控制12V输出,同时内部有相应的缓冲保护电路,所以控制端可以不用其他保护直接接单片机的PWM输出,电机端也不需要其他保护,不会损坏本芯片,也不会将干扰带入单片机。

电机驱动是靠通用版和杜邦线接起来的,原理图就上个手绘:

 

上图是右侧电机的接线。左侧电机要注意,电机12V电源的正负极要对调。左侧的电机PWM信号占用STM32的PA2和PA3,左侧测速信号占用PC2。

 

 

上面两个图是9110。。。。



主题

回复
发表于2017-08-21 22:15:36   |  显示全部楼层
4#

TP5602本来找官方要的支持,可是他们给的东西真够一说的,原理图和PCB文件完全对不上,原理图不能生成netlist(很多元件缺必要的要素,比如Lib ref),PCB根本不是根据netlist画的。。。我花在整理这份文件上的时间就超过两个工作日,比我从头画一个慢多了,无穷无尽的零散线头。。。但是呢,这样的文档传上来,和原厂的PCB布局基本一样,大家不会说干扰太大是因为我画的电路板不好

 

 

PCB有个封装画错了,唉,从小到大不管多小心,总是会有疏忽大意的地方,只能靠多次的修改。。。

5602下面是一堆旧手机电池,加旧充电宝拆出来的,加起来可以给手机充两次电,嘿嘿


主题

回复
发表于2017-08-21 22:34:59   |  显示全部楼层
5#

5V升12V的是这货:

 

TPS61088。图上这俩电解电容是Φ6的。也就是说,TPS61088加上外围元件,一共不到一节小手指大小,可以轻易提供三十多瓦的能量转换。当然,瓦数大了,散热要注意。

TPS61088和TP5602有个共同的麻烦,就是很难手工焊。后来经过朋友点拨,学会了芯片背面涂锡膏,然后用热风枪焊接的方法,效果还不错,就是前前后后焊坏了好几个芯片。。。

 

TPS60188的原理图,右边放了一些简单的调试信息


主题

回复
发表于2017-08-21 23:19:39   |  显示全部楼层
6#

下面该我们的主角上场了,有请好吃不上火的STM32单片机~

说实话,好多年不玩单片机了。这次又从阁楼上把多年前的开发板翻出来,全都是灰,呛得老婆直咳嗽。。。野火开发板,还有人知道吗

不过,多年过去了,这货依然上电就能运行、装好软件就能联机调试。。。STM32F103VET6,72MHz主频

特意3D打印了两个支架把它竖起来,看看临时拼装起来的金属朋克吧

 

 


主题

回复
发表于2017-08-21 23:33:27   |  显示全部楼层
7#

程序没有太多可说的,大部分是相应外设的初始化及控制、读取

 

 


主题

回复
发表于2017-08-22 13:49:39   |  显示全部楼层
8#
在蜥蜴项目中,STM32由于运算能力的限制,应该担当不了系统大脑的角色。相比之下,它的外设资源丰富,更适合担任小脑和脊髓的角色。STM32的程序也是以外设的操作为主,就像脊髓传递神经信号。
但是,脊髓也能实现一些简单的反射。我们让STM32单片机来完成PID环节的控制。

说起PID,我就顺便罗嗦几句,熟悉的朋友绕道好了

如果你还不了解,花上20分钟,把这层楼认真看完,你就知道了。这里假定你知道微积分的意义,以及在数字系统中的简单近似计算

先说一个简单的概念,控制理论里面有个核心的角色叫做error(这个词很难翻译,叫误差好像不好,误差不是这个意思),error表示当前的实际值离你的控制目标还差多远。比如速度,你设定为10,现在实际值是7,那么error就是3。这个概念其实简单得不能再简单了,对吧,控制理论的目标就是把error减小到0(先不讨论高阶)。

PID是一种控制策略,对error进行三种运算(P就是乘以一个比例系数,I是对其积分,D是对其微分),将三个运算结果分别乘以自己的系数之后加起来,得到一个结果,用这个结果去修正控制量(比如修正现有的PWM占空比),这个算法就是PID算法。

比如先说P。还像上面说的,设定速度为10,当前值为7,那就需要增加动力(比如PWM的占空比),增加多少呢,我们想一下,error大就增加多一点,error小就增加少一点,应该是个合理的方法,对吧?当然你可能想到了,速度和PWM的占空比不是同一种量纲,不能直接加减,需要乘以一个系数。
也就是,我们将当前的PWM占空比的值加上一个修正值ΔPWM,这个ΔPWM等于Kp * error,其实就这么简单也可以完成对速度的控制的。(其实在控制系统中,可以不用把PID三种策略全用上,只用一两个也是可以的)。
Kp是什么呢?是系数。这个系数从哪来的呢?。。。蒙的。没错,古典控制理论的参数就是一点点调的。

简单模拟一下,比如取Kp=0.05,那么PWM的占空比增加Kp*error=0.05*3=15%,假定占空比增加15%之后速度变成了11,那么error=-1,PWM占空比增加 Kp*error=0.05*(-1)= -5%,速度又将降低1.3左右。
所以我们知道了,P的意思就是比例,是对error做比例运算,用运算结果去修正控制量。
ΔPWM = Kp * error。将ΔPWM加到现有的PWM值上进行修正,这就是比例控制
这样的修正显然不会一次就正好调节到error为0,PID在数字系统中是定期计算的,这次PWM占空比加15%,下次减5%,再下次加2%,慢慢达到稳定。

继续深入一下,就涉及到了I,积分。
在上面的计算中,你可能看出来了,Kp不能大,否则被控量不会趋于稳定。比如如果Kp=0.5,第一次PWM修正值就是150%,也就是会增加到“满格”,这样速度会变成最大值,比如20,这样error就是-10,这又导致修正值为-5,也就是-500%,速度将会直接降为0,下次速度再变为20,如此循环。这种现象称为振荡。

为了避免振荡,Kp需要小一些。但是这样的话,有时候就会陷入另一种情况,比如速度为9.95,而Kp*error的结果太小,小于PWM的分辨率,这样error就会一直被忽略,那么速度将总是9.95。这个时候,积分运算就派上用场了。
我们对error进行积分,这次0.05不够大,下次0.03又不够,再下次0.06,加起来就够大了,将这种累加的和(就是离散的积分)再乘以系数,用于对PWM占空比进行修正,就可以弥补长时间的小error,提高控制精度。

D稍微复杂一点,是对error取微分运算。微分的物理意义是变化的速度。也就是说,如果error突然快速增加,虽然此时error绝对值还不大,也仍然则需要进行大幅的修正;另一方面,例如在速度从7变到10的过程中,error在减小,那么error的微分值为负,这样会抵消一部分P,从而减小振荡的可能。而如果error减小得非常快,则表示比如速度由7迅速增加到9.5,那么说明实际的PWM值设定的很可能是高得离谱了,而此时error的微分将是很大的负值,将起到预先减小PWM占空比的效果。

在实际运算中,error定时计算,那么相邻的两个值之差就可以近似为微分值




主题

回复
发表于2017-08-22 13:58:13   |  显示全部楼层
9#

下面几张图是PID相关的程序,最后一张是核心算法

 

上图是STM32程序里,SPI中断处理中的一段,用于解释命令字为2的命令,并根据命令设置相关参数


 

上图为定时器中断,分别用于更新速度测定值以及在PID模式下定时通知主程序进行PID更新计算,在main函数的主循环中:

while(1)
{
if(MotMode == MOTPID)
if(MayUpdatePID)
{
UpdatePID();
}
}



  

PID相关的数据结构







上图为现在使用的PID参数(下半部分为初始值)


 

PID核心算法,其实很简单,ΔPWM = Kp*P + Ki * I + Kd*d; PWM += ΔPWM就可以了


主题

回复
发表于2017-08-22 14:20:35   |  显示全部楼层
10#

PID运行演示视频

https://v.qq.com/x/page/x0540pae5xw.html



视频中,PID的参数采用楼上图片中的参数,可以看到明显的PID调整的特点。两次手握住履带后,电机受到阻力立刻减速,然后由于PID算法的作用,PWM占空比增加,履带又顽强地开始加速到目标速度,此时占空比很大,履带底盘在泡沫的架子上咔哒咔哒乱动,尤其第二次更明显。

由于占空比很大,突然松手履带就会转得很快,此时PID调节再次起作用,速度迅速降低,然而存在超调现象,也就是速度降低到预设速度之后并没有停止下降,而是继续减慢。然后又在算法调整下慢慢逼近设定值,这就是超调现象。超调的成因,固然是PID参数(也就是Kp、Ki、Kd)需要精细调整,但是,PID算法很难在大范围内保持良好的性能,例如在负载变化很大的情况下兼顾调节速度与超调量。如果需要更好的性能,需要更“高端”的控制理论。

 

典型的PID调节过程。当然也可以通过调整参数,让曲线在上升到设定速度2之前停止上升,但是那样调整时间就会变长很多


主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部