ADC変換精度向上方法

2013/12/16発行のルネサスエレクトロニクス アプリケーションノートに「A/Dコンバータの精度を向上させる方法」:R01AN1843JJ0100がありましたので解説します。
このアプリノートは、Smart Analog内臓のRL78/G1Aを対象デバイスとしていますが、「RL78/G13やG14などの普通デバイス」にも適用できる内容が記載されています。そこで、この普通デバイス:RL78/G1xのADC変換精度向上方法のみを抽出します。

RL78/G1xのADC変換精度向上方法

精度向上方法 内容
ハードウエアのノイズ対策 アナログ基準電圧端子:AVrefp/AVrefmの使用
アナログ入力端子に10pF~0.1uFのコンデンサ実装
アナログ信号とデジタル信号の分離、近接回避
基板アナログ領域とデジタル領域の分離、両者の1点グランド接地
ソフトウエアのノイズ対策 ADC実行中のアナログ端子近傍デジタル入出力の停止
ADC変換直後のHALT実施
ADCデータ平均化

全てA/D入力信号に対するノイズ対策です。アナログ端子に高精度チャネルと標準チャネルがあるRL78/G1Aに対し、(おそらく)全てが標準チャネルのRL78/G1xでも、できうる範囲でこの対策に沿ってADCを使うと精神的には安心できそうです。アプリノートには、定量的な対策実施済みのADCデータ平均化なしと5回平均の精度差、他社マイコンとの誤差比較も記載されています。

RL78/G1xテンプレートのADC評価

販売中RL78/G1xテンプレートでも評価したいところですが、評価設備が無いのと、(おそらく)ハードの依存性が高いでしょうから、定性的にADCを診てみます。AVrefp/AVrefm端子の使用、これらに一番近いANI2端子の使用、100ms周期の2回取得値一致によるアナログ値確定、ADC変換直後ではないがHALT利用など、完璧と言えませんが可~良の判定でしょうか。

RL78/G1xテンプレートの移植(その3)

仮想お客様開発ボード:BlueBoard-RL78/G13_30pin-Hへのテンプレート移植の3回目は、その2で示した移植手順3以降を解説します。

レジスタ・バンク設定

マイコンで複数処理をシステムとして上手く動作させるポイントの1つが、割込み処理です。この割込み処理を効率的に使うために、レジスタ・バンクの設定をします。詳しくは、コチラをご覧ください。移植ボードで使うレジスタ・バンク設定は、テンプレートの設定をそのまま使います。

userdefine.h修正

移植ボード回路図からテンプレートのuserdefine.hポート番号の論理名定義を変更します。

userdefine.h変更
userdefine.h変更

移植ボード動作

移植ボードの動作は、1. 電源ON後、uart1へ起動メッセージ出力、2. uart1経由で1文字コマンドを受信し、コマンドに応じてA:ADC値をuart1へ出力、B:ブザートグル出力、L:LEDトグル点滅、3. User SW押し下げでLEDとブザーのトグル動作とします。

移植ボードの動作
移植ボードの動作

テンプレート移植例なので、簡単な動作にしました。関数間の入出力データは、マイコンRAMを使っていますので、関数間の独立性や単体試験は容易です。

テンプレートの移植機能

Version2テンプレート提供中の全機能と、開発ボードへ移植する機能を示します。User SWは、INTP1に接続しているのでコード生成のINTP1割込み処理、Buzzerは自励式なので、LEDドライバで対応します。

ファイル名 機能概要 備考 ボード移植
main.c 起動処理 アプリとドライバ起動 あり
userdefine.h ユーザ追加マクロ ハードウエア割付修正 あり
uart.c uart1ドライバ 受信コマンド解析修正 あり
sw.c swドライバ チャタリング対応済み なし
led.c ledドライバ ブザー出力へ修正 あり
adc.c adcドライバ ノイズ対応済み あり
lcd.c lcdドライバ HD44780互換品対応 なし
pfdl_user.c データフラッシュドライバ RL78_FDL_LIB_VERSION_T04_REN: V1.05使用 なし
pfdl.h ライブラリヘッダ なし
pfdl_types.h ライブラリ追加マクロ なし
pfdl.lib ライブラリ本体 なし
LcdTest.c Lcdテスト用アプリ 1s周期起動 なし

 

動作テスト

移植ボードをパソコンに接続し、コマンドを送受信して動作中のボードを示します。

テンプレート移植動作
テンプレート移植動作

RL78/G1xテンプレートのメリット

BlueBoard-RL78/G13_30pin-Hを仮想お客様開発ボードとし、テンプレートの移植手順と、その方法を説明しました。テンプレート移植が簡単であることがお判り頂けたと思います。殆どがCubeSuite+の再設定と、ハード割付の変更です。ボード動作に関しては、動作に応じた追加や修正は必要になります。しかし、テンプレートで枠組みが決まっているので簡単です。処理の入出力データは、RAM経由なので、他のアプリやドライバの動作タイミングを考えずに、単独の動作タイミングで開発できるからです。

新規ボード開発時には、ボード周辺ハード/ソフトの単体テストソフトを作り、徐々に結合し、最後にシステム全体として動作させます。本テンプレートを開発当初から活用頂けると、関数間データ送受にRAMを使っていること、アプリやドライバ起動が時分割で複数あること、割込み処理効果を上げるバンク・レジスタ設定があること、などの本テンプレートの特徴を活かして、単体テストや結合テストも容易で、かつ、テストソフトそのものも活用できるので、実用プログラムの早期開発に役立ちます

メリットは、早期開発だけではありません。開発から時間がたってプログラムを見直す時に、プログラム解読が容易です。時間経過するとフローチャートなどに も目を通しますが、結局、動作理解には、ソースの解読が必要です。この時、テンプレートで枠組みが決まっているのと、そうでないのとでは、解読の困難さが 大幅に異なります。枠組がシンプルで、関数間がRAMで分離される本テンプレート方式は、単純なソースで記述できるので解読も簡単です

RL78/G1xテンプレートの移植(その2)

RL78/G1xテンプレートの移植手順一覧を示します。今回は、1~2まで解説します。

移植手順一覧

  1. CubeSuite+で、マイクロコントローラ変更(M)… 実行
  2. コード生成(設計ツール)再設定
  3. コード生成出力に使用レジスタ・バンク追記(デフォルトは、全てRB0のため)
  4. フラッシュライブラリ使用時は、リンク・ディレクティブ変更(コンパイラ領域を連続して広く取るため)
  5. userdfine.h修正
  6. 移植ボードの動作処理追加

G13Stick(サブプロジェクト)のテンプレートが移植ボードに最も近いので、これを使い移植します。

マイクロコントローラ変更:R5F100LE からR5F100ADへ

移植ボードのマイコンは、R5F100AD(30pin):RL78/G13 (ROM:48KB)_30pinで、テンプレートのR5F100LE:RL78/G13(ROM:64KB)_64pinと異なるので、マイクロコントローラ変更を行います。R5F100LE上で右クリックすると、マイクロコントローラ変更(M)…メニューが現れますので、R5F100AD(30pin)へ変えます。変更後は、サブプロジェクトのコード生成(設計ツール)が初期化され、「先に端子割り当てを設定してください。」のメッセージが出力ウインドに表示されます。

マイコン変更
マイコン変更

コード生成(設計ツール)の再設定

クロック発生回路の「箱アイコンが開いている」のは使用中を、「閉じている」のは未使用を示します。マイコン変更直後は、箱アイコン横の!マークで端子割当てが必要であることが判ります。また、ウオッチドック・タイマの箱アイコンも開いているので、WDTがデフォルトで使用されることも判ります。

コード生成の再設定
コード生成の再設定

コード生成のパラメタは、全てGUIで設定するのが本来の使い方です。設定箇所が多く、間違いなく設定するのは大変ですが、GUIで変更や修正が簡単にできるのがメリットです。しかし、多くのパラメタをプロジェクト作成毎に設定するのは面倒なので、既成ファイル(xyz.mtudあたり)から必要部分のコピー&ペーストで作成すべくいろいろ試行しましたが、失敗でした。別の方法として、(サブ)プロジェクト毎コピーしてプロジェクト名を変更する方法を以前に示しました。今回は、仮想開発ボード付属プロジェクトのコード生成GUIを横目で見ながら、真面目(?)にこのパラメタを設定します。

※A/Dコンバータは、移植基板付属のコード生成では未使用です。しかし、初期設定などメインプログラムで設定しており実際は使用しています。私は、コード生成を使って設定しました。

コード生成レポート

設定した多くのパラメタがオリジナルプロジェクトと同じかを確認する方法に「コード生成レポート」が使えます。このレポートは、コード生成タブの表示中にのみファイル(F)メニューに表示されるコマンドで、全パラメタがHTML形式で出力されます。オリジナルと両方出力して、エディタで比較すれば、パラメタの一致確認が容易です。

コード生成レポート
コード生成レポート

移植ボードの付属回路とコード生成

移植ボードの付属回路を示します。UART0はD-Subコネクタが未実装なのでUART1を使います。コード生成(G)をクリックして、移植ボードのAPIを生成します。

BlueBoard Peripheral Schematic label CPU pin CubeSuite+ port
User LED LED 20 P16
Buzzer BUZZER 15 P31
User Switch INTP1 17 P50
Reset Switch NRST 6 RESET
ADC ANI2 29 P22
UART0(コネクタ無し) RXD0 25 P11
TXD0 24 P12
UART1(コネクタ有り) RXD1 2 P01
TXD1 3 P00

RL78/G1xテンプレートの移植(その1)

Version2のRL78/G1xテンプレートは、4種の市販ボードに対応しますので、テンプレートとボード動作の確認がすぐにできます。今回は、この4種対応ボード以外のボードに、テンプレートを移植する例を示します。本テンプレートを、お客様開発のボードへportingする際に参考になることを狙っています。内容が複雑で分量も多いので、3回に分けて解説します。

移植ボード選定

第1回目は、ボード選定です。RL78/G1xの発売以降、典型的な市販ボードは、テンプレートでサポート済みです。そこで、お客様開発ボードの代わりに選んだボードは、インドNGX Technologies社のBlueBoard-RL78/G13_30pin-Hです。格安で、E1インタフェース、UART、LED、ブザーなどの周辺ハードが実装済みです。日本でも秋月電子通販から2400円で購入できます。このボードを「仮想お客様開発ボード」とし、テンプレートを移植します。

BlueBlardRL78G13_30pin-H
BlueBoard-RL78/G13_30pin-H(秋月電子通商HPより抜粋)

RL78/G14ボードへの移植

今回porting対象に選んだボードのマイコンは、RL78/G13:ROM:48KB_30pinです。因みに、RL78/G14:ROM48KB_30pin実装ボードも同じボード回路で、違いはマイコンのみ、ピン割付も同じです(詳しくは、NGX Technologies社のHPを参照)。従って、テンプレートをBlueBoard-RL78/G14_30pin-Hへ移植する場合も、ここで示す方法がそのまま使えます。

ボード付属ソフトやアプリケーションノートソフトの問題点

市販ボードには、ボードをテストするプログラムが付属しますが、あくまでハードテストが主眼です。また、RL78のサンプルプログラムやアプリケーションノートのプログラムは、動作ボードを特定せず、単一機能の実装例が主眼です。これらに対して、実用プログラムは、複数機能で各機能がシステムとして上手く動作する必要があるので、ボード付属ソフトやアプリケーションノートのソフトを、そのまま実用版へ流用したくても、中途半端で役立ちません。RL78/G1xテンプレートは、この両者の隙間を埋めるのが役目です。実用プログラムとしてそのまま使えるひな型を目指しています(テンプレートに対する皆様のご意見、ご要望などが御座いましたらお気軽にinfo@happytech.jpへお寄せ下さい)。

では次回から、RL78/G1xテンプレートの移植方法を示します。

マイコン入力処理ソフト

マイコンは、入力データを基に、データを出力する装置です。今回は、入力データのソフト処理について考えます。

入力データには、「ノイズ」が付き物です。例えば、スイッチ入力であれば、チャタリング、AD変換入力であれば、アナログノイズなどです。これらには、ハード的なノイズ対策が行われます。しかし、マイコンに取込むのは最終的にはソフトなので、ソフトの入力ノイズ対策は必須です。

スイッチ入力のソフトノイズ対策

スイッチのチャタリングは、使用するスイッチハードによってチャタリング時間が変わります。タクトSWやトグルSWの場合は、数ms~10ms程度と言われます。スイッチ入力のソフト処理は、入力データをスキャンして、「High」か「Low」のデータ値が連続したらチャタリングが終わった確定データとします。問題は、データスキャン間隔と連続値の比較回数です。スキャン間隔が広く比較回数が多ければ、確定までの時間が掛ります。と、ここまでは、教科書に記載されています。しかし、肝心のソフト調整の記載は少ないようです。

スイッチ入力は、実際のスイッチハードを人が操作して確定データを調整する必要があります。調整ポイントは、スキャン間隔と比較回数です。これらを簡単に調整/変更できるソフトが優れたソフトです。いろいろ方法があるでしょうが、シンプルな方法は、「スイッチスキャン処理を1つの関数として作成し、この関数の実行タイミングをメイン関数で変更する方法」です。これなら、スイッチハードが無い時はシミュレーションでソフト単体のデバッグができますし、ハードが用意できた後は、単体デバッグ済みソフトとスイッチハードを結合してデバッグします。結合デバッグは、メイン関数のスイッチスキャン処理実行タイミングだけを変えて、スイッチハード操作データが正確に取得できるタイミングを探すだけですので簡単です。

このように、ソフトは、ハード無しの状態で単体デバッグができ、かつ、ハード結合デバッグの調整も簡単にできる作りが望ましいのです。この調整を開発の初期段階でどの程度意識したかにより、可搬性の良いソフトができます。

スイッチスキャン処理ソフトの例(2回スキャンデータ一致で入力データ確定)
スイッチスキャン処理ソフトの例(2回スキャンデータ一致で入力データ確定)

多くの教科書やサンプルソフトは、メイン無限ループからサンプル処理を起動します。これは、サンプル処理の説明に重点を置いているのでしょうがないのです。しかし、ハード結合調整まで考えると、ここで示した方法のように、無限ループからの起動よりも、起動タイミングを変えられるメイン関数の方が良いことが判ります。

販売中のRL78/G1xテンプレートは、1ms/10ms/100ms/1s/無限ループの5種類のアプリ起動タイミングを提供します。特に入力ソフト処理には、このタイミングを変えられることが、ノイズ対策やハード依存性を少なくすることに効果的です。タクトSWでは、10ms間隔のスイッチスキャン関数起動と2回スキャンデータ一致により、操作データが正確に取得できました。また、AD変換の例としては、ポテンショメータのAD変換データスキャン関数は、100ms間隔起動と2回スキャンデータ一致によりデータ入力ができました。同じAD変換ソフトで、室温などの変化が緩やかなAD変換入力なら、スキャン間隔を1sにすれば対応できます。

販売中のG1xテンプレートのアプリ起動処理(テンプレートから一部抜粋)
販売中のG1xテンプレートのアプリ起動処理(テンプレートから一部抜粋)

RL78/G1x用テンプレートVersion2販売

RL78/G13とG14ソフト開発や習得に使えるテンプレートをVersion2に改版しました。販売価格は、従来版と同じ1000円(税込)です。

RL78/G1xテンプレートVer2の特徴

従来版は、主として「RL78/G13Stickに対応したプロジェクトのみ」を実装しておりました。従って、動作ボード変更時は、RL78/G13マイコンからG14への変更や、ポートハードの再割付、コード生成パラメタの再設定、など多くの変更が必要でした。 Version2は、「対応評価ボード別のサブプロジェクトでテンプレートを構成」しております。これにより、対応4種評価ボードに、テンプレートをそのままダウンロードし、ボードとテンプレートの動作確認ができます。修正や変更は一切不要です。 対応している市販評価ボードは、

  1. RL78/G13Stick
  2. RL78/G14Stick
  3. QB-R5F100LE-TB
  4. QB-R5F104LE-TB

の4種です。評価ホード名のサブプロジェクトをアクティブプロジェクトに選択すれば、評価ボード実装マイコンとポートハード割付、コード生成パラメタは、設定済みですので、より簡単にボードとテンプレート動作の確認ができます。

テンプレートVer2
テンプレートVer2のサブプロジェクト構成と評価ボード動作

また、本テンプレートをより広い範囲でご活用いただくために、対応外ボードや、マイコン機種変更時の処理一覧と方法をテンプレート解説P9に追加いたしました(P1のみ掲載中ですが、もくじで内容がお判り頂けると思います)。

Template2 Manual Page1
テンプレート解説 P1

本テンプレートが、皆様のRL78マイコンの早期開発、習得のお役にたてば、幸いです。

購入ご希望の方は、メール(宛先:info@happytech.jp)にてお知らせください。銀行振込口座を返信いたしますので、この口座へ代金の1000円(税込)を振込でください。振込確認後、本テンプレートVer2一式(テンプレート解説全ページとテンプレートプロジェクト、ZIP圧縮約3MB)をメールにてお送りします。

RL78/G14 ハードウエア編ユーザーズマニュアル改編

RL78/G14のハードウエア編ユーザーズマニュアルが、Rev. 2.00へ改編されました。

付録Aの改訂履歴をみると、記述が整理されリファインされた感じがします。例えば、P91の未使用端子の処理表などです。出力未使用端子は、オープンのまま、入力未使用端子は、個別に抵抗を接続して、VddかVssへ接続することが判ります。

但し、P60/SCLA0、P61/SDAA0のI2C関連ポートの未使用時は、出力ラッチ設定後、抵抗を接続してVddかVssへの接続が必要です。販売中のRl78/G1xテンプレートは、これらをLED出力ポートとして使用中ですので、安心です。テンプレートご活用中の皆様は、未使用に変更の場合には、上記ユーザーズマニュアルを参照して適切な処理を行ってください。

CubeSuite+ Windows8.1 Pro動作確認(最終報告)

トラブル続きであったWindows8.1 Pro上でのCubeSuite+動作が正常に戻りました。

ウイルス誤検出は、定義ファイルが更新されたお蔭か、または、プログラム自身が更新されたかは不明ですが、問題なく動作しております。やはり、OS更新は、発売後2~3日待ってから更新した方がリスクが少ないようです。

これとは関係しませんが、Windows8 Proマシンで1台のみ8.1更新ができない64ビット自作機があります。調べてみると同じようなマシンが結構あるようです。もちろん、Microsoft記載のトラブルシューティングは全て試しましたが、結果はNGでした。

クライアントデスクトップ環境は、Windows7で完成の域に達したと感じていますが、8更新以降、環境劣化していると思うのは私だけでしょうか? ハイブリッドOSで二兎を追うのは判りますが、モダンUI環境だけでなく、デスクトップ環境もアップグレードしてくれないと、新OS導入を控える人が多くなること、圧倒的に多いWindowsデスクトップアプリ資産の今後が多少不安です。

コード生成ひな型出力とユーザ追加ソースファイルの分離メリット

CubeSuite+のコード生成は、マイコン周辺機能を制御する「デバイス・ドライバ」と「ひな型ソース」を出力します。ユーザは、このデバイス・ドライバをAPI関数としてコールする処理をひな型へ追加すれば、所望動作プログラムが完成します。今回は、このひな型とユーザが追加する処理を分離すると、マイコン依存性が少なくなり、移植性が高まることを示します。

コード生成の「端子割当て設定」は、はじめに必ず設定する必要があることは、以前示しました。そこで、この端子割当てのみを設定し、後は何もせずにコード生成(G)をクリックすると、10個のファイルが生成されます(「r_」は、ルネサス、「r_cg_」は、コード生成が作成したことを意味すると思います)。

コード生成出力ファイル
コード生成出力ファイル

1~4がひな型、5~10がデバイス・ドライバです。クロック発生回路とウオッチドック・タイマは、デフォルトで利用する周辺回路です。ユーザが使う周辺回路をコード生成のGUIで設定すれば、それに応じてr_cg_周辺回路.c、r_cd_周辺回路_user.c、r_cg_周辺回路.hの3ファイルがこれらに追加されます。

r_systeminit.cは、周辺回路の初期設定が生成されていて、r_main.cの実行前にスタートアップで処理されます。r_cg_macrodrive.hは、システム定義のマクロで、r_cg_userdefine.hは、中身なしのスケルトンです。必要に応じて、ここにユーザ定義を追加すれば、全ファイルに自動的にインクルードされます。

起動処理のr_main.c中身を示します。R_MAIN_UserInit()でメイン無限ループ実行前のユーザ追加処理があれば追記し、なければそのまま割込み許可EI()した後、メイン無限ループに入ります。通常は、この無限ループにユーザが処理を書き加えます。

何らかの都合で、コード再生成した場合にも、/* Start user…*/と/* End user…*/の間に書き加えた処理は、そのままコード再生成出力ファイルにマージされますので、追加分は、保持されます。これが、コード生成の一般的な使い方です。この場合は、ユーザ追加処理は、コード生成ファイル内に入ります。

r_main.cの中身
r_main.cの中身

提案は、このユーザ追加処理とコード生成のひな型を分離し、別ファイルにすることです。メイン無限ループにuser_main()を付け加えた例で説明します。user_main();は、別ファイルmain.c内に作成します(「r_」が無いので自作ファイルであることが判ります)。

このmain.cファイル内のuser_main()でコード生成出力のAPI関数を使うので、使用するr_cg_周辺回路.hをインクルードする必要がありますが、user_main()は、多数のAPI関数のコールを使う単純なプログラムとなります。API関数名は、R_CGC_Set_CRCOn ();などのように長い記述になりますが、その分、ソース可読性は向上します。また、RL78/G13とRL78/G14で周辺回路のハードが異なるものがあっても、API関数名は同じものがコード生成されるので、制御するユーザ側は、同じものが使えます。

このように、コード生成出力のひな型とユーザ追加処理を分離すると、移植性が良くなります。最近のマイコン統合開発環境は、CubeSuite+のようにAPI関数を自動生成するものが増えてきました。この場合も、API関数名は、同じか、または近い意味のものが生成されますので、ユーザが追加した処理ファイルがそのまま使える可能性が高まります。API関数を使う側と、API関数を生成する側を分離すると、マイコンの製品依存性も少なることが判ります。

 

販売中のG1xテンプレートは、この考え方で開発しました。RL78/G13とG14で共通に使えます。他シリーズは試していませんが、使えると思います。また、他社製品、例えばARM Cortex-Mマイコンなどにも適用してみたいと考えています。

CubeSuite+ Windows8.1 Proで動作確認(続報)

先に報告した動作確認の続報です。

21日より突然、コンパイラがウイルスに感染しているとして、ウイルス対策プログラム(Avast:2014.9.0.2006)が動作し、ビルドができなくなりました。Avastチェストから削除プログラムを元に戻しても、一度チェストへ入れられたコンパイラは、残念ながら動作しません。

コンパイラ動作停止
コンパイラ動作停止

Windows8.1は、Windows8よりも、余計なセキュリティが強化されていますので、これかと思い、Windows8 Proへリカバリしても、同様です。

仕方がないので、一度、CubeSuite+を全てアンインストールし、再度インストールし、Avastを停止させて起動したところ正常にビルドできました(コンパイラのみの再インストールでは、解決しません)。原因は、Avast側にあると思いますが、同じようなことが他のセキュリティソフトでも起こる可能性がありますので、注意してください。