Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
clockCyclesPerMicrosecond()/clockCyclesToMicroseconds()/microsecondsToClockCycles()

clockCyclesPerMicrosecond()/clockCyclesToMicroseconds()/microsecondsToClockCycles()

概要

クロック数と時間(マイクロ秒)の関係を相互変換します。

ソースコード

clockCyclesPerMicrosecond()/clockCyclesToMicroseconds()/microsecondsToClockCycles()は、hardware/arduino/cores/arduino/Arduino.h に定義されています。以下に全ソースコードを示します。

Arduino-1.0では以下でしたが、

#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
#define clockCyclesToMicroseconds(a) ( ((a) * 1000L) / (F_CPU / 1000L) )
#define microsecondsToClockCycles(a) ( ((a) * (F_CPU / 1000L)) / 1000L )

Arduino-1.0.1では以下のように変更されました。

#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )

clockCyclesPerMicrosecond()は、1マイクロ秒あたりのクロック数です。F_CPUは、(おそらく)hardware/arduino/boards.txtで定義されているuno.build.f_cpuを利用しています。Arduino Unoでは、16000000(=16MHz)です。1秒は1000*1000マイクロ秒なので、F_CPUを1000000で割った16となります。

clockCyclesToMicroseconds()は、指定したクロック数をマイクロ秒に変換します。与えたクロック数を1マイクロ秒あたりのクロック数で割ることで得られます。

microsecondsToClockCycles()は、指定したマイクロ秒をクロック数に変換します。与えたマイクロ秒に1マイクロ秒当たりのクロック数を掛けることで得られます。

clockCyclesToMicroseconds()とmicrosecondsToClockCycles()で、掛け算と割り算が混ざっているのは、いきなり大きな数を掛けたりすることで精度がなくなるのを防ぐためではないかと推測していますが、正しいかどうかはわかりません(ご存知の方がいらっしゃれば教えてください)。→Arduino-1.0.1では変更されたので、私の推測は間違っていたようでした。

バージョン

Arduino 1.0.5



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2012 garretlab all rights reserved.
inserted by FC2 system