1.所需要的硬件设备以及文件:
硬件:一个直流减速电机,一个电机驱动,一片stm32,减压模块,12V电源等
因为在本节中,代码实在是太长了,所以我就不再一一放置代码,全部都放到下面的下载链接里面去了,这也是最后通过PID控制的版本。下载链接如下:
1.
2.
3.
文件内容就是我的示例代码:
2.A4950芯片
我自己常用的电机驱动就是A4950,如下图所示:
其中,VM接12V的电压,AIN1与AIN2引脚接我们通过定时器产生的PWM波,对应的输出为AOUT1与AOUT2。之后,在芯片内部,两路PWM波会经过下图所示的两个一个电桥。电桥中间的那个电感就是我们的驱动部件,也就是电机。
反映到波形上面,我们控制一路一直为高电平,一路接PWM波,就能很好的控制电机的转动
3.直流有刷电机介绍
对于直流有刷电机,其引脚的接线定义如下图所示:
首先,我们需要把刚才PWM波经过电机驱动所产生的电流分别接到M1和M2中。此时电机应该就可以正常启动了。点击在启动之后,C1和C2就会产生两路PWM波,这两路PWM波相位会相差90,我们可以以及波形的脉冲数以及二者之间的相位的差值来判断电机此时的速度和正反
4.驱动减速电机
我们还是通过串口来生成波形,输入命令
看到波形分别如下所示:
电机也能正常运转,这里就略去电机转动的视频了。
5.编码器测速
对于编码器测速,此时我们就需要开启新的定时器用于去读编码器的值了,接下来我们可以通过编码器读取速度了。在这里,我们首先输出占空比相差10%的PWM波来驱动电机转动,然后查看电机编码器的两路PWM波的波形如下图所示。
此时我们就可以通过STM32F103C8T6捕获波形脉冲的数量,从而知道电机的转动角度。之后,我们再结合定时器固定时间的中断,就能计算出电机的一个相对速度。再通过另一路的相位关系来判断是正转还是反转。在得到电机的相对速度后,我们就能精确地计算出电机的精准速度。
首先我们需要开启新的定时器进行测速,此时我们分别开启定时器1和定时器2,并设置为编码器模式,重装载值设置为20000-1,定时器模式选择 TI1 and TI2
同时我们也将两个编码器的引脚进行内部上拉
我们将在间隔定时器的中断内部进行测速,代码见我附带的文件。
在我们测得轮子的相对速度之后。接下来,我们可以通过一个很直白的办法来测得轮子的精确速度。因为我们知道我们现在的速度和轮子的真实速度是成正比的,因此我们现在可以给轮子一个固定的速度,然后固定一个时间段,如1分钟,接下来看轮子转了几圈。时间结束后,我们就知道轮子的真是速度,以及我们的相对速度,二者相除就是对应的比例系数(s1,s2),同理,在这里我们也求得了轮子转动的相对距离,在前面我们也可以让轮子转动固定的一个距离,然后除以我们测得的相对距离,就能得到对应的比例系数(p1,p2)。至此我们就能精确测得轮子转动的速度和距离。
6.PID实现精确控速
PID是我们在负反馈调节中经常使用,以速度为例,其基本的数学原理大概如下:
接下来,我们将使用PID来接管之前的串口驱动有刷电机,代码见我附带的文件pid.c和pid.h
调节速度环的PID时,是可以不需要kd的,我们只需要调节kp和ki就可以了。接下来我们通过串口直接改变其目标速度,间隔定时器就会自动让电机达到目标速度。
接下来我们给电机上位置环,位置环是外环,速度环是内环,公示如下:
位置环的具体控制,也见我下载链接里面的实例代码。对于位置环的调节,是不需要ki的,只需要kp和kd即可。
至此,现在就已经可以通过PID来实现对有刷电机的精确控制了。因为这一部分的代码实在太多了,有很多分开的部分,如果全部放在这里面,就有点乱了。所以如果需要代码就直接看我下载链接里面的实例代码即可。其中通信协议可以看代码里面的注释。