マイコンを使うとき一番使って見たい機能は、A/D変換ではないでしょうか?
私の場合はそうでした。そこで(?)、今回は、マイコンのA/D変換です。
一般にマイコンのアナログ-ディジタル変換は、あまり精度がよくありません。
R8Cマイコンのハードウェアマニュアルでも
Vref=5Vのとき 分解能 8ビット ±2LSB
分解能10ビット ±3LSB
Vref=3Vのとき 分解能 8ビット ±2LSB
分解能10ビット ±5LSB
となっています。
分解能8ビットで±2LSBですから、下位2ビットは当てにならないことになります。 そこで精度を上げるために、AD変換を繰り返し積算する方法をよく使います。
サンプルプログラムの、ad_in(R8C15.C内)では、積算回数も引数にとっています。そして積算した値を返しています。adc_8、adc_10(SYSTEMIO.C内)では、8ビットADCと10ビットADC別に、積算回数で割って本来のビット数に戻して返しています。
積算回数は、±2LSBの場合16回、±3LSBの場合64回が目安となりますが、実際には、積算前の値を取り込み、実力をつかんで決めることをお勧めします。(正規分布に近いなら、上記の値あたりが妥当なところだと思います。)
メーカのサンプルコードにあるように、積算値から最大値と最小値を差し引くのもよい手です。
今回紹介したad_in(R8C15.C内)には、AD変換ポートの入出力の退避・復帰を付け加えてあります。本来必要はありませんが、ポート数の少ないマイコンでは、一つのポートに複数の機能を割り当てる場合があります。そういった場合、重宝します。
余談
皆さん、空きポートはどうされているでしょうか?
一般には、入力にして抵抗を介して電源かグランドに接続していると思います。
そのままでもかまわないのですが、抵抗を介してグランドに接続しておくならば、ポートを出力にして、Lowを出力しておく方法もあります。
こうしておけば、デバック時に、そのポートが利用できます。
例えば、特定のサブルーチンに入っている時だけ、そのポートをHighにするといった具合です。そうすることで、そのポートをオシロで観測するだけで、そのサブルーチンの占有時間(または率)が見えますし、必要なときにきちんと飛んでいるかなどが実時間で確認できます。(例えば、スイッチのチャタリング防止用の待ち時間が効いているかなんてね)