LabVIEW 直流电机控制
AnChangNice
2019年01月05日 15:22

一、初衷

    因为之前学习过直流电机PID控制器,当时技能比较单一,通过LCD显示PID参数,旋转编码器做参数调节,通过一个串口波形显示软件观察波形,调试非常痛苦。我想很多人学习PID也是这么过来的,非常不易,中间需要很多知识的铺垫,软件硬件一堆的问题,对新手非常不友好,增加了学习的门槛和难度。

    因此就开始了这个项目,最初计划将上位机作为波形显示与PID参数设定即可,但是这样并没有什么根本上的区别。受Simulink的启发,可以把硬件系统封装起来,硬件仅提供数据采集,电压输出,所有的计算都放到PC端,这样以来将会提供极大的灵活性。使我可以专注于控制器的设计与调试,而非底层实现。

    为什么选择LabVIEW,因为这个非常好用。

二、系统分析

    首先我们要控制电机做闭环,那么首先要做的是测量,电机能测的量有:角度、角速度,电流。那么很显然我们就可以做角速度控制,角度控制,电流控制。那么前面的都是输出,输入的是电压。实际上我们通过控制输入的电压来控制我们需要的量。

    确定了输入输出我们再看一看细节,这些量要怎么测量。

    1.角度:即位置。电机转速控制一般使用增量编码器,通过它我们可以测量电机转过的角度与方向,是可以直接测出的量。通过定时器的编码器接口,可以直接读取。因此位置的采集频率可以非常高,意味着你的控制器可以以非常高的频率进行位置闭环控制。

    2.角速度:角速度不易测量(需要测速发电机),比较复杂,一般不用。我们知道速度是位置的微分,如果我们可以以固定的间隔来读取位置并作差就可以计算出角速度,那么问题来了,位置的分辨率是有限的,微分间隔越小,速度误差越大,这个间隔应该怎么取。下面是本项目所用电机与编码器的参数,我们选取不同的间隔来看看。由表格可知微分间隔(采样间隔越小,分辨率越差),采样周期的选取应根据速度控制精度需求选取。(补充:为了提升测量频率同时不影响分辨率,可以尝试采用脉冲周期测量来测速)

    值得注意的是你的控制精度上限是由测量分辨率决定的,例如当你的速度分辨率在0.641r/s时那么你会发现你的误差总是0.641的整数倍。这是非常合理的,当你遇到这类问题时,你就要考虑速度分辨率的问题了。

    那么这意味着什么?意味着速度闭环的精度与速度(控制频率)不可兼得。

采样周期 - 速度分辨率

    3.电流:一般通过采样电阻测量电阻压降计算电流(但是因为采样电阻较小,需要放大后送到ADC,比较麻烦,可以采用专用电流传感器模块)。因为电流与扭矩成正比,因此可以通过实验标定,以此控制扭矩。

    4.电源电压:采用电阻分压,加滤波后直接送入ADC采样计算(大多数),这里采用的是电压电流采集模块。

    5.输出电压(直流电机驱动电压):电源电压采样后,根据所需的输出电压计算出PWM的占空比,送入H桥驱动即可。PWM的分辨率与频率受限于时钟频率,成反比。PWM频率可以参考H桥驱动芯片的手册,频率越高开关损耗越大,发热越多。分辨率会影响电压输出的精度,进而对控制精度造成影响。

    至此,一个电机的基本控制系统所需的输入输出已经齐备。

    接下来是通讯部分,这里采用最简单的字符发送数据。这样虽然降低了信息的密度,但是非常易于处理,不用编写复杂的数据打包、发送、解包、接收程序,而且是可读的便于调试,可扩展性也很好。(具体的说明可参考:串口按信息传送格式可分为哪两类? - chang an的回答 - 知乎https://www.zhihu.com/question/305062036/answer/548320492)

    数据格式,因为当前功能比较简单,命令也比较少。

    上传数据:(为了避免歧义,我直接拿C 中的函数sprintf()说明,实际也是这样操作的)

        sprintf(TX_buffer,"H%.1f %.1f %.2fE\n", current, voltage, (float)(speed));

    上传的数据包含所有可测量,不必特别说明。

    下传数据:(为了避免歧义,我直接拿C 中的函数sprintf()说明,实际也是这样操作的)

        sprintf(TX_buffer,"HP%dE\n", PWM);

    下传数据需要做标记,例如这里的P代表PWM,后面的整数代表占空比。

    通讯协议有了,接下来就是软件实现的逻辑。

    下位机逻辑。下位机仅对传感器数据进行读取,计算,然后发送到上位机(需要注意的是发送的频率是固定的)。并在接收到完整的PWM数据指令后更新PWM。

    上位机逻辑。上位机首先等待下位机发送一个完整的数据帧,之后提取出数值,然后送到PID控制器根据设定值计算输出PWM,最后将输出PWM发送回下位机。循环往复即可。其间所有的数据会保存到波形图表显示出来。这就是一个完整的上位机逻辑。

    由以上逻辑,你会发现下位机MCU一般实时性比较容易控制,不确定性取决于上位机从串口接收到数据,而后计算得输出,最后发送到MCU的整个步骤耗时,这决定了系统的实时性上限。

三、系统硬件构成

    这张图说明了整个系统的构成。其中,电压电流传感器能够测量电源电压,电流,通过IIC通讯。H桥驱动具有方向与刹车功能,需要一路PWM(由定时器生成)。编码器使用定时器的编码器接口来进行计数(当然也可以用外部中断来写,但若是此系统电机编码器中断频率最高可达9.36KHz,谨慎使用)。PC与MCU通过UART通讯,上传数据、下传指令。非常简单的架构。

四、系统软件

软件流程图

    如果你足够敏锐的话你会发现比较理想的情况是下位机的每个上传数据都会在一个循环周期内得到上位机的响应,但是在下一个周期内得到响应也不是没有可能,但是并不会造成明显的影响。解决方法是将更新PWM单独处理。

    考虑到总有人想知道具体的细节,我就把LabVIEW的程序放在下面。这个程序运行速度并不是很快,原因是UI与核心控制程序放在了一起,可以分离提高效率,这个是试验品,暂时不考虑完善它。

LabVIEW 程序

    无论是上位机还是下位机都是很初级的(甚至都算不上),但是也具有一定的借鉴意义。可以看出我重心放在系统分析与思路上,并没有涉及底层的实现这些很具体的知识,原因有多方面的。

  • 首先为了把这个系统原理讲清楚(以便于理解整个系统的框架,了解都有哪些问题值得注意,提升空间在哪里),避免陷入具体的细节。

  • 其次对这个感兴趣的人都具备相应的基础(单片机、C、LabVIEW),不清楚的仅是整个思路与值得注意的问题。

  • 最后对于硬件不了解的同学也可以了解到硬件的复杂性和软件的实现思路。

    如果你没有以上的基础,你还是要学PID,那么我建议你用Simulink仿真吧,下面给出一个简单的转速闭环的模型。

Simulink 模型

直流电机模型

输出

好了就到这里吧,欢迎批评指正。谢谢!