一、直流有刷电机基础原理

直流有刷电机是做各类小车竞赛最常用的电机,主要原因是控制非常的简单:给电就转 Pasted image 20250801114029 Pasted image 20250801114042 直流有刷电机(brushed DC motor) 物理模型

任何电机都有定子和转子 定子: 红色绿色的两块大磁铁(永磁体)是直流有刷电机的定子,定子是静止不动的,定子的作用就是提供磁场。 转子: 转子就是在不停旋转的。 红色的commutator(换向器)和连接换向器的方形蓝色线圈就是转子的模型。换向器和方形线圈是刚性连接的。整个蓝色方形线圈都在由定子磁铁形成的磁场中,这里的理想物理模型是水平的、由N指向S的匀强磁场。

有刷电机工作时,转子需要通电。当转子的蓝色方形线圈中通有电流时,通过电磁感应原理,在磁场中的通电导线会产生安培力。安培力让电机转起来,使用左手定则可判断安培力的方向:

Pasted image 20250801114734

  • 电刷 石墨是导电的。石墨电刷是个软的、导电的刷子,电刷配合换向器,解决了两大难题:
  1. 电机电源线不会拧成麻花了。
  2. 电机在上述线圈竖直的情况下,正好是换向器的换向点,让方形线圈的电流反向,把两个安培力的方向反向,这样电机只要通一个恒定的直流电就可以朝着一个方向一直转下去。
  • 减速比 简单的原理:减速增矩:意思就是减小速度就可以增大扭矩。 初中物理学过:
    转换一下:
    而功率:
    功率是由供电决定的。在功率基本不变的情况下: 电机的转速越快,力矩就越小; 电机的转速越慢,力矩就越大。

减速比就是使用机械的方法(齿轮组)来降低电机的转速 Pasted image 20250801163126 小齿轮要转好多圈大齿轮才能转一圈,这就实现了减速,其扭矩也会以相应的传动比增大。

  • 什么情况下要用到减速增矩? 例子:目前材料有6V的电池和一个额定6V的小马达,要求用这个电机提起一斤的猪肉。 如果没有减速器,这对于小马达来说实在是太难了,这时安装机械减速器,把小马达包装成减速比为1:256的小黄电机,这样就能提起来一斤猪肉了。 另一个例子解释减速增矩:汽车起步,汽车起步要用1挡,也就是减速比最大的挡位,这样可以得到最大的驱动力。

大扭力电机: Pasted image 20250801164329 795电机的扭力可以达到0.5N* M,直流有刷电机能达到0.5N* M,也就是5kg* cm

  • 额定电压:规定额定电压是多少就要用多少V的电池供电

  • 空载电流和堵转电流: F=BIL,其中B是永磁体产生的磁感应强度,是不变的;L是线圈导线长度也不变;那么可以知道,电机的转矩是直接由电机的电流控制的。电流越大转矩越大。

空载电流应该是非常小的,电机无负载状态,即电机匀速转动。在无摩擦的理想状态下,匀速旋转不需要能量,电流为0即可保持匀速旋转。 但是空载还是需要一定的电流,来克服摩擦力和空气阻力,使电机的电磁转矩与这两个阻力矩平衡,但是这两个阻力相对于负载力来说还是太小了。所以空载电流就很小,所以此时电机两端的电压会很大。

堵转电流:电机用上了最大的力气(电磁转矩),也就是用上了最大的电流。流过电机的电流会很大,而这时的电机两端的电压会很小。

有刷电机相关的控制算法:PID速度闭环,PID位置闭环,PID电流闭环


二、步进电机原理及细分驱动控制

Pasted image 20250802105533

  1. 可以使用定时器来精确控制步进电机的转速;
  2. 由于步进电机的步距角一定,可以精确控制电机的位置

步进电机介绍: 步进电机的特点:

  1. 扭矩大。工作中的步进电机的轴的力气非常大,足以应对一些需要很大扭矩的工况,解决了一般的直流有刷电机“软弱无力”的问题。
  2. 精度高。步进电机最大的特点就是步进,不同于直流有刷电机给电就转,步进电机每次移动的角度是定死的,比如一步就转1.8°,非常精确。
  3. 外观好看。看起来高端大气。

步进电机的缺点: 转速低。步进电机主要应用于低速大扭矩。

步进电机原理: Pasted image 20250802105918 Pasted image 20250802110110 步进电机由定子和转子组成,上图是电机的定子结构,具体介绍上图: 与有刷电机的结构相反,步进电机的定子是线圈绕组,而转子是永磁体。有刷和步进电机的原理虽然都是基于电磁感应,但是结构和运行原理则是完全不同的。

常使用的步进电机是两相四线步进电机,步距角1.8°。 两相:电机只有A相线圈和B相线圈 四线:伸出了四个线头(A+,B+A-,B-),外部接线就只需要接这四条线。

定子中间的转子可以简化为一块永磁体:如下图, Pasted image 20250802111348 给A相通入A端流入,A1端流出的电流,发现A和A1两个线圈就变成了两块电磁铁,吸住转子,让转子保持在这个位置。

...待完成


三、直流无刷电机基础原理

【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术 - 知乎

直流无刷电机有三条线: Pasted image 20250822195705 直流无刷电机相比直流有刷电机,直流有刷电机有两条引线,稚晖君原话:“不要小看多出来的这一条引线,直接让电机控制从一维的标量变成了二位的矢量”

直流无刷电机的内部结构与步进电机非常非常相似: Pasted image 20250822195810

与步进电机相同的是:无刷电机的结构与步进电机是相同的,也是定子线圈绕组和永磁体转子

不同:步进电机是两相四线,无刷电机一般都是三相三线,大部分使用的无刷电机内部接线的三相中间是星形连接 星形连接在中小功率电机控制中有很多优势

无刷电机定子绕组手绘图:三相三线,星形连接 Pasted image 20250822200112

以六个绕组线圈为例: Pasted image 20250822200155 三个线圈交替得电就能让永磁体转子转起来: Pasted image 20250822200256 让bc两相接地,a相接电源,假设此时流入1A的电流,b和c相就各流过0.5A的电流。 根据电生磁的右手定则,三相线圈都产生磁场,并对中间的磁铁产生磁力。 根据同性相斥,异性相吸,看出三个磁力合力方向是水平向右的,所以转子磁铁方向就是图中的方向,N极向右 同样:如果是bc两相接电源,a相接地,那就是bc都流入0.5A的电流,a流出1A的电流,磁力方向相反。

另一种情况: Pasted image 20250822201727 B端悬空,a接电源,c端接地,这样只有两个绕组可以对永磁体有磁力,计算得到合力的方向和大小如上图。


四、快速上手直流无刷电机速度PID控制

市面上常用的直流无刷电机: |275 上图是转子在内,定子在外的直流无刷电机。

Pasted image 20250822202150 上图是转子在外,定子在内的无刷电机。

  • 无刷电机的参数: Pasted image 20250822202605 电机KV值: 电机的转速(空载)= KV值 X 电压; 例如KV630的电机在10V电压下它的转速(空载)就是6300转/分钟。 出轴直径:5mm螺纹,就找对应的5mm螺母,螺柱等连接需要的结构。 极对数:7 直流无刷电机的永磁体是N极、S极成对交替排列的。N极加S极的数量就是电机的级数,其成对的数量就是电机的极对数。电机极对数=电机极数/2 。 Pasted image 20250822203004 极对数越大,电机转矩越大。极对数越小,电机转速越高。 工作电压:推荐12V,又标注3s-4s,那理论上可以到16V。 工作电流:10A,一般来说工作电流在10A及以上的电机就可以拿来做机械臂力矩电机提重物用了。

有刷电机控制仅用一个H桥通过PWM就可以控制电机转速,但无刷电机的控制电路比H桥要复杂

快速上手无刷电机速度控制,且控制目标是以下内容: 使用无刷电机驱动无人机; 使用无刷电机应用在一些高速旋转的情况下,比如水下推进器、电动艇; 也就是完全把无刷电机当做一个强度可调的动力源

可以选择一款电机控制产品来快速实现控制要求: 直流无刷电机电子调速器 简称无刷电调,又直接简称“电调” Pasted image 20250822210958 接线: Pasted image 20250822211314 T插,XT60和很粗的两条线:一条红一条黑 三头杜邦线,三条蓝色的粗线,各接了一个3.5mm的香蕉头

红色黑色的粗线用来接电源;三根蓝线接无刷电机的三条线,三条线顺序随意,任意对换两条线的顺序则电机转向反向。 三头杜邦线:白色信号线接PWM,红色是5v可不接,黑色接GND

所以无刷电机的控制方式也明确了,通过一路pwm输入到电调里就可以控制无刷电机转速了,非常简单,变得跟有刷电机一样简单了。

  • 电调参数: Pasted image 20250822212644 输出能力:持续电流12A:同一个电机,电流越大电机的扭矩越大,等负载下转速也越快 电源输入: 接多大的电池。两节电池组, 一节锂离子电池是3.7V,充满电是4.2V,两节就是8V,三节就是12V。电源输入参数还可以看电调上标的另一个参数: 2-3S,代表可以接2-3个锂电池组,也就是8V-12V电源都可以。 BEC: BEC 全称是battery elimination circuit,免电池电路,也就是电调可以外部给别的设备供电,输出5V,最大电流2A,通过三条“舵机线”中间红色的那一条 但大多数情况不使用它供电,因为是线性稳压器,效率太低,更容易发热。 油门信号频率范围:控制电调的PWM频率,50HZ,跟舵机又是一模一样 最后是支持的电机最高转速,基本都是万转以上,非常快了。

使用电调时要注意两点:

  1. 并不是电调通上电就马上能控制电机的,你要先向电调输入一串“开机密码”,这串密码就是几段不同占空比的PWM。
  2. 电调只能作为一直旋转的精度一般的动力源,电调控制无刷电机低速旋转的效果非常差,几乎不可用,只能高速旋转作为动力源。

五、直流无刷电机矢量控制(FOC)引子

一般的无刷电调只能大致控制电机转速,并不能精确控制速度,而且更不能让电机低速精确运动 要实现的核心控制目标:无刷电机的力矩控制

换相的频率和电流的大小共同决定了电机的转速 需要想一个办法:让电机在变负载的情况下还能稳定的低速匀速运动

Field oriented control(FOC) 磁场 定向的 控制

两个关键点:

  1. 怎么保证电机效率最大,不发热?
  2. 怎么检测并控制当前的扭矩大小?

六、FOC算法核心

怎么让电机的效率最大,不发热

将所有的电流路径排列组合列出来: Pasted image 20250825094829 可以得到六个方向,大小相等的磁力: Pasted image 20250825094849 Pasted image 20250825094902

如果想生成一个30°的合磁力: 按上图的0°状态通一段时间的电,再按60°状态通一会电,当这个“一段时间”足够小的时候,两个力平均下来就是30°了。 按这个道理,0°~360°任意一个方向的力都可以生成 这就是SVPWM——矢量控制

合磁力施加于转子永磁体上,N极的方向会转到与F相同的方向。 Pasted image 20250825100241 N极方向与F方向一致时,转子停止 Pasted image 20250825100319 在FC与转子N极方向差90度的时候转子的角加速度最大; 在FC与转子N极方向差0度的时候角加速度最小,等于0。 Pasted image 20250825100502 根据能量守恒,通入定子线圈的电能一部分转化为了磁势能,另一部分产生热量 磁势能是电机旋转需要的能量,产热没什么用,所以为了使电机运转效率最大,需要控制“磁势能”始终处于最大状态,即: 希望合力的方向永远与转子N极所指方向差90°

实现:已经可以在理论上做到生成任意一个方向的磁力,只需要通过编码器实时监测转子的位置,就可以闭环控制了


怎么检测并控制扭矩大小

电流大小与转矩大小正相关: 通过检测实时电流,计算出实时转矩,从而实现转矩的闭环控制

用手转动无刷电机,电流表测量三根线上发现电流是三相正弦交流电,这三相正弦交流电就是电机的反电动势产生的感应电流

发电机反过来就是电动机,所以也要通入三相正弦交流电才能让无刷电机平稳最大效率旋转 Pasted image 20250825101243

正弦波控制是最平顺最精确的控制,而方波只适用于高速旋转,粗略控制 Pasted image 20250825101339 三相电流的相位互差120°;

电角度: 机械角度θm就是电机绕轴转一圈,对应0°~360°,那电角度θe就是:

mod(a,b)函数是用来求a/b的余数,pn是转子极对数,假设极对数pn=4,那么机械角度与电角度的关系如下图:Pasted image 20250825101657

简化三相正弦电流控制 在转矩恒定(与转子N极方向垂直的磁力大小始终不变)的情况下,点击可以平稳运行 磁力是电流产生的,即三相电流的在磁力方向上的投影也是个定值

难点:转子是在不断旋转的,所以与转子N极垂直的力也是不断旋转的,所以目标坐标系是个旋转坐标系。 设三相电流分别为ia,ib,ic,建立abc三相静止自然坐标系: Pasted image 20250825102322 然后设转子当前电角度为θ(因为模型假设是a,b,c三个绕组,极对数=1),建立转子同步旋转坐标系dq系Pasted image 20250825102410 其中,d轴与转子N极位置相同,称为“直轴”; q轴与转子N极位置超前90°,称为“交轴”。 把abc三轴的初始电流投影到dq轴即可。

第一步:Clark变换。 建立一个中间坐标系 αβ系: Pasted image 20250825102812 先把abc三相自然坐标系的三个量投影到 αβ系——两相正交静止坐标系。 这样三个量就被简化成两个正交量,方便下一步投影。

根据KCL,电流 流入=流出,所以:

投影运算: ![Pasted image 20250825103037](/assets/blog/%E7%94%B5%E6%9C%BA%E6%8E%A7%E5%88%B6/images/Pasted%20image%2020250825103037.png) ![Pasted image 20250825103049](/assets/blog/%E7%94%B5%E6%9C%BA%E6%8E%A7%E5%88%B6/images/Pasted%20image%2020250825103049.png) iβ的计算与上面同理,不再赘述。

为什么要有个等幅值变换

因为正常的投影运算之后,iα与iβ的值是ia、ib、ic幅值的3/2倍,为了简化之后的运算,所以将投影大小缩放到与ia、ib、ic幅值相同。

第二步:Park变换 Pasted image 20250825103727 将αβ系的两相再投影到dq系。 Pasted image 20250825103755 这个θ在电机运动的时候是会变的,dq坐标系是在旋转的。 搞完这两步之后,会惊奇地发现: Pasted image 20250825104014 变成恒定值了

三相初始电流原本是三相互差120°的正弦波: Pasted image 20250825104042 经过Clark变换后: Pasted image 20250825104052 变成两相互差90°的正弦波了,再经过Park变换: Pasted image 20250825104103 变成两条直线 其中id是直轴电流,即投影到N极方向的电流 iq是交轴电流,即投影到N极超前90°方向的电流

其中发现id的大小是跟ia,ib,ic的幅值大小相等的,iq是0。 电流的方向也是磁力的方向,投影一直都在id方向,iq没有,说明磁力一直与转子N极方向重合

Pasted image 20250825104415 t=0.04时,此时电角度是0,说明转子位置与abc坐标系中的a轴重合 此时看图得ia=30,ib=ic=-15,所以此时的合磁力应该也是与A轴重合的,所以转子方向与电流方向始终是重合的,导致id一直是最大,iq一直是0。

假如把这张图的电角度向右平移1/4个周期,让0.04s时合磁力为0°时转子N极滞后90°,也就是270°位置,那最后这张图就变成了: Pasted image 20250825104618 id=0,iq=30。 这是需要的效果: id是重合于转子方向的,不需要; iq是与转子方向超前90°的,需要。

所以电流闭环需要两个PID,一个控制id,一个控制iq。 id的目标值就始终是0; iq的目标值于转矩成正比。


七、SVPWM技术原理及代码分析

  1. 怎么保证电机效率最大,不发热?

时刻保证希望F的方向永远与转子N极所指方向差90° 2.怎么检测并控制当前的扭矩大小? Clark、Park坐标系变换,让电流与扭矩的关系变为线性。

开始实际的FOC驱动器设计:

直流无刷电机的电机控制电路 Pasted image 20250825232107 a,b,c这三相线圈,每一相都要既能流入电流又能流出电流 也就是每一相的端子既可以接VCC又可以接GND

也就是每一相都要接一个外部的特殊开关,这个开关可以控制这一相接到VCC或GND,三相就需要三个这种特殊开关 Pasted image 20250825232618 Pasted image 20250825232354 三相全桥逆变器

右边,下图这部分电路是直流无刷电机的电路模型:有一定内阻的电感线圈: Pasted image 20250825232437 完美解决了每一相都可以接到VCC或GND的要求

也就是: Pasted image 20250825232925 通过这个电路,通过6个MOS管的开关组合,就可以生成上图这六个方向的磁力。

由于每个桥臂上的两个场效应管的导通状态必须相反(不然VCC和GND之间就短路了),因此三相全桥逆变器共有8种状态,可以用矢量表示,其中有六个非零矢量U1(001)、U2(010)、U3(011)、U4(100)、U5(101)、U6(110);以及两个零矢量U0(000)和U7(111),也就是全关或者全开。

进而扩展到生成360°任意方向的电压矢量,用类似PWM的技术去实现,详细分析一下 Pasted image 20250825233415

  • 电压空间:0-360°电角度的这个二维空间 因为三相全桥逆变器可以直接控制的物理量是相电压,也就是电压。

如何控制电压: Pasted image 20250826103029 每一个半桥电路都只需要一路PWM控制,因为虽然一个半桥电路有两个MOS管,但是这两个MOS管的状态必须相反,一个打开另一个必须关断

所以一个半桥电路只需要一路PWM控制,上管给PWM,下管给这个PWM的互补波形

U4(100)的时候,只有第一个半桥上管打开,连接上端VCC。 假设这路PWM的占空比是100%,那上管就一直打开,电机这一相的相电压就最大,设为是1V;占空比是70%,那上管一个周期内只有0.7个周期打开,电机这一相的相电压就是0.7V。

目标是控制定子产生的磁力大小和方向;而磁力跟线圈电流是正比的,是线性关系,所以控制电流就控制了磁力

没办法直接操控电流大小。只能直接控制电压,相电压与线电流正相关,但不是线性关系

所以通过控制三相全桥逆变器从而控制相电压,从而间接影响每一向的线电流,电流再决定磁力的大小


Pasted image 20250825233415 其次,上图(a)图的电压空间被分为了6个“扇区”,每个扇区60°。 看上图(b),假设要生成第一扇区内任意一个方向的电压空间矢量Uref,Uref和U4之间夹角为θ,要合成Uref只需选择U4和U6作为非零矢量,U0和U7作为零矢量,根据平均值等效原理>(即在一个开关周期内通过对基本电压矢量加以组合,使其平均值与给定电压矢量相等,这里可以理解成PWM原理+矢量的平行四边形定则,两种思想),可得:

上式离散化后等效为以下公式:
上式再移个项:
,原理就是PWM的原理+平行四边形定则 注意这两个公式里Uref、U4、U6都是矢量!矢量相加要用平行四边形定则!

其中Tref、T4、T6分别为总作用时间(一个开关周期)、U4的作用时间、U6的作用时间,U0* 就是U0或U7,零矢量就是调节Uref幅值使用的,对Uref的方向无影响。

Tref很短,跟PWM一样,周期需要毫秒级、微妙级,才能有好的矢量合成效果。

这种合成方法与PWM的原理非常像,其实就是PWM的原理,所以这个利用平均值等效原理的类似PWM的矢量合成方法叫做: SVPWM(space vector PWM)空间矢量的PWM。

如果想生成Uref,首先需要固定Tref,也就是SVPWM频率,设频率为10KHz,也就是Tref=1/10K秒,固定不变。 然后需要确定T4、T6,也就是U4的作用时间和U6的作用时间 Pasted image 20250826110402 以Uref为斜边的三角形,通过正弦公式得到:

其中规定 |U4| = |U6| = 2/3 Udc,Udc是电源电压,又叫母线电压 因为: ![Pasted image 20250826110712](/assets/blog/%E7%94%B5%E6%9C%BA%E6%8E%A7%E5%88%B6/images/Pasted%20image%2020250826110712.png) 每一相的相电压最大就是 2/3 Udc,所以这里要限幅。

所以得到非零矢量的作用时间:

其中m为SVPWM的调制系数(即调制比),
而零矢量作用时间为
这样就确定了T4、T6的值
  • T0为什么等于T7? Pasted image 20250826111356 上图就是以第一扇区为例,实际的SVPWM应用中,3路PWM的样子。 在实际电路控制中,为了尽量减小MOS管开关损耗,需要考虑如何生成合适的PWM波形,降低MOS管开关次数。所以,在SVPWM中将基本矢量作用顺序的分配规则定为:每次开关状态转换时,只更改三相中的一相。同时为了使得所产生的波形对称并且降低噪声,并对零矢量的作用时间进行均分处理

    第一个扇区是这样找,其他五个扇区也是完全一样的方式:

    SVPWM开关切换顺序表 Pasted image 20250826111534

为了实现对称的PWM波形,需要确定各个扇区内的开关切换顺序。在第一扇区中,当从U4切换到U0时,只需对A相控制上下桥臂的两个场效应管进行开关切换动作,如果由U4切换到U7,则需同时对B、C相桥式电路中的场效应管进行开关切换动作,此时由于场效应管内电路通断引起的开关损耗将增大一倍。因此: ==在切换U4、U2、U1时,要配合零电压矢量U0; 在切换U6、U3、U5时,要配合零电压矢量U7;==

  • C语言写的SVPWM算法,这是FOC控制的核心算法电机完全靠这个函数转起来,这个函数的输入参数有三个: Uq和Ud是目标交轴电压和直轴电压。对于控制中小型电机时,Ud一直设为0即可,只需要控制Uq的大小来间接控制电流大小,也就是间接控制扭矩大小。 第三个参数angle就是转子当前电角度
void FOC_SVPWM(float Uq, float Ud, float angle) {
    int sector;  //sector即扇区
    float Uout = _sqrt(Ud * Ud + Uq * Uq) / VOLTAGE_LIMIT; 
    // VOLTAGE_LIMIT是宏定义,就是电源电压,12V电源的话它就=12。
    //希望Ud一直=0,所以这里的Ud一般都=0,所以这句代码可以简化成:
    // Uout = Uq / VOLTAGE_LIMIT;
    angle = _normalizeAngle(angle +  atan2(Uq, Ud));   
    //这是最核心的一句。_normalizeAngle函数附在后面,先去看看这个函数。
    //angle就是编码器实时读取的当前电角度值,范围是0~360度,atan2函数是math.h中的函
    //数,用于求角度的反正切值,需要你自己去百度搜下这个函数的用法。
    //这里我们发现,由于Ud是一直=0的,所以当Uq>0时,atan2(Uq,0)=π/2;
    //当Uq<0时,atan2(Uq,0)=-π/2
    //为什么说这里是核心?因为就是这里让目标电压矢量一直超前或滞后于当前角度90°。
 
    sector = floor(angle / _PI_3) + 1;
    //angle是0~360度的电角度,首先要判断当前angle在哪个扇区,前面的图划分的六个扇区。
    float T1 = _SQRT3 * _sin(sector * _PI_3 - angle) * Uout;   
    float T2 = _SQRT3 * _sin(angle - (sector - 1.0f) * _PI_3) * Uout;
    float T0 = 1 - T1 - T2; 
    //上面这三个公式就是我们之前解三角形得到的求T4和T6的公式,并进行了推广,推广到
    //所有的扇区通用的公式。其中T1+T2+T0=1
    float Ta, Tb, Tc;
    //下面的代码非常重要,牵扯到真正PWM的生成了。Case 1也就是我们之前分析的第一扇区,
    看懂下面的代码我们要回忆前面的那张svpwm图,也就是代码下方的图:
    
    //这里的PWM也跟以前的那种控制舵机的PWM不一样!之前我们用的PWM都默认是左对齐,
    //但这里的PWM是中心对齐的!这里非常非常重要!这个对齐方式的参数需要在PWM配置的库
    //函数里调,后面会讲。看代码下面的PWM图,再对比下面的case 1里的代码就能看懂了。
    //其他五个扇区同理。
        switch (sector) {
            case 1:
                Ta = T1 + T2 + T0 / 2;
                Tb = T2 + T0 / 2;
                Tc = T0 / 2;
                break;
            case 2:
                Ta = T1 + T0 / 2;
                Tb = T1 + T2 + T0 / 2;
                Tc = T0 / 2;
                break;
            case 3:
                Ta = T0 / 2;
                Tb = T1 + T2 + T0 / 2;
                Tc = T2 + T0 / 2;
                break;
            case 4:
                Ta = T0 / 2;
                Tb = T1 + T0 / 2;
                Tc = T1 + T2 + T0 / 2;
                break;
            case 5:
                Ta = T2 + T0 / 2;
                Tb = T0 / 2;
                Tc = T1 + T2 + T0 / 2;
                break;
            case 6:
                Ta = T1 + T2 + T0 / 2;
                Tb = T0 / 2;
                Tc = T1 + T0 / 2;
                break;
            default:
                // possible error state
                Ta = 0;
                Tb = 0;
                Tc = 0;
    }
    // transform duty cycle from [0,1] to [0,_PWM_RANGE]
    // _PWM_RANGE是个宏定义,与生成pwm的定时器的自动重装载值有关、
    // _PWM_RANGE=TIM_arr
    TIM_SetCompare1(TIM1,_PWM_RANGE*Ta);
    TIM_SetCompare2(TIM1,_PWM_RANGE*Tb);
    TIM_SetCompare3(TIM1,_PWM_RANGE*Tc);
}

Pasted image 20250826115537 _normalizing函数: Pasted image 20250826115555


八、FOC驱动器电路设计

Pasted image 20250826162029 就像直流有刷电机需要L298N的H桥电路, FOC电机驱动电路的核心是:三相全桥逆变器。

上图只是最基础的模型,由6个MOS管组成,还需要加很多的外部电路,比如:

  1. mos管都需要栅极驱动器
  2. 电源输入、降压模块
  3. 电机连接端子等

完整的三相全桥逆变器电路: Pasted image 20250826163938 1. 每个MOS管连接一个2.2R栅极电阻用于限制电流上升速度,从而减小因为高速上升的电流导致的干扰和噪声; 2. 在每个栅极电阻上并联反向二极管用以将栅极电荷回流和保护MOS管免受栅极到源极之间的反向电压冲击。

并且每一个半桥电路的上下桥臂都共用一个栅极驱动器,EG3014 EG3014 三个半桥电路就需要三个EG3014: Pasted image 20250826165715

以A相的半桥电路为例: Pasted image 20250826170119

以上是三相全桥逆变器电路的详细设计,但是mos管外置的电路是用来驱动大功率电机的,但是现在想控制一款小电流小扭矩的无刷电机,找一款MOS管集成在芯片内的芯片,如下

DRV8313

Pasted image 20250826170433 三个——半H桥——驱动器IC。半H桥就是半桥。 Pasted image 20250826171823 芯片内部以及外部接线示意图

Pasted image 20250826173421 CP1和CP2外接一个103、耐压要大于两倍电源电压的飞跨电容,飞跨电容是电荷泵的内容,这里的电荷泵可以先理解为一个降压的DCDC开关电源,把电源电压降压给MOS管的高端供电,跟EG3014的自举电容的作用是一样的。

Pasted image 20250826180346 IN1,IN2,IN3分别是三路PWM输入,分别单独控制三个半桥电路,并且芯片内部会给半桥电路自动生成互补波形,很省事。 EN1,EN2,EN3 直接3.3V就行了,使能引脚。

Pasted image 20250826180440 VM是电源电压,8.2V~60V,给电机提供电能,所以需要接储能电容和旁路电容储能和滤波

Pasted image 20250826180555 VCP引脚是引出的高端栅极驱动的电压,官方要求这个引脚要连接一个104电容到VM

Pasted image 20250826180700 低电平分别使能复位、睡眠模式、错位模式。都用不到,全部上拉 别的引脚不需要管了

Pasted image 20250826180750 注意芯片底部也有一个焊盘:thermal pad 一定要焊上,连接到PCB方便散热的功能

Pasted image 20250826180915 IN1、IN2、IN3直接接STM32的PWM OUT1、OUT2、OUT3直接接电机三根线

完整的驱动器电路: Pasted image 20250827105522 左边都是老朋友了 右边有个AMS1117-5.0,用于将12V电池降为5V的LDO

SPX3819-3.3是一个降压到3.3V的LDO,选它而不是AMS1117-3.3是因为它体积小,想把驱动器体积做的尽量小

TJA1050是CAN通信芯片

  • AS5600 Pasted image 20250827110541 第一次见,有上拉电阻的SCL、SDA,这是一个IIC协议的传感器 这个芯片是个磁编码器

Pasted image 20250827110724 上图这个有A相B相的编码器,且两个方波相差90°,叫增量式编码器

而AS5600编码器完全不是上面这种两个方波的,AS5600是一个iic传感器,用法更像是MPU6050

AS5600属于绝对式编码器,返回的内容就是iic协议的角度值 Pasted image 20250827111144

  • AS5600 如何检测电机的绝对角度 Pasted image 20250827111606 将磁铁用胶水黏在电机后转轴上 Pasted image 20250827112035 有了这块磁铁,磁编码器就可以通过感受磁铁旋转时的磁场变化去感知角度。 其中AS5600芯片距离圆形磁铁的距离应该保持在0.5mm~2mm之间。这就涉及机械安装问题了,买铜柱的时候要选好尺寸,控制好距离