今天给大家分享一个我先前使用的直流电机的增量式速度PI的算法。首先跟大家介绍应用场景,我们使用 增量式速度PI 控制直流减速编码电机是在 参加 全国大学生工程训练综合能力竞赛时 为了控制一个麦克纳姆轮小车而准备的, 在应用需求中我们一共是需要控制四路 电机 分别对四个电机的速度、方向进行控制,以此来实现对车身姿态的精确控制。可以认为速度控制是脉轮车控制的一个基本需求。(此处说的麦轮车是指 自动运行的, 手动操作的就另当别论) 声明:以下文章中电机 指 直流减速编码电机 如果您只是向要一份参考代码, 那么他的链接在这里; 配合文章会更好的理解代码哟
链接:https://pan.baidu.com/s/19eUZ-PpIRKOBdnUSTj_jEQ
提取码:1111
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V5的分享
我们先前使用的电机型号如下
我们使用的是500线的光电编码器,控制相对于 12线磁编码器要简单很多,当然价格 贵不少。。。
控制电机的速度,我们第一步肯定是要使用 PWM波,先使用Stm32F407 生成一个我们需要的 占空比可调的 频率 符合要求的方波信号。(此处注意,方波信号的频率不宜过高或者过低,过高容易导致电机驱动的晶闸管经常处于开关状态--发热巨大;过低则容易产生噪音,对电机也低频的冲击) 直接上代码!
第一部分是产生 可控方波的代码
程序大概就是这样的,这一部分很简单,只是简单的定时器的 输出配置
第二部分是配置 一路编码器接口,我们的 Stm32F407的定时器 1 2 3 4 5 8 支持编码器的解码功能,本次比赛中我们的 定时器2 3 4 5 分别用作了四路电机的编码器解码。编码器器的配置过程大致如下:
整个过程的配置很简单 :①开时钟② IO复用③调用接口配置函数 通过上述的顾鹏程我们就已经完成了对编码器的配置。
编码器对 电机输出的编码器信号使用硬件解码,编码器的解码过程配置这里不做详细的介绍了,具体请参考 stm32F4xx 中文参考手册。我们这里最终实现了 电机转动产生正交编码的信号,定时器对编码信号进行解码,电机 转动时 TIMx->CNT ++++ 或者---- 具体的加或者减取决于电机的转动方向。
以上是编码器参数处理的部分函数, 这里我没有采用记录上一次值的方法,这是因为在项目的需求中我只需要控制速度,而不需要去管位移, 如果有需要对位移进行控制的函数,那么我们就需要保存上一次的值 使用一个差值去进行速度的控制。
第三部分是 产生一个时间基准:
我们要对电机进行速度控制,但是我们目前获取到的信息是 转角的信息(类比直线运动的位移)我们需要对转速(速度)控制只需要对位移进行微分,所获得的就是速度信息。所以我们需要将时间切片,看每一个时间片内 电机转过的角度,这个值近似等于这一段时间内的电机的平均速度, 也几乎可以反映出电机的瞬时速度。 综上 我们需要一个时间的基准
时间基准我们是通过 定时器中断来产生的,我们通过定时器的定时中断,在中断函数内对 编码器信息处理,以此获得速度信息。 定时器中断部分的配置如下, 这是正点原子的探索者的代码,就不做解释了。
第四部分是 增量式速度PI的 实现代码 ,这一部分我是抄来的,也是搞不明白。所以就不去班门弄斧了。大家去找其他的大佬的解释吧。我这里只是附上代码
这个是增量式速度PI 的核心部分。
第五部分就是将以上的部分全部融合起来 构成一个可以跑起来的程序 这也是程序的最主要的部分
至此 就差不多完成了电机的速度控制。整个电机的速度控制时比较困难的,我也是花了一个多周的时间才搞明白的。
除了我上述提到的这些以外,我们还需要去大概的了解 电机驱动 正交编码器 等等的概念。
才疏学浅 难免有疏漏之处,望不吝赐教。