无刷直流电机的无位置传感器控制学习笔记

BLDC与PMSM关系

关于这个问题,很多人不太注意,我见过很多人把无刷直流电机和永磁同步电机不区分,以至于出现了正弦波无刷直流电机这样的叫法。实际上,在学校里面学习的时候,这个还是区分开的。一般把梯形波反电动势的叫无刷直流电机(BLDC),正弦波反电动势的称为永磁同步电机(PMSM)。BLDC适合用六步换相法(方波)驱动, PMSM适合用矢量控制(正弦波)驱动。
当然,考虑到实际的电机设计过程中,永磁同步电机和无刷直流电机的反电动势都没有那么理想,梯形波的反电动势可能平顶区域可能不是120°,而PMSM的反电动势正弦程度达不到那么高,因此,一台实际无刷直流电机用六步换相法或者矢量控制都可以驱动。

无位置传感器策略

实际上,我们去看ST、TI等厂商,他们都已经提供了无刷直流电机的驱动方案。这些方案大多前提都是以六步换相法(方波)来驱动电机的。因此,这里主要介绍方波驱动下的无位置传感器方案,正弦波驱动下的无位置传感器方案可参考永磁同步电机的无位置传感器方案。
无刷直流电机的无位置检测关键在于检测反电动势,根据反电动势找到换相点。一般厂商都是找反电动势基波检测,基波的过零点延迟30°就是换相点,而三次谐波的过零点就是换相点本身,不过反电动势三次谐波不太好检测,ST和TI(早期)提供的是基波检测。

ST的BLDC无位置传感器控制

ST的方案可以去官网找资料看,也可以通过《无刷直流电机控制应用 基于STM8S系列单片机》这本书看,里面的方案对stm32和stm8系列单片机都适用。
考虑到随着嵌入式的发展,许多单片机具有A/D触发采集功能,因此使用软件进行过零比较,可省去许多硬件成本,降低系统的复杂性。因此,ST提出了一种综合了低速和高速情况下的反电动势检测法。该方法基于上桥PWM斩波、下桥恒通的PWM单斩调制方式。

根据A/D采样时刻的不同,反电动势检测的方法可以分为三种:在功率管导通时刻采样、在功率开光管关断时刻采样和所有状态时刻采样。

整体的反电动势检测图如下
无刷直流电机的无位置传感器控制学习笔记_第1张图片

在功率开光管导通状态时采样

无刷直流电机的无位置传感器控制学习笔记_第2张图片
同端电压检测法类似,在PWM导通时刻检测到的反电动势,与HV/2的参考电压作比较,得到反电动势过零点。
无刷直流电机的无位置传感器控制学习笔记_第3张图片
在PWM导通时刻采样,不必考虑相位偏移。
此方法的不足之处在于

  1. 由于电阻分压,使得反电动势过零点检测灵敏度收到影响
  2. 由于在功率开关管导通时刻进行,因此必须具有最小的功率开光管导通时间,难以保证电机低速运行

在功率开光管关断状态时采样

由于续流二极管和线圈电感的作用,在下管恒导通时,AB相电流流向如图所示。
无刷直流电机的无位置传感器控制学习笔记_第4张图片
忽略二极管压降,加在A相电压为0,那么根据图中可以分析,中性点电压理想值为0,即地。将C相反电动势的检测值直接与该电压值比较。可得过零点时刻。
这种方法无需创建虚拟中性点,不需要电阻分压和阻容滤波。只需要3个电阻将电机的三相连接到单片机/DSP的三个输入引脚即可。
无刷直流电机的无位置传感器控制学习笔记_第5张图片
这种方法的集成度高,且无须外加反电动势检测电路,最大限度降低成本;不需要分压,信号无衰减,可以得到反电动势的全部信号;反电动势在功率开关管关断时采样,因此抑制了高频开关干扰;灵敏度高,可以在很大的速度范围内驱动电机,使电机在很低的速度运行且可以最大转矩启动;使用数字滤波器代替模拟滤波器,避免了滤波延时;提高了信噪比。
这种采样方式的不足之处在于:当速度达到一定高度时,由于不同电机的反电动势常数不同,得到的反电动势电压不同。对于同一单片机其芯片参考电压为固定值,当反电动势高于参考电压时,需要考虑单片机的承受能力。由于此方法是在开关管关断时刻进行,所以必须保证最小的功率开关管判断时间,使得PWM占空比无法达到100%。

在功率开关管所有状态时刻采样

集中前两者的优点。
无刷直流电机的无位置传感器控制学习笔记_第6张图片
将采样电路的分压电阻不是直接接地,而是连接到单片机的I/O口,根据不同的PWM占空比和速度要求,选用不同的采样方法。当在功率开关管结束时采样,I/O口配置为悬浮输入,即不对进行电阻分压;在功率开关管开通时采样时,I/O口配置为推拉输出,且输出为低,即是对采样信号进行分压。根据采样方法,由I/O口的配置来决定是否分压,容易实现。
在实际应用中,可以根据PWM占空比和速度范围的要求选择合适的采样方法。

TI控制方案-软件过零比较检测

它的整体控制框图是这样的
无刷直流电机的无位置传感器控制学习笔记_第7张图片
这边加了反电动势的检测电路
无刷直流电机的无位置传感器控制学习笔记_第8张图片
定子端的电气模型认为是
无刷直流电机的无位置传感器控制学习笔记_第9张图片
假定相位C是非导通相,可使用以下等式表达三个端子电压:
V a = R I a + L d i a d t + E a + V n V b = R I b + L d i b d t + E b + V n V c = E c + V n \begin{array}{l} {V_a} = R{I_a} + L\frac{{d{i_a}}}{{dt}} + {E_a} + {V_n}\\ {V_b} = R{I_b} + L\frac{{d{i_b}}}{{dt}} + {E_b} + {V_n}\\ {V_c} = {E_c} + {V_n} \end{array} Va=RIa+Ldtdia+Ea+VnVb=RIb+Ldtdib+Eb+VnVc=Ec+Vn
由于每次只有两个电流流入定子绕组,两个相位电流时相等且相反的。因此,
I a = − I b {I_a} = - {I_b} Ia=Ib
因此,通过将三个端子电压等式相加,可获得:
V a + V b + V c = E a + E b + E c + 3 V n {V_a} + {V_b} + {V_c} = {E_a} + {E_b} + {E_c} + 3{V_n} Va+Vb+Vc=Ea+Eb+Ec+3Vn
图9中显示了BLDC 电机的即时反电动势波形。从这个图表中,可以很明显地看出,在反电动势过零点上,三个反电动势的和等于零。因此,最后一个等式精简为:
V a + V b + V c = 3 V n {V_a} + {V_b} + {V_c} = 3{V_n} Va+Vb+Vc=3Vn
无刷直流电机的无位置传感器控制学习笔记_第10张图片
这个等式在代码中执行以计算中性点电压。在代码中,3Vn 的数量由被称为neutral 的变量表示。
对于非导通相(零电流),定子端子电压可被重新表示如下:
3 E c = 3 V c − 3 V n 3{E_c} = 3{V_c} - 3{V_n} 3Ec=3Vc3Vn
在代码中使用这个等式来计算非导通相C的反电动势过零点。用相类似的等式来计算其它反电动势电压 E a E_a Ea E b E_b Eb 的反电动势过零点。由于反电动势过零点内的影响,有可能只检查反电动势符号变化;这假定反电动势扫面环路周期远远短于机械时间常量。这个函数在三个端子电压采样后计算,通常情况下每50 μ s μs μs一次。
在相位换相的瞬间,由于直流电平或寄生电感和电源电路板的电容,有可能出现高dV/dt 和dI/dt毛刺脉冲。这可导致对经计算得出的中性点电压的误读。这可以通过在新的相位换相发生时丢弃反电动势的头几个扫描来克服。在代码中,这由名为‘NOISE_WINDOW_CNT_MACRO’函数执行。持续时间取决于电源开关、电源电路板设计、相位电感和驱动的直流电流。这个参数是系统相关的,并且被被设定为电机低速范围内的一个较大的值。随着速度增加,由于在较高速时也逐渐接近反电动势过零,此软件逐渐降低这个持续时间。
在有效传感控制中,反电动势过零点在相位换相瞬间移动30°。所以,在借助六个过零事件运行无传感器BLDC 电机前,为了实现精确换相点,有必要计算相对于这个30°延迟角的时间延迟。这可通过执行一个位置内插函数来实现。在这个软件中,执行如下:让T 为转子完成之前旋转所需的时间,而 α α α 为所需的延迟角。用360°除以 α α α,并将结果乘以T,就获得了下一相位对换相前花费的时间长度。在代码中,这个延迟角被固定为30°。相应的时间延迟用采样时间周期的数量表示,并被存储在变量cmtn_delay 中。因此,
T i m e d e l a y = c m t n _ d e l a y ∗ T s = T ( α ˙ / 360 ) = v _ t i m e r ∗ T s ( α ˙ / 360 ) = v _ t i m e r ∗ T s / 12 \begin{array}{l} Time{\rm{ }}delay{\rm{ = }}cmtn{\rm{\_}}delay{\rm{*}}{T_s}\\ {\rm{ = }}T{\rm{(}}\dot \alpha /360)\\ {\rm{ }} = v\_timer{\rm{*}}{T_s}(\dot \alpha /360)\\ {\rm{ }} = v\_timer{\rm{*}}{T_s}/12 \end{array} Timedelay=cmtn_delayTs=T(α˙/360)=v_timerTs(α˙/360)=v_timerTs/12
在这里,Ts 是采样时间周期,而v_timer 是计算转子之前旋转期间采样周期数量的定时器。
上面的等式被进一步简化为:
c m t n _ d e l a y = v _ t i m e r / 12 cmtn{\rm{\_}}delay = v\_timer/12 cmtn_delay=v_timer/12
在代码中执行这个等式来计算相对于30°换相延迟角的时间延迟。

你可能感兴趣的:(电机控制)