背景和问题
汽车的驱动电机控制,转子位置和速度,都是通过一个专用的旋变芯片(RDC)来实现的。
RDC的基本原理是,给旋变输出10kHz的正弦激励信号,旋变在激励信号的基础上,把转子位置的sin和cos值进行调幅编码,反馈给RDC。RDC根据sin和cos信号进行解码锁相,得到转子位置信息。
为了做功能安全,需要监控RDC是否正常工作。最简单的思路就是,用CPU的AD对sin和cos信号进行采样,cpu重复计算出角度值,并和RDC输出的角度值进行比较。如果两者结果基本一致,可以认为RDC正常工作。
由于sin,cos是一个10kHz调幅的信号,如果CPU也以10kHz的频率对其进行采样,就可以完美的实现解调。
以旋变静止为例,转子位置固定为
θ
r
\theta_r
θr,输出的正余弦信号为
s
i
g
_
s
i
n
=
s
i
n
(
ω
e
t
)
∗
s
i
n
(
θ
r
)
,
s
i
g
_
c
o
s
=
s
i
n
(
ω
e
t
)
∗
c
o
s
(
θ
r
)
sig\_sin=sin(\omega_et)*sin(\theta_r),sig\_cos=sin(\omega_et)*cos(\theta_r)
sig_sin=sin(ωet)∗sin(θr),sig_cos=sin(ωet)∗cos(θr).
以上图为例,旋变静止时,若以10kHz的采样频率,sig_sin和sig_cos每次的值均相等,结果均为一条直线。
按下式计算得到转子位置也为一常数。
θ
r
=
a
t
a
n
(
s
i
g
_
s
i
n
s
i
g
_
c
o
s
)
\theta_r=atan(\frac{sig\_sin}{sig\_cos})
θr=atan(sig_cossig_sin)
但实际结果却事与愿违,通常sig_sin和sig_cos不是一条直线,而是一个低频的正余弦信号。如下图所示
原因分析
具体的原因应该是频率不匹配,也即RDC的激励信号频率和cpu的采样频率不完全相等。
理论上RDC输出的激励频率10KHz是按照RDC的晶振计算得到的。CPU的10kHz采样频率,是按cpu的晶振计算得到的。
如果两个晶振有偏差,则就不完全是10kHz了。
比如两个都用的是标称值10MHz、误差±20ppm的晶振。误差20ppm的含义为温度范围-20℃~+70℃,晶振的频率误差范围是:±(10MHz × 20ppm)=±200Hz。
对于输出的10kHz信号,则误差为±(10kHz × 20ppm)=±0.2Hz。就是说5s内(1/0.2=5),会有一个周波的差距。
所以就在sig_sin和sig_cos中存在了低频混叠。
影响
频率偏差造成的低频混叠,对sig_sin和sig_cos幅值影响是一致的,没有相位差。
角度计算,用的是 s i n _ s i g c o s _ s i g \frac{sin\_sig}{cos\_sig} cos_sigsin_sig,低频混叠并不影响两者的商。
但两者的符号在发生变化,比如sig_sin和sig_cos均为正值时,计算的转子角度为 θ \theta θ; 如果都为负值,计算的角度就为 π + θ \pi+\theta π+θ。
解决办法
这里篇幅太小,写不下。