2016-04-19 69 views
0

我正在使用Python代碼在使用矢量化方法時生成PWM信號。但仍面臨問題。任何人都可以幫助我解決這個問題。如何使用python生成PWM碼

import numpy as np 
import matplotlib.pyplot as plt 

percent=input('Enter the percentage:'); 
TimePeriod=input('Enter the time period:'); 
Cycles=input('Enter the number of cycles:'); 

y=1; 

x=np.linspace(0,Cycles*TimePeriod,0.01); 
t=(percent/100)*TimePeriod; 

for n in range(0,Cycles): 
    y[(n*TimePeriod < x) & (x < n*TimePeriod+t)] = 1; 
    y[(n*TimePeriod+t < x)& (x < (n+1)*TimePeriod)] = 0; 

    plt.plot(y) 
    plt.grid() 
end 

回答

1

矢量化的解決方案:

percent=30.0 
TimePeriod=1.0 
Cycles=10 
dt=0.01 

t=np.arange(0,Cycles*TimePeriod,dt); 
pwm= t%TimePeriod<TimePeriod*percent/100 
plot(t,pwm) 

enter image description here

高於速度(100X比這裏環路版),從numpy docs

  • 量化代碼更簡潔和容易閱讀
  • 更少的行的代碼通常意味着較少的錯誤
  • 代碼更接近地類似於標準的數學符號(使它更容易,通常,爲了正確地進行編碼數學構造)
+0

這看起來令人印象深刻,但給了我一個平坦的圖表。你能解釋它是如何工作的嗎? – roadrunner66

+0

我不知道爲什麼。 t%T是一個介於0和1之間的鋸齒信號.'pwm'是一個布爾數組,在30%的時間內爲真(1)。 –

+0

Ty,明白了。我使用Python 2.7並忘記了'from __future__ import division',所以我得到了整數除法。輝煌的解決方案。 – roadrunner66

1

最大的問題是你不能分配給y [索引],除非y是一個向量,但是你把它作爲一個數字。現在有很多方法可以做定期任務,我個人喜歡用modulo%運營商。

import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline 

percent=float(raw_input('on percentage:')) 
TimePeriod=float(raw_input('time period:')) 
Cycles=int(raw_input('number of cycles:')) 
dt=0.01 # 0.01 appears to be your time resolution 

x=np.arange(0,Cycles*TimePeriod,dt); #linspace's third argument is number of samples, not step 

y=np.zeros_like(x) # makes array of zeros of the same length as x 
npts=TimePeriod/dt 

i=0 
while i*dt< Cycles*TimePeriod: 
    if (i % npts)/npts < percent/100.0: 
     y[i]=1 
    i=i+1 

plt.plot(x,y,'.-') 
plt.ylim([-.1,1.1]) 

enter image description here