本ドキュメントはCypress (サイプレス) 製品に関する情報が記載されております。 AN702-00002-1v0-J New 8FX Family 8-BIT MICROCONTROLLER MB95260H series 距離計測センサ・モジュールコントロール GP2Y0A21YK の接続応用例 AN702-00002-1v0-J 注意事項 本資料の記載内容は、予告なしに変更することがありますので、ご用命の際は営業部 門にご確認ください。 本資料に記載された動作概要や応用回路例は、半導体デバイスの標準的な動作や使い 方を示したもので、実際に使用する機器での動作を保証するものではありません。し たがいまして、これらを使用するにあたってはお客様の責任において機器の設計を行 ってください。これらの使用に起因する損害などについては、当社はその責任を負い ません。 本資料に記載された動作概要・回路図を含む技術情報は、当社もしくは第三者の特許 権、著作権等の知的財産権やその他の権利の使用権または実施権の許諾を意味するも のではありません。また、これらの使用について、第三者の知的財産権やその他の権 利の実施ができることの保証を行うものではありません。したがって、これらの使用 に起因する第三者の知的財産権やその他の権利の侵害について、当社はその責任を負 いません。 本資料に記載された製品は、通常の産業用、一般事務用、パーソナル用、家庭用など の一般的用途に使用されることを意図して設計・製造されています。極めて高度な安 全性が要求され、仮に当該安全性が確保されない場合、社会的に重大な影響を与えか つ直接生命・身体に対する重大な危険性を伴う用途(原子力施設における核反応制御、 航空機自動飛行制御、航空交通管制、大量輸送システムにおける運行制御、生命維持 のための医療機器、兵器システムにおけるミサイル発射制御をいう)、ならびに極め て高い信頼性が要求される用途(海底中継器、宇宙衛星をいう)に使用されるよう設 計・製造されたものではありません。したがって、これらの用途にご使用をお考えの お客様は、必ず事前に営業部門までご相談ください。ご相談なく使用されたことによ り発生した損害などについては、責任を負いかねますのでご了承ください。 半導体デバイスはある確率で故障が発生します。当社半導体デバイスが故障しても、 結果的に人身事故、火災事故、社会的な損害を生じさせないよう、お客様は、装置の 冗長設計、延焼対策設計、過電流防止対策設計、誤動作防止設計などの安全設計をお 願いします。 本資料に記載された製品を輸出または提供する場合は、外国為替及び外国貿易法およ び米国輸出管理関連法規等の規制をご確認の上、必要な手続きをおとりください。 本書に記載されている社名および製品名などの固有名詞は、各社の商標または登録商 標です。 Copyright© 2011 FUJITSU SEMICONDUCTOR LIMITED all rights reserved 1 AN702-00002-1v0-J 改版履歴 版数 日付 内容 1.0 版 2010.09.27 新規作成 2 AN702-00002-1v0-J 目次 注意事項 ...............................................................................................................................1 改版履歴 ...............................................................................................................................2 目次 ...................................................................................................................................... 3 1 はじめに ........................................................................................................................ 4 2 距離計測センサ・モジュール GP2Y0A21YK について ................................................ 5 3 2.1 距離計測センサ・モジュール GP2Y0A21YK の制御信号 .................................. 5 2.2 距離計測センサ・モジュール GP2Y0A21YK の特性......................................... 6 2.3 距離計測センサ・モジュール GP2Y0A21YK のデータ取得方法 ....................... 6 2.4 MB95260H シリーズと距離計測センサ・モジュール GP2Y0A21YK の接続 ..... 7 MB95260H シリーズによるソフトウェア制御 .............................................................. 9 3.1 メイン処理 ......................................................................................................... 9 3.2 MB95260H シリーズの A/D コンバータ起動とデータ取得 .............................. 12 3.3 MB95260H シリーズの A/D コンバータ初期化 ................................................ 14 3.4 MB95260H シリーズの A/D コンバータ 10bit データ取得................................ 15 3.5 MB95260H シリーズの A/D 変換データ電圧変換............................................. 16 3.6 距離換算 (電圧変換データの距離変換) ............................................................ 18 3.7 LCD 表示 (距離データの表示) ......................................................................... 20 3 AN702-00002-1v0-J 1 はじめに このアプリケーションノートでは, 富士通 New 8FX ファミリ MB95260H シリーズを用 いて市販の距離計測センサ GP2Y0A21YK を制御する方法について説明します。 汎用的なサンプルのため New 8FX シリーズ全版に対応します。 4 AN702-00002-1v0-J 2 距離計測センサ・モジュール GP2Y0A21YKについて GP2Y0A21YK は市販されている距離計測センサ・モジュールの中でも低価格で使い方が簡 単なモジュールの一つです。このモジュールには距離計測 IC が内蔵されており、モジュー ル一体型の赤外線 LED と PSD(Position Sensitive Detector)により、非接触で距離を検出 することができます。出力形式はアナログ電圧出力タイプです。図 2-1 に GP2Y0A21YK の 外形および図 2-2 にブロック図を示します。 図 2-1 GP2Y0A21YK 外形 図 2-2 GP2Y0A21YK 回路 2.1 距離計測センサ・モジュールGP2Y0A21YKの制御信号 GP2Y0A21YK の制御信号を示します。 pinNo Symbol Function 1 Vo Analog output 測定結果出力 2 GND GND 3 Vcc 4.5 ~ 5.5V 表 2-1 GP2Y0A21YK 端子 Vo : 計測物までの距離に応じた電圧出力 5 AN702-00002-1v0-J GND : GND 接続 VCC : 電源 5V 入力 2.2 距離計測センサ・モジュール GP2Y0A21YK の特性 距離計測センサ・モジュール GP2Y0A21YK の測定距離は 10cm(MIN)から 80cm(MAX)です。 計測距離に応じて Vo の出力が変化します。 図 2-3 GP2Y0A21YK 特性例 詳しくはメーカーから発行されているモジュールのデータシートをご参照下さい。 http://document.sharpsma.com/files/GP2Y0A21YK-DATA-SHEET.PDF (2011 年 2 月現在) 2.3 距離計測センサ・モジュールGP2Y0A21YK のデータ取得方法 距離計測センサ・モジュール GP2Y0A21YK の距離計測結果は Vo 端子よりアナログ電圧と して出力され、図 2-3 に示す特性を持っています。 このアプリケーションノートでは GP2Y0A21YK から出力されるアナログ電圧のデータを New 8FX シリーズに搭載されている 8,10bit A/D コンバータを用いて取得する方法を示しま す。New 8FX に搭載されている A/D コンバータには 8bit または 10bit の A/D 変換精度が切 り替え可能です。今回は 10bit 精度によるデータ取得の処理を行います。 6 AN702-00002-1v0-J 2.4 .4 MB95260Hシリーズと距離計測センサ・モジュールGP2Y0A21YKの接続 MB95260H シリーズと距離計測センサ・モジュールとの応用例を図 2-4 に、回路図の例を 図 2-5 に掲載します。データの表示には LCD コントローラー内蔵モジュールとして一般的 な SC1602BS を利用しています。 LCD モジュール SC1602BS の制御方法に付きましては、別冊 「LCD モジュールコントロ ール SC1602BS の接続応用例」を参照ください。 Distance Sensor: GP2Y0A21YK Voltage LCD: Distance SC1602BS MCU : New 8FX MB95260 series 図 2-4 GP2Y0A21YK 応用例 7 AN702-00002-1v0-J 図 2-5 MB95260H と GP2Y0A21YK 回路図例 注) MB95200H シリーズを利用する場合、デバッガの RSTOUT 端子より出力されるフラッ シュ書込み用高電圧 10V をマイコンの RST 端子に入力する必要があります。 詳しくは各マイコンに対応したハードウェアマニュアルを参照ください。 8 AN702-00002-1v0-J 3 MB95260Hシリーズによるソフトウェア制御 3.1 メイン処理 GP2Y0A21YK より出力される測定距離電圧 VO をアナログ電圧変換、表示させるためのメ イン概略フローおよびサンプルコードを示します。 main MCU 初期化 LCD 初期化 A/D 変換タイミング用 タイマー起動 No TBT タイマー起動 変換終了? Yes GP2Y0A21YK 電圧値表示 A/D データ電圧換算 電圧値表示 GP2Y0A21YK 距離表示 電圧を距離に換算 距離表示 9 AN702-00002-1v0-J メイン処理サンプルコード /* main.c*/ /********************************************************************* NAME: main () FUNCTION: *********************************************************************/ void main() { unsigned char SenseData; MCU_initialization(); /*------------------------------------------------------------------*/ // LCD module initial /*------------------------------------------------------------------*/ LCD_Initial(); IO_TBTC.byte = 0x1c; /* TBC3-0 1110b 1.049s@8MHz */ IO_TBTC.bit.TCLR = 1; /* initial */ IO_TBTC.bit.TBIE = 1; /* Interruppt enable */ 10 AN702-00002-1v0-J /*------------------------------------------------------------------*/ // Display of AD Data on SC1602SB_LCD /*------------------------------------------------------------------*/ while(1) { if (AD_flag == 1) { __DI(); AD_flag = 0; LCD_Position(0,0); LCD_Printf(" デンアツ ="); // LCD 文字表示 // SC1602LCD_Control(LCD_CURSOR_SH_RIGHT); lcd_voltage(); // caluculate of voltage lcd_displayf(answer); // display to LCD LCD_Printf("V"); // LCD "V" 文字表示 // LCD_Position(1,0); LCD_Printf(" キョリ ="); // LCD 文字表示 // SC1602LCD_Control(LCD_CURSOR_SH_RIGHT); lcd_distance(); // calculate of distance data if (answer <= 63){ lcd_displayf(answer); // display to LCD LCD_Printf("cm"); // LCD "cm" 文字表示 // LCD_Printf("overflow"); // LCD 文字表示 // } else{ } AD_flag = 0; IO_TBTC.bit.TCLR = 1; /* initial */ __EI(); } } } 11 AN702-00002-1v0-J 3.2 MB95260HシリーズのA/Dコンバータ起動とデータ取得 GP2Y0A21YK のアナログ電圧を取得するために MB95260H シリーズの A/D コンバータを 利用します。A/D コンバータの起動と変換データ取得のための概略フローおよびサンプルコ ードを示します。 Time Base Timer の割込み in タイミングにて処理を実施。 TBT 割込みフラグクリア A/D 変換開始 ADC_start() No A/D 変換終了フラグ確認 変換終了? Yes ADC_sample() A/D 変換終了フラグ = 1 return 12 A/D データ取得 AN702-00002-1v0-J A/D コンバータ起動およびデータ取得サンプルコード /* main.c*/ /********************************************************************* NAME: __interrupt void TBT_interrupt () FUNCTION: A/D convert and Display function *********************************************************************/ __interrupt void TBT_interrupt (void) { __DI(); IO_TBTC.bit.TBIF = 0; /* Interruppt clear */ /*------------------------------------------------------------------*/ // A/D module get GP2Y0A21YK data /*------------------------------------------------------------------*/ ADC_start(); // A/D start // A/D converter ready? while(IO_ADC1.bit.ADMV); // Check A/D convert finish flag AD_Sample(); // Measurement data read AD_flag = 1; __EI(); } 13 AN702-00002-1v0-J 3.3 MB95260HシリーズのA/Dコンバータ初期化 MB95260H シリーズの A/D コンバータを起動します。概略フローとサンプルコードを示し ます。 ADC_start AN01 端子 アナログ入力端子として アナログ入力設定 AN01 を設定 A/D 変換精度 10bit 設定 One time 変換モード A/D 変換開始 return A/D コンバータ初期化サンプルコード /*MB95260AD.c*/ /********************************************************************* NAME: ADC_start() FUNCTION: Initial AD, IO-PORT *********************************************************************/ void ADC_start(void) { IO_ADC1.byte = 0x10; // AN01 as input IO_ADC2.byte = 0x01; // 10-bit resolution, 2/MCLK IO_ADC1.bit.AD = 1; // start A/D converter } 14 AN702-00002-1v0-J 3.4 MB95260HシリーズのA/Dコンバータ 10bitデータ取得 MB95260H シリーズの A/D コンバータの変換結果を取得します。概略フローとサンプルコ ードを示します。 unsigned int ADC_Sample ad_data; A/D 変換結果取り込み用メモリ ad_data =ADDH 上位取得 ad_data 上位データ左シフト ad_data =ADDL 下位取得 A/D 変換開始 return A/D コンバータ 10bit データ取得サンプルコード /*MB95260AD.c*/ unsigned int ad_data; /********************************************************************* NAME: AD_Sample() FUNCTION: Use AN00 as the sample voltage channel *********************************************************************/ void AD_Sample(void) { ad_data = IO_ADD.byte.ADDH; // Read AD Sample value ad_data = ad_data << 8; ad_data |= IO_ADD.byte.ADDL; // Start AD again IO_ADC1.bit.AD=1; } 15 AN702-00002-1v0-J 3.5 MB95260H シリーズの A/D 変換データ電圧変換 MB95260H シリーズの A/D コンバータの変換結果 16 進数を電圧値に換算します。 概略フローとサンプルコードを示します。 10bit の A/D 変換結果を上位 2bit+下位 8bit に格納した A/D 変換結果レジスタの値を、アナ ログ電圧値に換算します。 演算条件: ・電源電圧 = 5.0V ・A/D 変換の分解能 =10bit 1bit 辺りの電圧は 5.0V/1023(10bit) = 0.00487585V となります。 この計算を行なうことで A/D コンバータにて取り込んだ距離計測センサ・モジュール GP2Y0A21YK の出力電圧値をアナログ数値化します。 calculate_data A/D 変換結果をメモリへ upper_voltage =ADDH 上位 取り込み lower_voltage =ADDL 下位 上位 2bit の計算 upperfloat = Upper_voltage *1.25 5.0V / 4(2bit) = 1.25 lowerfloat = lower_voltage *0.004887585 下位 8bit の計算 5.0V / 1023(8bit) = 0.004887585 calcu_data = upperfloat + lowerfloat return 16 結果 = 上位 2bit + 下位 8bit AN702-00002-1v0-J A/D コンバータ 10bit データ電圧変換サンプルコード /*Main.c*/ /********************************************************************* NAME: caluculate_data() FUNCTION: A/D data translate from Hex to Dec *********************************************************************/ void calculate_data(void) { /* calcu_data =(ad_data * 0.0195); unsigned int upper_voltage; unsigned int lower_voltage; float upperfloat; float lowerfloat; float ansfloat; /* 5.0V/10bit Voltage change */ upper_voltage = IO_ADD.byte.ADDH; // Read AD Sampling H_value lower_voltage = IO_ADD.byte.ADDL; // Read AD Sampling L_value /*------------------------------------------------------------------*/ // Upper 2bit(bit9,bit8) = 5.0V/1023 = 100hex(256) (5.0V/4=1.25) // Lower 8bit(bit7-0) = 5.0V/1023 = 0.004887585 @1bit*/ // Output = calcudata = 10bit A/D Voltage /*------------------------------------------------------------------*/ upperfloat = (upper_voltage * 1.25); /* 上位 2bit */ lowerfloat = (lower_voltage * 0.004887585); /* 下位 8bit */ ansfloat = (upperfloat + lowerfloat); calcu_data = ansfloat; /* 5.0V/10bit Voltage change */ } 17 AN702-00002-1v0-J 3.6 .6 距離換算 (電圧変換データの距離変換) A/D コンバータの変換結果を距離に換算します。 このアプリケーションでは電圧を距離に換算するためにメーカーの示す特性グラフの近似 式として、距離 = 27.22×電圧 Vo-1.2027 を基に計算しています。 概略フローとサンプルコードを示します。 calculate_distance x = calcu_data (A/D 電圧値) Y = -1.2027(近似式の値) Y ans = X^ 距離 = 27.22 * ans return 18 距離 = 27.22×電圧 Vo-1.2027 AN702-00002-1v0-J 電圧変換データの距離変換サンプルコード /*Main.c*/ /********************************************************************* NAME: caluculate_distance() FUNCTION: Calculation of measuring distance in : calucu_data = ad_converter voltage data out : Y_distance = 27.22 * x^-1.2027 *********************************************************************/ void calculate_distance(float calcu_data) { double x; double y; double ans; x = calcu_data; /* A/D data = Voltage V*/ y = -1.2027; ans = pow(x, y); /* ans = x^(-1.2027) */ X_voltage = ans; // convert from voltage to distance) Y_distance = 27.22 * (X_voltage); } 19 AN702-00002-1v0-J 3.7 LCD表示 (距離データの表示) 算出した距離を表示します。このアプリケーションでは LCD コントローラー内蔵モジュー ルとして一般的な SC1602BS を利用しています。制御方法に付きましては、別冊 「LCD モジュールコントロール SC1602BS の接続応用例」を参照ください。 概略フローとサンプルコードを示します。 lcd_displayf 整数部演算表示 少数点( . )表示 少数 二桁目演算表示 少数 二桁目演算表示 少数 三桁目演算表示 return 20 AN702-00002-1v0-J 電圧変換データの表示サンプルコード /*Main.c*/ /********************************************************************* NAME: lcd_displayf() FUNCTION: Data send to SC1602 *********************************************************************/ void lcd_displayf(float answer) { unsigned char save_data; unsigned char disp_data; save_data = answer; /* 1 桁目 float to char 整数変換 */ /*------------------------------------------------------------------*/ // LCD display of distance upper data 0cm~99cm /*------------------------------------------------------------------*/ if (flag == 1){ make_distance_data(save_data); lcd_display_header(henkan); } 21 /* 整数部 0~99 変換 */ AN702-00002-1v0-J /*------------------------------------------------------------------*/ // LCD display of voltage or distance /*------------------------------------------------------------------*/ else { lcd_display(save_data); } LCD_Printf("."); // LCD 文字表示 // /* 少数 1 桁目 (a.bcd - a = 0.bcd)*10 = b.cd */ answer = (answer-save_data)*10; disp_data = answer; /* disp_data = b */ lcd_display(disp_data); /* 少数 2 桁目 (b.cd - b = 0.cd)*10 = c.d */ answer = (answer-disp_data)*10; disp_data = answer; /* disp_data = c */ lcd_display(disp_data); /* 少数 3 桁目 (c.d - c = 0.d)*10 = d */ answer = (answer-disp_data)*10; disp_data = answer; lcd_display(disp_data); } 注:各サンプルコードは本アプリケーションノート付録のサンプルプロジェクトから抜粋 したものです。全体は付録のサンプルコードを参照ください。 22 AN702-00002-1v0-J その他の情報 富士通マイクロコントローラ製品に関するその他の情報については, 下記の Web サイト をご覧ください。 http://jp.fujitsu.com/fsl/ 23