ルネサスマイコン RX210を CS+で使ってみる

 秋月電子通商で、RX210マイコンボードを入手したので、これを、ルネサスの開発環境、CS+(CubeSuite+)環境で、E1デバッガーを使って、いくつか動作テストを行ってみます。

外付き20MHz水晶振動子を使う設定 2017.2.20 追加
UARTを操作する 2017.2.28 追加
メモリやI/OレジスタをUARTで操作するモニタを移植 2017.3.4 追加
内臓データフラッシュメモリ( E2データフラッシュ )2017.3.15 追加
内臓データフラッシュメモリをモニタで読み書きする 2017.3.21 追加
E2データフラッシュの、消去、ライトをするための、状態遷移 2017.3.22 追加
内臓温度センサーを使ってみる 2017.3.26 追加
動作クロックを変更し、温度を測定 2017.3.30 追加
内臓温度センサーはICの固体差がとても大きい 2017.3.30 追加
2点の温度でセンサーを動作させ、校正してみる 2017.4.5 追加



 以下が、RX210マイコンボードにユニバーサル基板を取り付けたものと、E1デバッガーです。このデバッガーは比較的安いので、購入しました。


 このサイトでは、ほとんどが、GCCを使って開発し、UARTポートの動作を確認した後、マイコンと接続し、モニタを入れて簡易なデバッグをできるようにしていますが、今回は、CS+というルネサス純正の開発環境を使ってみました。
 CS+は、インストールすると、最初2か月間は、無制限で機能を使えますが、過ぎると、リンクサイズが128kBに制限されるようです。128kBというと、かなりのプログラムまで可能なので、個人的に使うには十分と思われます。

 CS+をインストールして、ユーザー登録すると、RXマイコンのプロジェクトを作成できるようになりますが、まず、使うICの型番を指定する必要があり、以下の図のように、R5F52108AxFP(100pin) を指定します。秋月電子通商の評価基板のRX210が、R5F5208ADFP だからです。


 次にプロジェクト名( AE-rx210test にしている)と、フォルダを指定して、作成すると、


 以下のようなウインドウになります。

 上の図から、以下のソースファイルが自動生成されたのが確認できますが、これをコンパイルして、ボードにダウンロードして実行しても、何も書いていない main 関数をすぐ終了して、エラーで止まってしまいます。
  1. AE-rx210test.c アプリケーションをこのファイルの、main() 関数内に書くが、自動生成では何も書かれていない。
  2. dbsct.c プログラムコードやデータの配置を、名前を付けて順番を決めるソース。
  3. intprg.c 割り込み処理のダミー関数。使いたい割り込みがある場合、ここでその関数を無効にする。
  4. resetprg.c リセット後に実行される関数。この中で、main() を呼び出している。
  5. sbrk.c メモリエリア確保。ここでは使わない
  6. vecttbl.c ROMの最終番地近くに書かれるパワーONアドレスなど
  7. iodefine.h RX210の内臓ペリフェラルのレジスタアドレス表。
  8. sbrk.h
  9. stacksct.h ユーザースタックの確保サイズ、など。スタックをたくさん使う場合、変更が必要。
  10. typedefine.h 変数のマクロ。_UINT とか。
  11. vect.h 割り込みベクタの宣言。割り込みを使う場合、該当ベクタをコメントアウトする必要がある。
 以下は、AE-rx210test フォルダに生成されるが、表示されない
  1. lowlvl.src
  2. lowsrc.c
  3. lowsrc.h
  4. hwsetup.c クロックの設定などを行う。水晶なのか、PLLを使うのかなど。CPUの動作クロックも設定する。

 hwsetup.c を開くと何にも実行するものが無い空の関数があるだけなので、プロジェクトを作成して、デフォルトで作成されたファイルだけで何か実行できるのか不明ですが、main.c の中で、ポートをLow,High操作して、矩形波が出るか試してみます。RX210 の、ハードウエアマニュアルを見ると、パワーONでは、内臓低速オシレーター( LOCO 125kHz )が動作しているようなので、CS+でコンパイルしてボードにダウンロードして、走らせてみます。

 ポートをLow,Highするには、I/Oポートを出力に設定しなければなりませんが、RX210 では、I/Oポートの初期設定が入力なので、これを出力ポートにします。iodefine.h には、内部レジスタのアドレスなどを簡単に使える定義が揃っており、これを使うと以下のようになります。例として、B1ポートを出力にしてみます。
 PORTB.PMR.BIT.B1 = 0;// ポート B1を、I/Oポートにする。
 PORTB.PDR.BYTE = 2;// ポート B1を、出力ポートにする。PDR は、I/Oの方向を設定するレジスタ。
 PORTB.PODR.BYTE = 0;// 最初はLow

 そして、while(1) で永久ループさせて、B1ポートを、Low,Highに変化させます。

 これでポートが操作できてるか、オシロで観察すると以下のようになりました。

 オシロの情報から、Lowの期間の周波数が、62.25kHzで、ほぼ125kHzの半分です。125kHzは、内臓低速オシレーターの周波数で、CPUが、この周波数で動作しているらしいのが判ります。クロック周りの設定を何もしなければ、このスピードで動作します。つまり、パワーON後は、このスピードで動作し、もっと高速のクロックへの切り替えなどの操作も、このスピードで動作しながら行うことになり、低消費電力化を考慮したマイコンでは、他にもあります。いきなり水晶振動子とか、セラミック振動子の発振動作を待つことなく、低速でも何らかの処理を行うことができます。いわゆる、ディープスリープと呼ばれる機能がありますが、このとき、クロック関係(RTCを除く)はすべて停止し、内臓RAMのみバックアップ状態を保つという機能が、昨今の電池動作で長時間動作させたいという要求に答えるものです。


外付き20MHz水晶振動子を使う設定

 クロックの設定をしなければ、125kHzのクロックで動作しますが、秋月電子通商から入手した、AE_RX210 基板には、20MHzの水晶振動子が実装されており、RX210の最高動作周波数、50MHzを作り出せるようです。なぜ20MHzなのかは、ルネサスの評価ボード、Renesas Starter Kit for RX210 の水晶が、20MHzだからと思われます。水晶発振子を使うには、クロックの設定が煩雑で、ルネサスのサイトにあるサンプルソフトをそのまま利用できるからと推測されます。

 ルネサスのURLで、クロック設定とか、UARTの操作を検索すると、以下の2個のサンプルが、使えそうなのが判りました。
 an_r01an1002jj0220_rx210_mainclk.zip
 an_r01an1423jj0101_rx210_serial.zip

 圧縮ファイルの名称から、serial と名の付いてる方を解凍すると、r_init_clock.c というクロック初期設定のファイルがあます。mainclk.zip の方にも同じようなのがありますが、mainclk.zip に同梱されている方が日付けが新しくなっています。
 クロックの初期設定をして、早いクロックにして、後から、UARTも動作させたいので、an_r01an1423jj0101_rx210_serial.zip の r_init_clock.c を実装して走らせ、矩形波の周波数が高くなるのを確認してみます。r_init_clock.c には、R_INIT_Clock() なるクロック設定の関数があり、これを、hwsetup.c で呼び出します。変更はこの部分と、include している、iodefine.h のパスの部分です。オリジナルでは、include "..\iodefine.h" となっていたので、..\ を削除しています。
こちらが、クロック設定を追加したプロジェクトファイル → AE-rx210test02.lzh



 下の図が、r_init_clock.c のクロック設定で、20MHzの水晶の発振を有効にして、PLLで分周、逓倍、して、CPUのクロックを早くしたあと、同じポートを観察したものです。クロック設定をしていない、62.2kHzから、12.2MHzになりました。



 さて、ここで波形の変化の早さですが、125kHzのクロックの場合は、62.2kHz、で、20MHzの水晶では、たぶんRX210の最高速度50MHzになっているはずで、25MHzになると思っていましたが、その半分しかありません。そこで、AE-rx210test02.lzh を解凍した、AE-rx210test.c の、33行に、readsckcr = SYSTEM.SCKCR.LONG; の命令を入れて、クロックの設定レジスタを読みだすと、
 CS+ のデバッガーの変数表示で、0x21821211 が読み出せます。これは、r_init_clock.h の143行で設定されているクロック設定数値であるのがわかります。この設定値が何を意味するかは、r_init_clock.h の143ー144行に説明されていて、

 ICLK,PCLKD: divide-by-2
 PCLKB,BCLK,FCLK: divide-by-4

 ということがわかります。ここで、分周する元のクロックですが、同じ r_init_clock.h の 95行に、

 #define REG_PLLCR (0x0901)

 と設定されていて、これは、外付き水晶の周波数を1/2にして、それを10逓倍するPLLの選択であるのが、ハードウエアマニュアル、r01uh0037jj0150-rx210.pdf の 205ページで確認できます。0x0901で、外付き水晶20MHzで、100MHzの周波数を作り出し、それを分周して、各クロックとして供給するという構成です。ICLKは、名前の通り、インストラクションと解釈でき、CPUのクロックと思われ、divide-by-2 で、50MHzになります。では、I/Oポートはどうなのか、マニュアルを調べると、PCLKBと、BCLKが関係しているらしく、divide-by-4 となって、25MHzになっているのが判ります。上の図で、I/Oの変化が25MHzになっている理由が、このクロック分周に由来しているのが判りました。

 では、クロックやPLLの設定をしないパワーONのままの場合、どうなのか、
 readsckcr = SYSTEM.SCKCR.LONG; 
で読み出すと、マニュアル通り、パワーONのデフォルト、0x00000000です。このレジスタSCKCRを、以下のコードを呼び出して変更してみます。


 SCKCRを、上記のコードで、0x11811111に変更して波形を見ると、以下のように31.2kHzぐらいになります。



UARTを操作する

 秋月電子通商で入手できる評価基板、AE-RX210 には、RX210のSCIポート、1番に、USB−UART変換IC( FT232RQ )が実装されていて、PCとUARTで通信できるようになっています。

 ルネサスのURLからダウンロードできる、UARTのサンプルソフト an_r01an1423jj0101_rx210_serial.zip ですが、以下の図のように、9ページの内、7ページ目にありますが、このサンプルは、ルネサスの、Renesas Starter Kit for RX210 用のものなので、そのまま秋月のボードのUSB−UART変換に接続されている、UARTポート(SCI1)では動作しません。
クリックで拡大 ↓


 an_r01an1423jj0101_rx210_serial.zip を解凍しても、古いワークベンチ、High-performance Embedded Workshop のプロジェクトファイルなので、CS+ では開く時にプロジェクトファイルを変換するダイアログがでてきて、しかも、使っているICの型番を指定して始めて開くようです。

 解凍して、CS+で開いた後、
an_r01an1423jj0101_rx210_serial\workspace\rx210_sci_async_r01an1423\rx210_sci_async_r01an1423\source フォルダに、
sci_cfg.h という設定ファイルがあるので、このファイルの、SCI1 の部分を変更します。ifdef となっているので、このファイルの先頭部分で、SCI1 を採用するように変更します。
以下は変更前

以下は変更後

 さて、これで秋月の基板の、USB−UARTに接続されている、RX210のSCI1ポートでPCと接続できるはずです。
 基板のUSBをPCと接続すると、COMポートが追加され、そのCOMポートを、57600ボーでターミナルで開き、CS+で実行すると、
Hello world!
 と、表示されます。

 さて、このサンプルソースですが、ポートのアクセスをするのに、iodefine.h で設定されているものを直接使わず、わざわざ別の名前に define して使っているのですが、( 例:#define RXDn_PDR PORT3.PDR.BIT.B0 で、RXDn_PDR を操作するような変更 )PORT3.PDR.BIT.B0 をそのまま使った方がはるかに判りやすいと思います。RXDn_PDR では、どのポートなのか、すぐには判別できません。define 文を多用すると、何をやっているのか、作成者は判っても、他の人が判るには余計な手間がかかってしまいます。

 そこで、サンプルソフトを、iodefine.h で定義された define 文を直接使い、余計な、define での変換を削除して、さらに、サンプルでは、割り込みを使っていますが、これを、割り込みを使わずに、UARTの確認ができるものを、新たに作成してみます。


 CS+で作成したソースは、プロジェクトファイルを設置した場所にすべて置かれますが、これをサブフォルダに移動し、しかも、BIOS関連と、アプリケーション関連をまとめ、それぞれ、BIOS, App というサブフォルダに移します。もちろん、サブフォルダに移動すると、CS+では存在を認識しなくなるので、CS+のIDEで、ソースファイルの所在を指示し直します。
以下が、サブフォルダを作成して、CS+の表示でも、ツリー構造を合わせたものです。
クリックで拡大 ↓

 上の図では、SCIを設定するソース、sci.c を表示しており、iodefine.h のみを使って同じ操作をするように改造したものです。
 基板のUSB−UART変換ICで、RX210のACI1に接続し、38400ボーで、UART通信のテストを行う、CS+用プロジェクトファイル一式
 このソースでは、USBを接続して、ターミナルソフトを38400ボーで開いた状態で、基板のリセットスイッチを押すと
RX210-test ( CR,LF) と表示し、キーボードで送信すると、エコーバックが帰ります。
 SCI1の操作は、割り込みを使っておらず、送信(putcon)、受信(getcon)、受信ありか?(statcon)、の3個のBIOSでUARTを操作しています。パワーONで、"RX210-test\r\n" と送信し、その後は、UARTの受信があるかをチェックしながら、カウンターを動かし、約1秒でLEDを、ON,OFF、と点滅させるものです。UARTから1文字受信すると、送り返します。

メモリやI/OレジスタをUARTで操作するモニタを移植

 UARTで1文字の入出力を行うBIOSが確認できたところで、ターミナルソフトを使って、RX210のメモリやI/Oレジスタを操作できる、デバッグモニタを移植してみます。
 モニタでは、メモリのコピーにどれだけの時間がかかるか、簡単に測定できるように、フリーランカウンターを動作させ、実行前と実行後にカウンターを読んで、その差から短い実行時間を計測できるようにすると、CPUの動作スピードがどれほどなのか、おおよそ検討がつきます。フリーランカウンター(汎用タイマーで代用)は、昨今のマイコンにはたいてい実装されているので、RX210で調べると、どうやら16ビットカウンタしかないようです。できるだけ分解能が高く、長時間測定するには、ビット数の大きいカウンタがあればいいのですが、RX210には16ビットしかないというのは、お粗末に感じます。他のマイコン、NXPとか、STMicro のミドルレンジのARMマイコンには、System tick timer とかいう名のタイマーがあり、CPUクロックを32ビットカウンターで動作させるものがあり、100MHzでカウントしても、1時間は計測できます。

 16ビットのカウンターでは、長時間の測定ができないので、分解能を下げて、できるだけ遅くカウントして、せめて1〜10秒ぐらいは測定できるようにするため、RX210のマニュアルを探すと、マルチファンクションタイマパルスユニットの、MTU1が使えそうと判りました。MTU0、MTU5では、プリスケーラが、1/64 が最大、MTU2,3,4,では、1/1024 が最大、MTU1は、1/256 が最大となっていて、1/256 あたりを使うことにしました。25MHzのペリフェラルクロックでは、10.24μ秒で1カウントという性能です。16ビットで、0.6秒まで計測できます。

 さて、カウンタを使うにしても、初期設定があって、なかなか動作してくれません。マニュアルには、TSTRレジスタの対応するビットを1にすると、フリーランでカウントアップし、FFFFの次は0000に戻ってカウントを継続とあるのであすが、それだけでは動作してくれません。RX62Nでもそうでしたが、使いたい周辺機能の、モジュールストップ機能を解除する必要があります。ただ、その機能の解除には、レジスタライトプロテクション機能( PRCR )を使って、所定のレジスタが対象になっているビットを1にする必要があります。
 以上の操作の手順です。
  1. レジスタライトプロテクション機能( PRCR )の対応ビットを1にする。  PRCRのビット1を1にする。0x803FE に、0xA502 を書く。( 0xA5 は、書いた後に読んでも 0x00 である)
  2. モジュールストップ機能レジスタの対応ビットを0にする。  カウンタのMTU1は、MSTPCRAの、ビット9を0にする。*((long *)0x80010) = *((long *)0x80010) & 0xFFFFFDFF;
  3. レジスタライトプロテクション機能( PRCR )の対応ビットを0に戻す。  PRCRのすべてのビットを0にする。0x803FE に、0xA500 を書く。
 とりあえずは、これでフリーランカウンタの設定が有効になり、TSTRの所定ビットを1にすると、カウンタはデフォルトで動作してくれます。

カウンタを動作させ、10.24μ秒単位で0.6秒間までの時間計測機能を入れたモニタ AE-rx210test06.lzh
 時間計測は、メモリ間のコピーを実行したときなど、処理前と処理後のカウンタの差から、何カウントしたかを、後で確認できる。
 例:RX210-Bug>m3000,3100,100 ( enter ) これは、メモリの0x3000番地から0x3100番地へ、0x100バイトコピーするモニタのコマンド。
 これを実行後、
RX210-Bug>T ( enter ) で、コピーに要した時間をカウンタのカウント数で報告する。以下はその操作のスクリーンショット。


 バイト単位で0x100バイトのRAM間のコピーに、約40μ秒かかってることがわかります。1バイトあたり、約160n 秒になります。


内臓データフラッシュメモリ( E2データフラッシュ )

 RX210には、8kバイトのデータフラッシュメモリが内臓されており、マニュアルでは、10万回の書き換えが可能と記されています。この回数は、1時間に1回書き換えを行っても、10年ぐらいは使えるというものです。
 さてこのE2データフラッシュメモリですが、書き換えは当然ながら、読み出しを行うにしても、有効ビットを1にする必要があります。書き換えはさらに複雑で、RX210のCPUが直接書き込みを行うのではなく、イレーズ、ライトを行う専用シーケンサ( FCU )が行うというもので、そのシーケンサ用のプログラムコードも、特定のROM番地に書かれており、そこで実行するのではなく、専用RAMにコピーして行うようになっています。E2データフラッシュメモリの使い方をまとめると、以下になります。
  1. データを読む場合も、専用レジスタのビットを1にする必要がある。
  2. イレーズ、ライトは、専用シーケンサ、FCU が行い、このFCUへのコマンドで行う
  3. イレーズは、128バイト単位で行える。8kバイトで、64ブロックの構成になっている。
  4. ライトは、2バイトか、8バイト単位( long long アドレス境界 )で行える。
  5. ブランクか否かは、2バイト単位で行える。ブランクのエリアには、2バイト単位に追記が可能。
  6. データフラッシュメモリをイレーズしても、いわゆる0xFFにはならない。ランダムな値になっている。
  7. リード時のアクセススピードは、1バイト(もしくは2バイト)あたりFCLKx4( 25MHz/4 )である。
  8. 専用シーケンサ、FCU は、プログラム用フラッシュメモリの書き換えにも使える。
 リードの設定は簡単ですが、書き換えはかなり手間がかかります。マニュアルを読んでも、自力での書き換えソフトの作成は大変時間がかかるように思われ、さらに、たとえ書き換えができたとしても、本当にそれで正しいのか、不安が残ります。
 そこで、ルネサスのRX210サンプルのURLで、以下のサンプル an_r01an0544ju0240_rx_flash.zip を参考にして、データフラッシュの書き換えをできるようにしたいと思います。

 ここからダウンロードしたファイル、an_r01an0544ju0240_rx_flash.zip を開くと、RX62N とか、RX63N とかにも対応しているのがわかりますが、各種デバイス用に共通に書かれているので、ずいぶんと大きなプロジェクトファイルになっています。そこで、RX210の、E2データフラッシュに限定して抜き出して、書き換えモジュールを作成していきます。このサンプルは、CS+用のプロジェクトではなく、古い開発環境のものなので、開かずに、ソースをみながらの作成です。
 解凍して参考になりそうな部分は、以下です。
an_r01an0544ju0240_rx_flash\Source\r_flash_api_rx\src\r_flash_api_rx.c
an_r01an0544ju0240_rx_flash\Source\r_flash_api_rx\src\r_flash_api_rx_private.h
r_flash_api_rx.c を見ると、static uint8_t flash_init (void) という関数があり、ここで、E2フラッシュメモリの読み出し許可、書き換え許可などを行っています。RX210用の各種 define 定数文は、
an_r01an0544ju0240_rx_flash\Source\r_flash_api_rx\src\targets\rx210\r_flash_api_rx210.h にあります。
 参考になる、ルネサスのURL→E2データフラッシュ(データ格納用フラッシュメモリ)

内臓データフラッシュメモリをモニタで読み書きする

 内臓データフラッシュメモリの任意の番地にデータを書いたり、指定のブロック(0x80バイト単位)を消去するモニタのコマンドを追加し、フラッシュメモリを操作してみます。
 操作仕様は以下のようにしています。
  1. Ei ( enter ) で、データフラッシュメモリを初期化して、読み書きができる状態にする。
  2. Eex,y データフラッシュメモリの実アドレス、x から、y バイト( 0x80の倍数指定 )を消去する。
  3. Ewx,y,z データフラッシュメモリの実アドレス、x に、メモリの y 番地からの、z バイトを順に書く。z は偶数値。
 さて、これだけの操作をするのに、ずいぶんと多くの処理、状態遷移が必要で、解説は後にするとして、出来上がったもので操作した例が以下です。
クリックで拡大 ↓

 このスクリーンショットでは、
1、電源ON直後、E2データフラッシュの内容を読んで、0xFFとなっています。これは、何も書かれていないという意味ではなく、データフラッシュ部分が、バスに接続されていない状態です。
2、次に、Ei で初期化して同じアドレスを読んでいます。
3、次に、この部分を含む0x80バイトを消去して、表示したものです。消しても、0xFFにはなりません。
4、フラッシュに書くデータを、0x3000番地から設定しています。値は、0xAA,0xBB,0xCC ・・・0x3000番地はRAMです。
5、データフラッシュメモリの0x100000番地から、RAMの0x3000番地以降の8バイトを書きます。
6、書いた後読み出しています。RAMの、0x3000番地から、8バイトが書かれているのが判ります

 モニタで操作して、データフラッシュメモリを書き換えられるもの。→ AE-rx210test_e2flash2v.lzh

E2データフラッシュの、消去、ライトをするための、状態遷移

 E2データフラッシュを操作するのに必要な状態遷移は、マニュアルの、( r01uh0037jj0150-rx210.pdf ) 1444ページの図より、3種類あります。
第1は、読み出しのみできるE2データフラッシュリードモード。(データ読み出し可能)
第2は、プログラム、イレーズを行える、E2データフラッシュP/Eノーマルモード。(データ読み出し不可)
第3は、E2データフラッシュステータスリードモード。(データ読み出し不可)
 そのほか、P/Eノーマルモードに移行するには、「 周辺クロック通知 」という操作が必要です。他メーカーのマイコンでは、このようなコマンドはあまり見かけないですが、できれば、このような手続きは無くしてほしいものです。ルネサスの意図は、できるだけ早い書き込み方法をチューニングできるということみたいです。フラッシュ書き替えも、専用シーケンサのFCUが行い、CPUは完了待ちをするだけなので、他の処理ができるというメリットを出そうとしているみたいです。無論これには、完了割り込みの設定をしないと機能しません。

 では、E2データフラッシュの書き換えなどに、どれほどの時間がかかるのか確認するため、モニタに時間測定機能を入れて、測定してみました。測定機能を入れたプロジェクト一式です。→ E2フラッシュ消去、ライトの時間測定追加、他余分なメッセージ削除 AE-rx210test_e2flash2v_2.lzh 

以下は、4096バイトの消去、4096バイトのライトを実行したときの実行時間測定結果です。

 4096バイト(32ブロック)消去に、87msec, 4096バイトのライトに、360msec かかっているのが判ります。ライトには1バイトあたり、113μsec かかっているようです。

内臓温度センサーを使ってみる

 RX210には、温度センサーが内臓されていて、チップ自体の温度を測定できるようですが、チップそのものなので、周囲温度というわけにはいかず、必ず高めに測定されてしまいます。最高速度の50MHzではかなりの温度上昇が予想されます。
 マニュアルを調べると、ICLKが50MHzでは、周辺回路が動作していない状態で、10mA、全部の周辺回路が動作して、MAX55mAということです。(r01uh0037jj0150-rx210.pdf の、1460ページ参照)。秋月のボードは、5V動作なので、最低50mW、最大275mWということになります。
 さて、内臓温度センサーですが、単純にセンサーから温度を読み取るという操作はできないようで、2点の異なる温度でセンサーの電圧を測定して、校正を行う必要があり、これをしないと、ほとんど使いものにならないようです。マニュアルでは、校正なしに温度を測る方法が説明されていますが、おおよその温度からかなり外れることが判りました。r01uh0037jj0150-rx210.pdf の、1311ページには以下のように説明されています。
[また、「42. 電気的特性」に記載の温度傾斜を用いることで、温度T1 のときの温度センサの出力電圧V1 を、12 ビットA/D コンバータで試行測定することで求め、下記式により測定温度を算出します。なお、本 測定温度精度は2 点測定方法よりも劣ります。]
T=(Vs-V1)/Slope +T1


 そこで、とりあえず、上記の方法で簡易に温度を測定してみます。

 温度センサーを動作させ、値を読むには、以下の手順が必要です。
  1. A/Dコンバーターに供給する動作クロックを遅くする。これは、最初にクロック設定のところで行う。
     実際には、SCKCR レジスタの、ビット[3:0] を、一番大きい64分周にする。値は6。PCLKD は、100/64=1.5625 MHz となる。
  2. モジュールストップコントロールレジスタを操作して、A/Dコンバーターと、温度センサーを有効にする。
  3. A/Dコンバーターを、温度センサーの電圧を変換するモードにする。
  4. 温度センサーを動作させる、AVCCの電圧によって、設定値を選択する。PGAGAIN[1:0] の2ビットの設定値
     1.8V〜2.7V:[0:0], 2.7V〜3.6V:[0:1], 3.6V〜4.5V:[1:0], 4.5V〜5.5V:[1:1]
  5. 温度センサーを動作させる。動作すると、自動的にA/Dコンバーターが変換して、指定レジスタに変換値が書かれる。

 以上の設定をした後、A/Dコンバーターの値を読み、その値を Vs とすると、温度、T は、マニュアルの式( 1322ページ )から
T = (Vs - V1)/Slope + T1
 となります。ここで、V1 は、25℃の場合の電圧、T1は、25℃ ですが、V1 は、AVCC が、3.6Vの場合という条件になっているので、 基板の電圧( 実測では4.88Vほど )に換算したものにする。3.6Vでは、1.375Vだから、
 V1 = 1.375 * ( 4.88/3.6 ) で、1.864V
 Slope は、AVCCが、4.5V〜5.5Vの範囲なので、21.65mV/℃ を使う。

 以上の計算をして、実際に測ってみると、使用している基板では、室温20℃の時で、27℃ほどになってしまいました。無論、ICチップ内部の温度なので、周囲よりは若干高いですが、別の温度計で、( センサー部が小さく、IC表面に密着できる温度計 )23℃ほどでした。
 次に、RX210の動作スピードを遅くして、消費電力を下げるとどうなるか、試してみると、読み取りが2℃ほど下がりましたが、25℃で、依然とかなり高くなっています。

CPUの動作クロックを変更する

 上記において、RX210の動作スピードを変えるには、プログラムのソースを変更して再書き込みしないとだめですが、温度とか、消費電力を測定するには不便です。そこで、モニタから、CPUの速度を途中で変更できるような機能を入れます。
 RX210では、CPUのクロックと、周辺回路のクロックを独立して選択できるため、CPUのクロックを変更しても、UARTのボーレートが変わるということはありません。この辺は良くできていると思います。マニュアルによると、PLLの分周を、1/2, 1/4, 1/8, 1/16, 1/32, 1/64 の6通りにできるので、50MHzから、1.5625MHzまで、幅広く選択できます。UARTは、周辺回路クロック、PCLKB を使っているので、ここの分周を、1/4 のままとすれば、38400ボーのままモニタの操作ができます。

 CPUの動作クロックの変更は、システムクロックコントロールレジスタ SCKCR の設定で、( ICK )B27--B24 の4ビットを書き換えるとできますが、BCK(外部バスクロック) の設定も(使わない場合も)同時に遅いクロックに変更するようにと、マニュアルに記載されているので、CPU クロックである、ICK と同じか、遅い設定とします。クロックの変更は、電源ON後に行っているところがあるので、その関数を呼び出せば変更できます。

 ↓ クロック変更機能と、温度センサーを動作させる機能を入れた、操作モニタ一式
AE-rx210test_e2flash2v_6.lzh 
電源ON後、RX210のポート( PE7 ) を読んで、Lowなら、1.5625MHzで動作するようにしています。


以下は、AE-rx210test_e2flash2v_6.lzh を動作させ、使い方を表示させたものです。


 温度を測定した結果。RX210のIC表面温度は、別の温度計では、約29℃です。CPU動作クロックは1.5625MHzなので、ほとんど発熱は無い状態です。



内臓温度センサーはICの固体差がとても大きい

 簡易で温度を測れるようになったので、別の基板( 秋月で入手できる、AE_RX210 )で同じソフトを書き、温度を測定すると、これが、ずいぶんと異なる温度になり、デフォルトの定数のままだと、ほとんど使い物にならないようです。せいぜい2〜3℃ぐらいなら納得できますが、以下のように、20℃も差があると、唖然としてしまいます。




2点の温度でセンサーを動作させ、校正してみる

 マニュアルに記載されているように、2点の異なる温度でセンサーを動作させ、温度傾斜を算出する方法で、校正してみます。
 他の温度計で、2点の温度を計測し、それぞれ、T1, T2 とし、そのとき、RX210で読んだセンサーの電圧を、V1,V2 とすると、

 Slope = (V2 - V1)/(T2 - T1)

 このとき、RX210はできるだけ遅く動作させ、発熱を抑えておく。また、他の温度計のセンサーは、RX210のパッケージの中心付近に、熱伝導のよいペーストなどで密着させておく。

 次に、測りたい温度を、Ts とすると、そのときのセンサー電圧を、Vs とすると、

 Ts = (Vs - V1)/Slope + T1

が測定温度になるはずですが、これ試してみます。
 そこで、2点の温度を、室温と恒温漕とし、室温は、14℃前後、恒温漕は、40℃ぐらいに保てる、ヨーグルト発酵装置としてみました。ここで、他の温度計は、同じものを使います。

 測定した結果ですが、室温は18℃( 温度計測器でのIC表面温度 )、ヨーグルト発酵装置は、41℃ぐらいですが、温度計測器でのIC表面温度は、45℃ぐらいとなり、2枚のRX210基板で測定しました。ここで、簡易設定とは、マニュアル( r01uh0037jj0150-rx210.pdf )の、1311ページの最後で説明されている方法です。以下の表を作成するのに使った、測定温度(A/Dの読み取り)のログです。brd1_2_log.lzh

2枚のRX210基板で、18℃と45℃での比較
基板
 18℃ A/D読み取り値 
 45℃ A/D読み取り値 
 温度傾斜( mV/℃) 
基板1 簡易設定でそこそこの温度の基板
 1485 
 1975 
 21.62( mV/℃) 
基板2 簡易設定で大きくずれた基板
 1878 
 2352 
 20.92( mV/℃) 

 となりました。この表で、A/D読み取り値は、大きな差がありますが、温度傾斜はほとんど同じになっているのが判ります。これは、マニュアル( r01uh0037jj0150-rx210.pdf )の1557ページにある、温度傾斜の( 4.5 <= AVCC0 <= 5.5V )の、21.65mV/℃に、近い値なのが判ります。簡易設定では大きくずれても、温度傾斜を測定して、基準温度を18℃とすると、18℃〜45℃範囲内では、単純に比例なのでほぼ正確に測れますが、18℃〜45℃以外の温度で測るとどうなるのか、確認してみます。比例関係が、範囲を超えた温度でも保たれているのか、確認です。

校正した数値を元に、低い温度を測ってみる

 そこで、冷蔵庫を使い、一番下の冷凍室に、基板と、温度計測器( センサー部をICのパッケージ表面に密着させて、スポンジなどでICに押し付ける )で計測して、A/Dコンバーターの値を読んで、比較してみました。冷凍室に置くと、温度計測器は、だいたい −12.5℃前後を表示しました。

簡易設定でそこそこの温度の基板↓ ここで、テラタームのログで記録している温度は、プログラムが古く、簡易測定の計算の結果になっていて、情報として使うのはA/Dの読み取り値のみです。


簡易設定で大きくずれた基板↓



以下は測定したA/Dコンバーターの値を元に、温度を算出した結果

2枚のRX210基板で、−12℃付近での測定結果で算出
基板
 −12℃付近(ICパッケージの表面温度) 
 算出した温度 T= (Vs-V1)/Slope + 18 
 誤差 
基板1 簡易設定でそこそこの温度の基板
 −12.3℃ 
 −11.9℃ 
 +0.4℃ 
基板2 簡易設定で大きくずれた基板
 −12.7℃ 
 −14.0℃ 
 −1.3℃ 

 表から、2点の温度で校正すると、それらしい温度が測定されているのが判ります。
  2点で温度を校正すると、それらしく温度が測れるのがわかっても、実際これでは、基板(ICチップ)それぞれで、2点の温度でA/Dコンバーターを読み、校正に必要な定数を知る必要があり、量産にはとても使えそうにありません。
それと、CPUが動作している状態では発熱があるので、チップ内部の温度が判るだけで、周囲温度の測定は補正するにしてもかなり大雑把な温度となります。







準備中


ホームに戻る


inserted by FC2 system