wip
This commit is contained in:
21
Readme.md
21
Readme.md
@@ -983,8 +983,21 @@ left
|
|||||||
|
|
||||||
|
|
||||||
Y: -1.67
|
Y: -1.67
|
||||||
|
```
|
||||||
|
|
||||||
|
Motor 1,2 tuning
|
||||||
|
----------------
|
||||||
|
```
|
||||||
|
Current loop:
|
||||||
|
rise time: 0.25ms
|
||||||
|
overshot 2.74%
|
||||||
|
damping: 0.753
|
||||||
|
natural frq:1487Hz
|
||||||
|
|
||||||
|
=>system 2ter Ordnung
|
||||||
|
|
||||||
|
k*1/(1+T1*s+t2*s^2)
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
B :
|
|
||||||
T
|
|
||||||
L
|
|
||||||
R
|
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ class PBTuning:
|
|||||||
plt.pause(.05)
|
plt.pause(.05)
|
||||||
return (res[1,0]/res[0,0],res[1,1]-res[0,1])
|
return (res[1,0]/res[0,0],res[1,1]-res[0,1])
|
||||||
|
|
||||||
def bode_gather(self,motor=1,minFrq=1,maxFrq= 100,numFrq= 100,amp=10,file='/tmp/bode.npz'):
|
def bode_gather(self,motor=1,minFrq=1,maxFrq=300,numFrq= 150,amp=10,file='/tmp/bode.npz'):
|
||||||
#amp= percentage of maximum amplitude
|
#amp= percentage of maximum amplitude
|
||||||
fig = plt.figure()
|
fig = plt.figure()
|
||||||
ax = fig.add_subplot(1, 1, 1)
|
ax = fig.add_subplot(1, 1, 1)
|
||||||
@@ -122,20 +122,70 @@ class PBTuning:
|
|||||||
print('frq %g ampl %g phase %g'%tuple(bode[i,:]))
|
print('frq %g ampl %g phase %g'%tuple(bode[i,:]))
|
||||||
plt.draw_all()
|
plt.draw_all()
|
||||||
|
|
||||||
fig = plt.figure()
|
|
||||||
ax = fig.add_subplot(2, 1, 1)
|
|
||||||
ax.semilogx(frqLst, bode[:,0]) # Bode magnitude plot
|
|
||||||
#ax.loglog(frqLst, bode[:,0],'.-') # Bode magnitude plot
|
|
||||||
ax = fig.add_subplot(2, 1, 2)
|
|
||||||
ax.semilogx(frqLst, bode[:,1]) # Bode phase plot
|
|
||||||
plt.show()
|
|
||||||
meta={'motor':motor,'date':time.asctime()}
|
meta={'motor':motor,'date':time.asctime()}
|
||||||
np.savez_compressed(file, bode=bode, meta=meta)
|
np.savez_compressed(file, bode=bode, meta=meta)
|
||||||
|
|
||||||
|
def bode_gather2(self,motor=1,minFrq=5,maxFrq=150,tSec=15,amp=30,mode=1,file='/tmp/bode.npz'):
|
||||||
|
#amp= percentage of maximum amplitude
|
||||||
|
self.fnLoc='/tmp/gather.txt'
|
||||||
|
#self.fnLoc='/tmp/gather70.txt'
|
||||||
|
mode=1
|
||||||
|
data=self.do_command('openloopchirp',motor,amp,minFrq,maxFrq,tSec*1000,mode,0)
|
||||||
|
self.data = data= np.genfromtxt(self.fnLoc, delimiter=' ')
|
||||||
|
n = self.data.shape[0]
|
||||||
|
w=np.hamming(n)
|
||||||
|
|
||||||
|
#data[:,0]*=w
|
||||||
|
#data[:,1]=(data[:, 1]-data[0, 1])*w
|
||||||
|
#data[:, 1]-=np.convolve(data[:,1],np.ones(n),'same')/n
|
||||||
|
n=1000
|
||||||
|
d=np.concatenate((np.ones(n-1)*data[0, 1],data[:, 1]))
|
||||||
|
d=np.convolve(d,np.ones(n),'valid')/n
|
||||||
|
data[:, 1]-=d
|
||||||
|
|
||||||
|
fig = plt.figure()
|
||||||
|
ax = fig.add_subplot(1, 1, 1)
|
||||||
|
ax.plot(data[:, 0])
|
||||||
|
|
||||||
|
ax.plot(data[:, 1])
|
||||||
|
#d=np.concatenate((np.ones(n)*data[0, 1],data[:, 1],np.ones(n)*data[-1, 1]))
|
||||||
|
|
||||||
|
fig = plt.figure()
|
||||||
|
iFt = np.fft.fft(data[:, 0])
|
||||||
|
oFt= np.fft.fft(data[:, 1])
|
||||||
|
iPhase = np.angle(iFt)
|
||||||
|
iAmpl = np.absolute(iFt)
|
||||||
|
oPhase = np.angle(oFt)
|
||||||
|
oAmpl = np.absolute(oFt)
|
||||||
|
ax = fig.add_subplot(2, 1, 1)
|
||||||
|
ax.plot(iAmpl)
|
||||||
|
ax.plot(oAmpl)
|
||||||
|
ax = fig.add_subplot(2, 1, 2)
|
||||||
|
ax.plot(iPhase)
|
||||||
|
ax.plot(oPhase)
|
||||||
|
|
||||||
|
frq=np.arange(0,iAmpl.shape[0])
|
||||||
|
#bode=np.ndarray((n,3))
|
||||||
|
db_mag=20*np.log10(oAmpl-iAmpl)
|
||||||
|
phase=np.unwrap(oPhase-iPhase)# numpy.unwrap(p, discont=3.141592653589793, axis=-1)
|
||||||
|
fig = plt.figure()
|
||||||
|
ax = fig.add_subplot(2, 1, 1)
|
||||||
|
ax.semilogx(frq, db_mag,'.-') # Bode magnitude plot
|
||||||
|
ax.xaxis.set_label_text('dB Mag.')
|
||||||
|
#ax.loglog(frqLst, bode[:,0],'.-') # Bode magnitude plot
|
||||||
|
ax = fig.add_subplot(2, 1, 2)
|
||||||
|
ax.semilogx(frq, phase,'.-') # Bode phase plot
|
||||||
|
ax.xaxis.set_label_text('phase')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
#meta={'motor':motor,'date':time.asctime()}
|
||||||
|
#np.savez_compressed(file, bode=bode, meta=meta)
|
||||||
|
|
||||||
def bode_plot(self,file):
|
def bode_plot(self,file):
|
||||||
f=np.load(file)
|
f=np.load(file)
|
||||||
bode=f['bode']
|
bode=f['bode']
|
||||||
meta=f('meta')
|
meta=f['meta']
|
||||||
frq=bode[:,0]
|
frq=bode[:,0]
|
||||||
db_mag=20*np.log10(bode[:,1])
|
db_mag=20*np.log10(bode[:,1])
|
||||||
phase=np.unwrap(bode[:,2])# numpy.unwrap(p, discont=3.141592653589793, axis=-1)
|
phase=np.unwrap(bode[:,2])# numpy.unwrap(p, discont=3.141592653589793, axis=-1)
|
||||||
@@ -169,12 +219,14 @@ Examples:'''+''.join(map(lambda s:cmd+s, exampleCmd))+'\n '
|
|||||||
parser.add_argument('--dryrun', '-n', action='store_true', help='dryrun to stdout')
|
parser.add_argument('--dryrun', '-n', action='store_true', help='dryrun to stdout')
|
||||||
args=parser.parse_args()
|
args=parser.parse_args()
|
||||||
|
|
||||||
plt.ion()
|
#plt.ion()
|
||||||
tune=PBTuning(args)
|
tune=PBTuning(args)
|
||||||
base='/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/data/'
|
base='/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/data/'
|
||||||
file=sys.path.join(base,'bode1.npz')
|
for i in (1,):#(1,2):
|
||||||
tune.bode(file=file,motor=1)
|
file=os.path.join(base,'bode%d.npz'%i)
|
||||||
tune.bode_plot(file)
|
#tune.bode_gather(file=file,motor=i)
|
||||||
|
tune.bode_gather2(file=file,motor=i)
|
||||||
|
tune.bode_plot(file)
|
||||||
#tune.do_command('stepmove',1,100,500,0,0)
|
#tune.do_command('stepmove',1,100,500,0,0)
|
||||||
#------------------ Main Code ----------------------------------
|
#------------------ Main Code ----------------------------------
|
||||||
#ssh_test()
|
#ssh_test()
|
||||||
|
|||||||
Reference in New Issue
Block a user