2009年10月28日水曜日

エラーアンプ付きスイッチングレギュレータ メモ

○出力電圧の計算
エラーアンプのー端子(FB端子)に戻す電圧で決まる。
具体的には出力電圧を抵抗分圧した電圧を戻してやる。で、エラーアンプはスイッチングレギュレータの内部で作られた参照電圧とFB端子の電圧を比較して次段にあるコンパレータの参照電圧を作る。コンパレータのもう一方の端子には三角波が入力されていて、エラーアンプの出力電圧が変わればデューティも変わって出力電圧が変化する。

フィードバックループ概略
出力電圧が下がる→FB端子(ー端子)電圧下がる→エラーアンプ出力上がる→コンパレータの参照電圧上がる→デューティ比が増加 or 減少(外付けのパワトラがPNPかNPNかP型かN形かで増加するか減少するかは変わる)→出力電圧上がる

2009年10月25日日曜日

外部メモリのアドレス線接続についてメモ

バス幅が16bitのメモリを接続する場合は、
以下のようにマイコンのアドレス線を1bitシフトダウンする。

<16bitメモリとマイコンのアドレス線接続>

マイコンのアドレス端子    外部メモリのアドレス端子
A1-------------------------------A0
A2-------------------------------A1
A3-------------------------------A2


バス幅が32bitメモリを接続するんなら2bitシフトダウンして以下のようになる

<16bitメモリとマイコンのアドレス線接続>

マイコンのアドレス端子    外部メモリのアドレス端子
A2-------------------------------A0
A3-------------------------------A1
A4-------------------------------A2

なんでシフトするかといえば、たぶんマイコンはバイトアクセスするつもりでアドレッシングするからだと思う。(=バス幅が8bitのメモリがくっついているつもりでアドレッシングする)
だから、アドレス線が16本あるマイコンが0バイト目をアクセスしたいときには
A[0:16]=0x0000
1バイト目だったら
A[0:16]=0x0001
2バイト目だったら
A[0:16]=0x0002
とアドレス出力する。


○16bitバスのメモリがくっついている場合
マイコンが0バイト目のデータが欲しくて
A[0:16]=0x0000
というアドレスを出力すると
メモリは0バイト目から16bit分をデータバスに吐き出す。
つまり、0バイト目と1バイト目を吐き出す。
この場合は余分な1バイト目がくっついているけど、マイコンが欲しい0バイト目も出てきているから問題ない。余分な分は無視すればいいのだから。
では、マイコンが1バイト目のデータが欲しいときどうなるか?
A[0:16]=0x0001
というアドレスをメモリがもらうと、1 x 16bit目から16bit分を吐き出す。
つまり、2byte目と3byte目がでてきてしまう。
これにはマイコンが欲しかった1バイト目は含まれていない。
こんな問題が起きてしまうので、1bitシフトダウンしておく。
こうすれば、ぴったりマイコンが欲しいと思ってアドレッシングしたデータが出てくる。

16bitメモリだから1bitシフトだが、32bitならもう1bitシフトしないといけないので結局2bitシフトすることになる。

2009年9月11日金曜日

Pyscoで高速化

Pyscoってのを使うと早くなるといううわさがあるのでメモ
import psyco
psyco.full()
と冒頭に入れるらしい。

2009年9月10日木曜日

Super bound unboundについて

superという関数について調べる。


class super(object)
| super(type) -> unbound super object
| super(type, obj) -> bound super object; requires isinstance(obj, type)
| super(type, type2) -> bound super object; requires issubclass(type2, type)
| Typical use to call a cooperative superclass method:
| class C(B):
| def meth(self, arg):
| super(C, self).meth(arg)

super(type)っての要するにtypeの基底クラスを与えるのか?
では、
super(type,obj) ->bound super object.ってどういうこと?


しらべてみるとboundってのはメソッドがどっかのインスタンスに属している。unboundは属していないってことらしい。

boundメソッドは、そのまま関数として使える。unboundメソッドはそのまま関数として使おうとするとだめ。

次のコードを例にとって考えてみる。

class Bassclass:
def __init__(self,str1):
self.a = str1+"bass class"
def func1(self):
return self.a

print Bassclass().func1()

C++だと、コンストラクタにselfなんて渡さなかった(たぶん)けど、pythonだとselfを渡さないとだめ。また、何も引数がいらなさそうなfunc1()もselfを渡すような形で定義してやら無いとダメ。
上のコードだとBassclassっていうスコープの中だからいちいちself.aなんて書かなくてもいいのかと思ってたけどそうじゃないみたい。


疑問点が1つ。
class Bassclass(object)
という文があるが、これを
class Bassclass()
にするとなんか知らんけどだめ。

新スタイルクラスとクラシックスタイルクラスってのがあるらしい。
新スタイルクラスではobjectの派生クラスとして定義しないとダメらしい。
んで、新スタイルクラスではスタティックメソッドとクラスメソッドが使えるそうな。
スタティックメソッドは、インスタンスなしで使用できるメソッド。普通のクラスに属さないメソッドみたいなもんか。
クラスメソッドは、クラスを渡すメソッド。こっちは全く分からん。


class Bassclass(object):
def __init__(self,str1):
self.a = str1+"bass class"

def func1(self):
return self.a

class Derivedclass(Bassclass):
def __init__(self, str1, str2):
super(self.__class__, self).__init__(str1)
self.b = str2
def func1(self):
return self.a
def func2(self):
return self.b

d = Derivedclass("ouou",12)
print d.func1()
print d.func2()

Gnuplot-py のサンプル(マンデルブロー集合) Gnuplot-py sample code (for Mandelbrot set)

Gnuplot-pyライブラリをインストールすると、どこかにdemo.pyができているのでこいつを参考にしてコードを書いた。



import psyco
psyco.full()
import Gnuplot, Gnuplot.funcutils
from scipy import *

STOP_VALUE = 4

#CX_AREA=[-1.495,-1.475]
#CY_AREA=[-0.02,0.045]
CX_AREA=[0,0.4]
CY_AREA=[-0.65,-0.35]
SIZE = 300
YSTEP = (CY_AREA[1]-CY_AREA[0])/SIZE

XSTEP = (CX_AREA[1]-CX_AREA[0])/SIZE

def mandelbrot_seq(x,y):
mandelbrot_seq = 0.+0.j
c=x+y*1j
for n in range(0,100):
mandelbrot_seq=mandelbrot_seq**2+c
if abs(mandelbrot_seq)>STOP_VALUE:#avoid overflow(mandelbrot_seq is too large number)
break
else:
pass
return abs(mandelbrot_seq**2+c-mandelbrot_seq)


g = Gnuplot.Gnuplot(debug=1)
#g('set parametric')
#g('set data style lines')
g('set hidden')
g('set pm3d map')
#g('set contour base')
#g.title('An example of a surface plot')
g.xlabel('Re axis')
g.ylabel('Im axis')

x = arange(CX_AREA[0],CX_AREA[1],XSTEP)
y = arange(CY_AREA[0],CY_AREA[1],YSTEP)

g.splot(Gnuplot.funcutils.compute_GridData(x,y, mandelbrot_seq, binary=0))


g('set pm3d')をg('set pm3d map')に変更すると底面のマップのみが表示されるのでこっちのほうが見やすい。

2009年9月9日水曜日

マンデルブロー集合の描画 Rendering Mandelbrot set

pythonの練習でマンデルブロー集合を描画するコードを書いた。

Fig:実行結果 The result of execution


from scipy import *
from pylab import *
STOP_VALUE = 4
CX_AREA=[-1,0.5]
CY_AREA=[-1,1]
STEP = 0.01
def judge_conv_mandelbrot_seq(c):
mandelbrot_seq = 0.+0.j
for n in range(0,50):
mandelbrot_seq=mandelbrot_seq**2+c
if (abs(real(mandelbrot_seq))>STOP_VALUE)or(abs(imag(mandelbrot_seq))>STOP_VALUE):
break
# if abs(mandelbrot_seq) if abs(mandelbrot_seq)>STOP_VALUE:
return 0
else:
return 1

mandelbrot_set=[]
for cx in arange(CX_AREA[0],CX_AREA[1],STEP):
for cy in arange(CY_AREA[0],CY_AREA[1],STEP):
if judge_conv_mandelbrot_seq(complex(cx,cy)):
mandelbrot_set.append(complex(cx,cy))
else:
pass
plot(real(mandelbrot_set),imag(mandelbrot_set),',')

show()


Gnuplot-pyを使った3次元グラフの書き方

3D plot をしたい。
matplotlibにplot3Dという関数があってこいつで3Dグラフをレンダリングできるらしいのだが、バージョン違いで上手く動かない。
そこでGnuplotを使う。

Sample Code



import Gnuplot
import numpy

gp = Gnuplot.Gnuplot(debug=1)
x=[0,1,0]
y=[0,1,0]
y2=[0,1,0]

d3=Gnuplot.Data(x,y,y2)
gp.splot(d3)



こんな感じでいける。
matplotlibと違って、いったんGnuplot.Data()でなんか知らないけど型を変換しないといけないらしい。
まだ良く分かっていないのでとりあえずメモ。