1

Arduino の A/D コンバーターは、マニュアルによると約 0.1ms かかります。実際、私のテストでは、Uno で 1 秒あたり約 7700 回のループを実行できることが示されています。

残念ながら、analogRead は読み取りが実行されている間待機するため、何かを実行するのが難しくなります。

一連の A/D 変換で計算をインターリーブしたいと考えています。analogReadを開始し、タイミングをチェックして後で完了した値を取得する方法はありますか? これが低レベルで、他のバージョンに移植できない必要がある場合は、対処できます。

Arduino のすべてのチャネルを定期的にサンプリングし、SPI または I2C 経由でデータを送信できるソリューションを探しています。割り込みを検討しても構わないと思っていますが、サンプリングは非常に定期的でなければなりません。

4

1 に答える 1

1

はい、完了するのを待たずに ADC 変換を開始できます。を使用する代わりにanalogRead、Nick Gammon の例を参照してください。

通常のサンプル レートを実現するには、次のいずれかを実行できます。

1) 可能な限り高速にサンプルを取得するフリーランニング モードで動作させる、または

2) タイマー ISR を使用して ADC を開始する、または

3)millis()定期的に変換を開始するために使用します (一般的な「ポーリング」ソリューション)。現在の時間に加算するのではなく、以前に計算されたコンバージョン時間に加算することによって、次のコンバージョン時間に進むようにしてください。

uint32_t last_conversion_time;

void setup()
{
   ...
  last_conversion_time = millis();
}

void loop()
{
  if (millis() - last_conversion_time >= ADC_INTERVAL) {
    <start a new conversion here>

    // Assume we got here as calculated, even if there
    //   were small delays
    last_conversion_time += ADC_INTERVAL;  // not millis()+ADC_INTERVAL!

    // If there are other delays in your program > ADC_INTERVAL,
    //   you won't get back in time, and your samples will not 
    //   be regularly-spaced.

定期的に変換を開始する方法に関係なく、完了をポーリングするか、完了に呼び出されるように ISR をアタッチできます。

volatileISR と の間で共有される変数には、必ずキーワードを使用してくださいloop

于 2016-02-10T16:15:15.223 に答える