2022/09/11

PICで乱数を得る。

#できれば偏りなく乱数が出てほしいの。

 

今回使う予定のパーツ

PIC18F46K22 x 1 @440
PCとの通信、ビット発生バランスの調整

PIC16F18313 x 6 @160
2N3904アバランシェ降伏電圧を調整

NJM2904D x 6 @40
2N3904アバランシェ降伏電圧出力用AMP

MCP4725 x 6 @350 (AE-MCP4725)
NJM2904D電圧調整

2SC1815 x 6 (20個入)@100

2N3904 x 6 (20個入)@180

セラコン 0.01uF 50v (10個)@100

*** カーボン抵抗 ***

LED点灯用 3.3K(暗いです)

2SC1815 E側10K 、B側39K

2N3904 C側1.5K

NJM2904分圧47K、51K

 

最初の一歩

1ビットの乱数を得るのに今回使うのは2N3904のECに逆電流を流してアバランシェ降伏状態を発生させ

電流の漏れを計測します。

FETからの漏れは不安定で0ビット側と1ビット側2つのFETの漏れにバラツキがあるため、これを可変抵抗で電圧を調整し

バラツキをすくなくしようと考えたのがコレ

5ビットを一度に取るため10個のFETを20個の可変抵抗で調整する。。。

1Kだと微調整が効かないのでもう一つ500のVRが欲しい

しかも電源を入れ直す度にバランスが崩れます。

当然ですが気が狂いそうになりました(w

/************************************************************/

VRで調整するのは却下。代わりにPICで電圧調整することにしてみた。

当然ですが電圧を上げれば漏れ回数が多くなり下げれば少なくなります。
#上げ過ぎると出っぱなしになります。

FETにかける逆電圧は約10.8V。元の電圧は12VでこれをPIC16F18313(I2C)->MCP4725を使って電圧を上下

ただし、MCP4725からは最大でも約5VなのでこれをNJM2904Dで11V程度に増幅させFETに出力します。

MCP4725は12ビット DAC で4096の解像度があります。

#1)アバランシェ降伏が出始める電圧から1step上げると100回/秒程度だった漏れが途端に2000回/秒ぐらいにハネ上がります。

これでは多すぎるので1step下げる。そのまま暫くすると今度は0に近くなってくるので#1)に戻る。を繰り返します。

#発生回数が多すぎるとランダムな発生が規則正しくなってしまうのでランダム性が保たれる電圧を設定する必要があります。

このセットが2つでようやく1ビットを得る事が出来ます。

しかし、これだけではビット0と1の出現率はバラついたままなのでPIC18Fで0/1ビットの発生回数を比較し0が多ければビット0側PIC16Fの

インターバルUP/DOWNのGPIO(RA3)をONにし、少なければOFFにします。

 

ビット0側PIC16Fでは

RA3がONならインターバル変数を減算しRA4をOFF。

RA3がOFFならインターバル変数を加算しRA4をON。

#ビット0側PICのRA4はビット1側PICのRA3に接続してあります。

 

ビット1側PIC16Fでは

RA3がONならインターバル変数を減算しRA4をOFF(RA4はNC)。

RA3がOFFならインターバル変数を加算しRA4をON(RA4はNC)。

ここで言うインターバル変数は、大きい=ビットONにしておく時間が長くなります。

1度に3BITの乱数を得るため下の写真のようになりました。

右端のPICはPIC18F13K22。当初5ビットを一度にと考えていましたが3ビットに変更したため

I/Oの数が足りるのでPIC18F46K22からPIC18F13K22に変更しました。

参考記事

https://core.ac.uk/download/pdf/234003605.pdf

FETを利用して乱数を得る方法

ペパ研ブログ

https://rand.pepabo.com/article/2019/02/07/randomness/

 

 

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送