最近想起来,以前在做EMI整改的时候,出现过低频辐射超标,类似下面这种。
![“"](http://mouser.eetrend.com/files/2021-01/wen_zhang_/100061281-120608-1.png)
一般这种问题,我们都会说是时钟线引起的问题。我之前做的产品是摄像头,时钟线加十几根数据线。有一次处理完时钟线后还是超标,因为正好数据线上都串有电阻,我就将电阻都改成了磁珠,想消除因为数据线引起的辐射,改完之后发现还是超标,看不到有明显的改善。
从那时,我就知道了,辐射一般都是时钟线引起的,与数据线关系不大。不过那时,我一直都不明白为什么会如此。
因为在我看来,时钟线和数据线的上升沿都差不多,按说频率分量应该是一样的呀。虽然时钟线的高低电平交替变化会多一些,但是数据线有十几根了,难道加起来还比不上时钟线吗?
实际上数据加起来还真比不上时钟线。
关于这一点,理论可以这么解释:周期信号由于每个取样段的频谱都是一样的,所以他的频谱呈离散形,但在各个频点上比较大,通常成为窄带噪声。而非周期信号,由于其每个取样段的频谱不一样,所以其频谱很宽,而且强度较弱,通常被称为宽带噪声。然而在一般系统中,时钟信号为周期信号,而数据和地址线通常为非周期信号,因此造成系统辐射超标的通常为时钟信号。
不过呢,这一段话本身就是一个结论,说服力不强,也就有点不敢相信。下面还是来做个实验模拟下,我们会发现新东西。实验思路很简单,那就是分别得到时钟线和数据线的频谱,两者比较下就知道了。
构建时钟和数据信号
我们使用MATLAB来分析频谱,首先需要构建时钟和数据信号。
时钟信号很容易,就是高低电平交替变化。正常情况下,数据线都是不规律的,那就采用随机生成的方式。
构建时钟和数据信号如下图。
![“"](http://mouser.eetrend.com/files/2021-01/wen_zhang_/100061281-120609-2.png)
构建时钟CLK和10根数据线如上图。说明一下,为了减小运算量(软件运行时间),时钟频率设置为1Hz。
得到频谱
我们分别画出时钟的频谱,1根数据线的频谱,10根数据线频谱的叠加。
需要注意的是,因为数据线的数据是非周期的,我们尽量时间取长一点,下图分析的数据长度为Num_T=1000个时钟周期。
![“"](http://mouser.eetrend.com/files/2021-01/wen_zhang_/100061281-120610-3.png)
从图可以看出,周期性时钟信号的频谱是离散的,非常典型,这个相信大家已经见过多次了,而数据线的频谱是比较宽的。这与文章最前面说的是一致的。
并且,图中右下角有1根数据线和10根数据线相加的频谱。我们也可以看到,10根数据线相加之和,幅度最高的频谱分量幅度值大概是0.4左右,而时钟的基频分量最高为0.6,也就是说数据线加起来,确实抵不过CLK时钟信号。
一个问题猜测
前面的频谱分析有一个前提条件,那就是,取样的时间长度是Num_T=1000个时钟周期,即分析的数据长度是1000个时钟周期的数据。
我发现,如果把时间长度提升10倍,Num_T=10000。那么10根数据线相加的频谱幅度值就更低了,大概只有0.1左右,比原来要低不少,而时钟的频谱不变。
![“"](http://mouser.eetrend.com/files/2021-01/wen_zhang_/100061281-120611-4.png)
增加取样时间,数据线频谱幅度降低的原因。是因为我使用了Matalb里面的fft函数,这个函数是将信号看作周期函数来处理的,就是说假定取样时间长度为T,那么就默认这个信号是周期函数,周期长度为T。数据线信号本来是非周期的,如果用这个函数,那么其实就是让数据线信号的周期为采用时间长度,这也是为什么时间设得越短,幅度值越高。采用时间越短,其实不就是让数据线向周期信号靠拢吗。
所以,这个采样时间长度长一些,应该是更为准确的。
不过问题又来了。我突然想到,我们做辐射测试用的频谱分析仪,它工作的时候,我们可以在频谱上面看到各个频率对应的幅值。所以它肯定不是从开始扫描,到结束扫描,只记录一次数据然后最后分析一次。应该也是连续取一段时间数据,因为我们可以实时看到当前的频谱,并且它是变化的,所以会是取一段时间数据,分析出频谱,然后显示出来,再取下一段时间的数据进行分析。
当然,以上只是我的猜测。那么它到底一次分析多长的数据呢?这个我也没查到。
对于10Mhz的信号,如果取样10000个周期的数据,那么时间长度是1ms。这已经是一个很快的频次了。从上面看,此时10根数据线加起来的频谱幅度最大值才0.1,比时钟小不少。
实验源码
下面分享下matlab源码,可以修改里面采样的信号时间长度Num_T,体验一下。
注:Matlab可以在线执行的,没安装的同学可以网页上面执行,下面是网页链接,我先前也出了一个简易的教程,有兴趣可以看看。
https://ww2.mathworks.cn/products/matlab-online.html
Fclk=1; %时钟频率为1Hz Num_T=1000; %信号长度为1000个时钟周期 Num_Data=10; %数据线的个数10个 %%%%%%%%%%%%%%%%%%%%%%%% fft采样设置 Fs=100; %采样率为Fs L=(Fs/Fclk)*Num_T; %信号长度(采样总点数):Num_T个周期的信号,长度越长,fft精度越高,但是执行时间越长 T=1/Fs; %采样周期 t=(1:L)*T; %时间长度 %SIG_DATA=round(rand(Num_Data,2*Num_T)); %产生数据信号:0,1随机分布 SIG_DATA=round(rand(Num_Data,Num_T)); %产生数据信号:0,1随机分布 SIG_CLK=rand(1,2*Num_T); %产生时钟信号 for i = 1:length(SIG_CLK) if mod(i,2) SIG_CLK(i)=1; else SIG_CLK(i)=0; end end N=length(t); LEN_CLK=zeros(1,N); %定义时钟信号采样序列 LEN_DATA=zeros(Num_Data,N); %定义数据信号采样序列 for i=1:N LEN_CLK(i)=SIG_CLK(ceil(i/((Fs/Fclk)/2))); %时钟信号的采样序列 for j=1:Num_Data % LEN_DATA(j,i)=SIG_DATA(j,ceil(i/((Fs/Fclk)/2))); %数据信号的采样序列 LEN_DATA(j,i)=SIG_DATA(j,ceil(i/(Fs/Fclk))); %数据信号的采样序列 end end figure; subplot(2,2,[1 2]); plot(t,LEN_CLK+1.5*Num_Data,'r'); %画出30个时钟周期时钟信号 set(gca,'XLim',[0 30]);%x轴的数据显示范围,0-30 set(gca,'ytick',[]); grid on; hold on for j=1:Num_Data plot(t,LEN_DATA(j,:)+(j-1)*1.5,'k'); hold on end X_LEN_CLK=abs(fft(LEN_CLK)); subplot(2,2,3); semilogx(Fs*(0:(L/2))/L,X_LEN_CLK(1:L/2+1)*2/L); set(gca,'XLim',[0.1 10000]);%x轴的数据显示范围 set(gca, 'XTickLabel' ,{'0.1','1','10','100','10K','100K'}); %x轴频率数据 title('时钟频谱'); set(gca,'YLim',[-0.1 1]); xlabel('f (Hz)'); ylabel('幅度'); X1_LEN_DATA= abs(fft(LEN_DATA(1,:))); X_LEN_DATA = abs(fft(LEN_DATA(1,:))); for j=2:Num_Data X_LEN_DATA = abs(fft(LEN_DATA(j,:)))+X_LEN_DATA; end subplot(2,2,4); semilogx(Fs*(0:(L/2))/L,X_LEN_DATA(1:L/2+1)*2/L,Fs*(0:(L/2))/L,X1_LEN_DATA(1:L/2+1)*2/L); legend(['',num2str(Num_Data),'根-数据线'],[' 1根-数据线']); set(gca,'XLim',[0.1 10000]);%x轴的数据显示范围 set(gca, 'XTickLabel' ,{'0.1','1','10','100','10K','100K'}); %x轴频率数据 title(['',num2str(Num_Data),'数据线频谱']); set(gca,'YLim',[-0.1 1]); xlabel('f (Hz)'); ylabel('幅度');
本文转载自: 硬件工程师炼成之路
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。