乱数ジェネレーターとしてのADC







良い一日! 乱数ジェネレーターが搭載されていないマイクロコントローラーで正直な乱数を取得する簡単で興味深い方法について話すことにしました。 マイクロコントローラにADCと1つの空き入力があれば十分です。 カットの下の詳細。



アイデアは新しいものではなく、多くの人々が思いついています。 STM8S003F3の古いプロジェクトの1つで実装したため、コード例はこのチップ用になりますが、他のアーキテクチャにコードを転送することは難しくありません。



一番下の行は、ADCを使用して電圧を測定する場合、結果の最下位ビットが最もノイズの影響を受けやすいということです。 この事実を活用して、いくつかの測定を行い、結果の最下位ビットを(最も「ノイズの多い」)として記録します。 したがって、8回測定した後、完全にランダムなバイトを取得できます。



測定結果を可能な限り悪化させます。 最短のサンプリング時間を設定し、ADC入力が置かれているマイクロコントローラーの出力を「空中」に吊るします。 ノイズが多いほど良い。



ADCの初期化:

CLK_PCKENR2 |= 0x08; //    ADC_CR1 = MASK_ADC_CR1_ADON; // ADC_CR2 = MASK_ADC_CR2_ALIGN; ADC_CR3 = 0; ADC_CSR = 4; // 
      
      





ランダムバイト関数:

 unsigned char GetRandom(void) { unsigned char i, result; result = 0; for (i = 0; i < 8; i++) { ADC_CR1 = MASK_ADC_CR1_ADON; //  while (ADC_CSR == 4); //     result = (result << 1) + (ADC_DRL & 0x01); ADC_CSR = 4; //    } return result; }
      
      





ここにちょっとしたトリックがあります。 私はメモリからコードを回復したので、エラーがあるかもしれません-それらについてLANに書いてください。



乱数を取得するこの方法について、経験豊富な人々の意見を非常にうれしく思います。



All Articles