Copyright (C)SUWA TSUSHIN NETWORK.
All Rights Reserved. TOPへ戻る
スポンサードリンク

No.0021 2021.3.21




ルネサス RX621マイコン 初心者(11) アナログ入力、アナログ出力を使ってみる





今回のソースファイル: rx62_test5.zip (301 KB)


□ 1.アナログ入力、出力

RX621では、12bit(1ユニットx8ch)のアナログ入力、10bit(2ユニット×4ch)のアナログ入力が、排他でどちらか1つだけ使用できます。今回は10bitのアナログ入力を使用します。ここでいうユニットとはAD変換器のことで、2ユニットあるほうは最大2ch同時にAD変換できます。

アナログ出力については、残念ながら今回使用しているRX621の100pinタイプのみ、1ユニット(DA1)しか使用できないようです。10bit出力が可能です。

回路は以下のようにします。アナログ入力は、ボリューム抵抗で電圧を0〜3Vの範囲で可変させて入力させます。上段の1kΩは、ボリューム抵抗の故障モードがよく分からないため、ショートモードを想定しての制限抵抗です。 アナログ出力は、47kΩで終端させています。1kΩは、ショートモードを想定しての制限抵抗です。制限抵抗との分圧で、0〜3.2Vの波形となります。それぞれTPを付けて、そこの電圧を測定して動作確認とします。

AKI-RX621 ピンアサイン アナログ反映.xlsx
RX621 アナログ入出力回路図.xlsx





部品を実装した状態です。前回までの回路に、今回の回路を追加しました。可変抵抗は、コネクタを介せずに直接基板に取り付けました。各TPは電線をはんだ付けしました。オシロのプローブが付けやすいように、GNDも電線を付けました。





□ 2.アナログ入出力をしてみる

前回作成したタイマーのプロジェクトに、アナログ入出力の処理を追加します。
以下のような処理にします。なお、回路の分圧は考慮しないものとします。


@DA1は、sin波形を出力する。
 90°で最大値3.3V、270°で0V、0°と180°のとき1.65Vとする。
 2°ごとに出力値を算出し、出力を変動させる。
 10bitDA出力のため、0.0032V/bitとなる。


AAN0の電圧0〜3.3V(=0x3FFF)の値を参照し、最大値と現在値の比をsin波形の振幅とする。
Bボタン2(P46)を押すごとに、sin波形の出力ON/OFFが切り替わる


という処理にします。

ソースコードは以下のようになります。
前回のタイマーからの差分のみの掲載です。
vect.h、intprg.c の該当部分は、前回と同じようにコメントアウトしてください。
省略したタイマーなどの部分は、前回までのレポートを参照してください。






□ 3.外部関数の使い方

sin関数を使用するために、 冒頭の宣言で以下のように記載したと思いますが、 このままではビルドエラーが出てしまいます。

  #include "math.h"   // 三角関数演算用


【ビルドエラー】
E0562310:Undefined external symbol "_sin" referenced in "DefaultBuild\main.obj"




これは、ビルドツールのオプションを変更することでエラーが消えます。

@ プロジェクトツリーの「CC-RX(ビルド・ツール)」を選択。
A 「ライブラリ・ジェネレート・オプション」タブを開く。
B 「math.h(C89/C99)を有効にする」を 「はい(-head=math)」に変更する。






□ 4.コンペアマッチタイマ(CMT)の設定

DAの処理用にCMT1を使います。
使い方は、前回のレポートで使用したCMT0と同じです。
今回は、2°ごとに呼び出すため、タイマー時間 × 180 がsin波形の1周期となります。 PCLKは外部クロック12MHzの2倍で、24MHzです。PCLK/8 のクロックを選択し、24MHz÷8=3MHz=0.333μs が1カウント分の時間になります。今回は1000カウントを設定したため、0.333μs × 1000 × 180回 = 60ms がsin波形の周期となります。

ベクタ仕様は、ベクタ番号:29、IER:IER03.IEN5、IPR:IPR05 になります。

No.0020 ルネサス RX621マイコン 初心者(10) タイマー機能を使ってみる
 



□ 5.アナログ出力(DA)の設定

最初に、このDAの機能は無効になっていますので、有効にします。

ハードウェアマニュアル(R01UH0033JJ0140)の「9.2.2 モジュールストップコントロールレジスタA(MSTPCRA)」の一覧にあるレジスタのうち、MSTPA19を0に設定します。




ソースコードでは以下のように記述します。


  SYSTEM.MSTPCRA.BIT.MSTPA19 = 0;  // DAユニット1 有効化


アナログ出力は10bitですが、レジスタ自体は16bitです。16bitのレジスタのうち下位10bit(0〜0x3FF)を右詰め(LSB)で使用するのか、上位10bit(0x400〜0xFFC)を左詰め(MSB)で使用するのか選択することができます。通常は右詰め(LSB)で使用します。初期設定は右詰め(LSB)のため、この設定は省略してもかまいません。ハードウェアマニュアル「36.2.3 DADRm フォーマット選択レジスタ(DADPR)」 のDPSELレジスタを使用します。




ソースコードでは以下のように記述します。


  DA.DADPR.BIT.DPSEL = 0;    // 0:D/AデータレジスタはLSB詰め



次にDA1の制御方法と出力の設定をします。初期状態は出力OFFにしておいて、ボタンが押されたら出力ON/OFFするようにします。 RX621の100pinタイプではDAは1つしかなく、初期状態で個別制御、出力OFFとなっているため、省略してもかまいません。




ソースコードでは以下のように記述します。


  DA.DACR.BIT.DAE = 0;    // 0:チャネル0、1のD/A変換を個別制御
  DA.DACR.BIT.DAOE1 = 0;   // チャネル1のアナログ出力(DA1)OFF




□ 6.アナログ入力(AD)の設定

最初に、このADの機能は無効になっていますので、有効にします。

ハードウェアマニュアル(R01UH0033JJ0140)の「9.2.2 モジュールストップコントロールレジスタA(MSTPCRA)」の一覧にあるレジスタのうち、MSTPA23を0に設定します。




ソースコードでは以下のように記述します。


  SYSTEM.MSTPCRA.BIT.MSTPA23 = 0;  // ADユニット0 有効化


AD変換の動作モードを設定します。シングルモードは、AD変換をONしたときに設定したchを1回だけ変換します。連続スキャンモードはAN0→AN1→AN2→AN3→AN0・・・と繰り返し変換し続けます。今回はシングルモードで使用します。初期設定は右詰めシングルモードのため、この設定は省略してもかまいません。ハードウェアマニュアル「35.2.3 A/D コントロールレジスタ(ADCR)」 のMODEレジスタを使用します。




ソースコードでは以下のように記述します。


  AD0.ADCR.BIT.MODE = 0;    // 動作モード シングルモード


次にAD変換のクロックを設定をします。
説明には以下のようにあります。

A/D 変換時間を決めるA/D 変換クロック(ADCLK)の周波数を設定します。 ADCLK の周波数は、4MHz 以上になるように設定してください。

AKI-RX621のPCLKは24MHzのため、4MHz以上とするには PCLK/4(= 6MHz)を選択します。 ハードウェアマニュアル「35.2.3 A/D コントロールレジスタ(ADCR)」 のCKSレジスタを使用します。
ソースコードでは以下のように記述します。


  AD0.ADCR.BIT.CKS = 1;    // クロック選択 PCLK/4


次にAD変換の開始タイミングを設定をします。
通常は、ADCSRレジスタのADSTレジスタを1にすることでAD変換を開始します。これをソフトウェアトリガといいます。その他に外部端子からの入力信号や、他の特定の割り込み発生のタイミングで開始することもできます。今回はソフトウェアトリガを使用し、初期設定でソフトウェアトリガになっているため省略可能です。 ハードウェアマニュアル「35.2.3 A/D コントロールレジスタ(ADCR)」 のTRGSレジスタを使用します。
ソースコードでは以下のように記述します。


  AD0.ADCR.BIT.TRGS = 1;    // ソフトウェアトリガ


アナログ入力は10bitですが、レジスタ自体は16bitです。16bitのレジスタのうち下位10bit(0〜0x3FF)を右詰め(LSB)で使用するのか、上位10bit(0x400〜0xFFC)を左詰め(MSB)で使用するのか選択することができます。通常は右詰め(LSB)で使用します。初期設定は右詰め(LSB)のため、この設定は省略してもかまいません。ハードウェアマニュアル「35.2.4 ADDRn フォーマット選択レジスタ(ADDPR)(n = A 〜 D))」 のDPSELレジスタを使用します。




ソースコードでは以下のように記述します。


  D0.ADDPR.BIT.DPSEL = 0;    // データはLSB詰め


アナログ入力のA/D変換後に割り込みを発生させることができ、この割り込みのタイミングで変換データを取得します。シングルモードの場合は関係ありませんが、連続モードの場合は割り込みでデータを取得しないと、すぐに次のchのA/D変換を行ってしまうためデータが正しく読めなくなります。この割り込みを有効にします。ハードウェアマニュアル「35.2.2 A/D コントロール/ステータスレジスタ(ADCSR)」 のADIEレジスタを使用します。




ソースコードでは以下のように記述します。


  AD0.ADCSR.BIT.ADIE = 0;    // A/D割り込み許可


次にAD0で使用する割り込みの機能設定を行います。
ベクタテーブル一覧表から、ベクタ番号:98、IER:IER0C.IEN2、IPR:IPR44 の値を使用します。
ソースコードでは以下のように記述します。


  ICU.IR[98].BIT.IR = 0;     // 割り込みステータスレジスタリセット
  ICU.IPR[0x44].BIT.IPR = 0xF;  // 割込みレベル 15(高)
  ICU.IER[0x0C].BIT.IEN2 = 1;   // ADI0(vect=98) 割込み許可

アナログ入力を行うchを設定します。このchはプログラム中で自由に切り替えることができ、切り替えた後にA/D変換をONにすることで、正しく各chの電圧を値にすることができます。今回はAN0しか使用しないため、予め設定しておきます。ハードウェアマニュアル「35.2.2 A/D コントロール/ステータスレジスタ(ADCSR)」 のCHレジスタを使用します。


ソースコードでは以下のように記述します。


  AD0.ADCSR.BIT.CH = 0;    // AN0を選択


最後に、アナログ入力を1回行います。 今回のテストプログラムでは、アナログ入力に応じでsin波の出力を変動させるようにするため、初期値を取得します。ハードウェアマニュアル「35.2.2 A/D コントロール/ステータスレジスタ(ADCSR)」 のADSTレジスタを使用します。


ソースコードでは以下のように記述します。


  AD0.ADCSR.BIT.ADST = 1;    // AN変換開始 (初期値取得)





□ 7.動作確認
ボタンのON/OFF処理(203〜205行目)、sin波 出力処理(8、12、20行目、30〜37行目、261〜287行目)、 アナログ入力値取得の処理(13、17行目、292〜295行目) を追加し、ビルド&ダウンロードして実行します。 ボタン2(P46)を押すと、DA1からsin波形の出力がON/OFFできます。

オシロスコープの画像は、Ch1がDA1のTP、Ch2がAN0のTPです。 AN0の入力電圧に応じて、DA1から出力されるsin波の振幅が変化していることがわかります。





スポンサードリンク

TOPへ戻る


ご利用条件
 Copyright (C)SUWA TSUSHIN NETWORK. All Rights Reserved.