哀吾生之须臾,羡长江之无穷。
每天总是过的那么快。白天写代码画板子,忙到摸鱼的空都没有,晚上回来写点代码还老出BUG,然后一晚上就过去了。别人女朋友都换了好几茬了,几个孩子都轮流打酱油了,自己还脱单无望,脑子还感觉越来越不好使,人也越来越懒了,效率也低,真的是,过的好失败啊。梦想都快支撑不起这个快三十还一事无成的躯壳了。看着稚晖君的那种效率和能力,真的是强啊。

前言

硬件探索过后,就是程序编写了。

ESP32 IDF环境

前面已经介绍过,IDF环境是ESP官方主推的基于C语言的库环境,提供了ESP32最丰富的功能。
关于ESP32 IDF的使用说明可以参考光放文档【ESP-IDF编程指南】,官方的例程在【examples】中,我之前的ESP32环境搭建教程中有examples的使用方法,即使编辑器版本升级了,但是操作方法还是没变的。

FOC入门算法

FOC控制算法相关视频和文档可以查看 【灯哥开源】的文档【dengFOC 文档】,里面有基本的入门教程和算法讲解。此处简单介绍其中的所需要的知识。

硬件控制原理

电机的运动本质上是靠开关六个MOS管,实现不同顺序的电流导通,从而控制电流从电机三根导线的流通速度和方向,进而实现磁场强度和方向的控制,实现电机的运动。而控制它的原因,需要理解电机内导电磁场与四周的电磁铁的位置关系与二者之间吸引力强度(力矩)的关系。所以FOC本质上就是找电机的三根导线实现的磁场与四周电磁铁在不同角度下如何能得到目标力矩的换算关系。

我们在硬件上,除了能够得到电机三个输入端的实时电流ia,ib,ic(这三个电流也需要被实时控制),还能通过位置传感器得到电机的旋转角度,即硬件上的AS5600传感器。而我们就是要靠这四个已知的值,加上一个目标值(本质上就是力矩,速度的大小也是靠力矩得到的),实现电机的运动控制。其中ia,ib,ic既是已知值,又是待求值。AS5600传感器可求得位置值。目标值则是可以转换为最终运动结果的值。
实现以上的运动结果,我们需要理解以下概念。

PWM

电机运动,是需要控制电流的大小和方向的。但是在硬件上,很难实现直接对电流的操作,而对电压大小的控制则更容易实现。因为根据U=I*R,R是电机的线圈电阻,可视为不变(变化范围很小,比如受温度影响)的,则调节U的大小,即可控制导通电流I的大小。
而控制电压U的大小的方式就是PWM。
百度百科 PWM
PWM是一种脉宽调制方式,简单的理解就是将一个只能输出0和1两种状态的数字电平(1只是代指最高电平,不表示实际电压),通过将其按照固定时间划分为一个个周期,在每个周期内按照百分比来切换输出高电平和低电平的时间,达到将一个周期内的能量划分为百分比输出的能量。而这个百分比输出的能量,则表现的最终状态就是最高电圧的百分比电压,从而实现电压调控。
通过在特定顺序的MOS管上使用PWM波形进行开关控制,就能得到需要的电压,进而得到需要的电流。

克拉克变换 与 克拉克逆变换

  • 直流无刷电机都是三根输入线,通过MOS管来实现两两一对的通断,于是在三根线上,就会有三个电流值,这三个电流值分别命名为ia,ib,ic,是我们可以实时测得的数据,就是硬件分析中每个电机上的两路电流采样芯片(由于后面的变换关系我们就知道了,实际上我们只采样两路电流值就能得知所有三相的值,所以电路上只有两路电流采样),他们的大小和方向都是随时间(运动)规律变化的值,因此可视为矢量值,也是我们FOC控制中最终要得到并实现控制的值。
  • 克拉克变换就是将这三个矢量变化的值进行降维换算,换算到静止的二维坐标系中两个方便计算的分量的算法。这个静止的坐标系命名为Iα-Iβ坐标系。
  • 克拉克变换变换后的结果简单理解就是以一个电机实物的中轴心为原点建立一个静态坐标系,电机转动角度为横坐标,两个分量值的大小位纵坐标,得到的电机运动时两个分量相对于运动角度的变化:
    image

具体可以参考【克拉克变换
以及【克拉克 (Clark) 变换中等幅值 (2/3) 和等功率 (sqrt(2/3)) 变换的公式推导
动图可以参考【克拉克和帕克变换
而 克拉克逆变换 ,就是反向升维计算的过程,也就是求解ia,ib,ic的过程,求解之后就能使用PWM控制MOS管,根据U=I*R来控制电流了。

具体公式此处不再列举,参考文档中的公式即可。

帕克变换

上一步的克拉克变换是变换为一个静止的二维坐标系Iα-Iβ上的两个分量值,得到旋转角度与分量的变化规律。
而帕克变换就是变换一下视角,将坐标轴跟随角度变化,得到两个值在变化的坐标系下的变化情况。这种变化的好处就是,将上一步变换后的系数矩阵进一步转换成为常数矩阵,而不是随着时间和空间量变化的系数矩阵,这样大大化简了分析发电机、电动机的电磁关系的微分方程。我们将这个跟随运动的坐标系命名为 Iq-Id坐标系。
其中Iq使目标磁场强度,也即力矩,是需要根据情况设定的值。Id常设为0。
于是,通过帕克逆变换,再通过克拉克逆变换,我们就将目标Iq值换算为可以操控的ia,ib,ic三个值,实现了电机的控制,也算打通了FOC的基本流程。其中还会用到一些小的方法或是算法,可以参考别人写的教程文档,后面不再细说。
image

关于帕克变换与实际电机运动的物理意义,还搞不明白的可以参考【通过帕克变换得到的Iq Id有什么具体的物理含义】,讲的通俗易懂。
具体公式此处不再列举,参考文档中的公式即可。

PID调节

PID是一种带反馈的控制算法。其中,P、I、D分别表示为 “比例(proportional)、积分(integral)、微分(derivative)”
具体说明可以参考【详解什么是PID
PID在FOC控制中,主要是用于电流反馈调节,但是对于其他可以基于反馈的参数都可以用来调节,比如位置调节,也可以调节Iq实现力矩调节。

  • 而电流的PID调节则主要是用于调节ia,ib,ic的值,之前说了,这三个电流值既是测量值,又是控制值,所以二者之间使用PID实现反馈调节,得到更加平滑的调节。在实际应用中,PID三个环不一定同时用,也有可能只用PI环或是PD环。
    而最终我们是需要操控PWM输出的,所以可以参考【PID算法与直流电机的PWM技术控制】来简单查看程序上PID与PWM的换算方法。
    更多PID实例和教程可以参考【理解PID算法:笔记整理
    这里有一个python的可视化PID调节的参考代码【PID-Example】,另外值得一提的是,他用的python的GUI库看着很不错,虽然没有QT那种便利的拖拽界面,但界面很绚丽,用法也很简单,值得使用。

软件驱动实现

AS5600读取

使用ESP32的IDF官方的IIC例子进行简单修改,就能很轻松的读取其中一路的AS5600的值,旋转电机就能看到值跟随变化。
但是ESP32的IDF控制双路IIC我还没有解决,使用库的IIC读写函数,没有发现能够简单切换IIC通道的方法,重新注册IIC通道,会出现报错甚至复位等问题,所以还需要一定的时间进行双路AS5600的读取测试,(IDF环境编译真的好慢,要不是arduino的跳转不好用,我都想换回arduino了),所以此处暂不放出代码。

PWM输出控制

PWM输出即通过每路三个引脚输出共计六路PWM波来控制两个EG2133芯片,进而驱每路六个共计12个MOS管的导通情况。
ESP32的IDF官方例程中,提供了一个FOC测试的例子,可以用于参考。

电流数据采集

电流的采集实际上就是从四路INA240A2PWR芯片上采集电压然后换算为电流值。
ESP32的IDF官方例程中,提供了ADC采集测试的例子,可以用于参考。

总结

综上,就实现了FOC的全流程的理解,和基本的几个硬件电路的驱动。由于时间关系,代码没有完善,此处暂不放出。

  • 本文水平有限,内容很多词语由于知识水平问题不严谨或很离谱,但主要作为记录作用,希望以后的自己和路过的大神对必要的错误提出批评与指点,对可笑的错误请指出来,我会改正的。
  • 另外,转载使用请注明作者和出处,不要删除文档中的关于作者的注释。

随梦,随心,随愿,恒执念,为梦执战,执战苍天! ------------------执念执战

posted on 2023-05-18 23:37  执念执战  阅读(248)  评论(0编辑  收藏  举报