はい、完了するのを待たずに 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 をアタッチできます。
volatile
ISR と の間で共有される変数には、必ずキーワードを使用してくださいloop
。