A/D変換R8C/15には4chの10bitA/D変換機能があります。ここでは、ルネサスのHPよりアプリケーションノート「A/D読み込み」を参考にします。 では実際にコードを記述します。 /* グローバル変数 */ unsigned short angle; // ポテンション値 /* I/Oポート初期化*/ pd1_2 = 0; // p1_2/AN10を入力モードに設定(p180) 任意の箇所で・・・ /* ポテンション値取得 */ angle = a_d(); uart_put_short_dec((unsigned short)angle); /* 値送信 */ uart_putc((unsigned char)0x0d); /* CR */ uart_putc((unsigned char)0x0a); /* LF */ /****************************************/ /* A/D変換 */ /****************************************/ unsigned short a_d(void) { int i; unsigned short ad_max; unsigned short ad_min; unsigned short ad_sum; /* A/D変換 初期設定 */ md = 0; // 単発モード adgsel0 = 1; // p1グループ選択 ch2 = 1; // AN10選択 ch1 = 1; ch0 = 0; adcap = 0; // A/D変換自動開始ビット 0:adstでスタート cks1 = 1; // f1を選択 cks0 = 0; bits = 1; // 10ビットモード vcut = 1; // Vref接続 smp = 1; // サンプル&ホールドあり /* 10回サンプリング */ adst = 1; // A/D変換開始 while(adst ==1 ); // 変換終了待ち ad_max = ad; ad_min = ad; ad_sum = ad; for( i=1; i<10; i++){ // 残り9回 adst = 1; // A/D変換開始 while(adst ==1 ); // 変換終了待ち if(ad_max < ad) { // 最大値取得 ad_max = ad; } if(ad_min < ad) { // 最小値取得 ad_min = ad; } ad_sum += ad; } ad_sum -= ad_max; // 最大値、最小値の無視 ad_sum -= ad_min; ad_sum = ad_sum >> 3; return(ad_sum); } プログラムでは、変換終了をその場で待ちながら10回連続値を読み取り、 最大値と最小値を無視して、8回分のデータの平均を取るソフトウェアフィルタが入っています。 変換速度については、サンプル&ホールドを使う使わないで倍違いますが(p188)、 使う場合は、1回辺り33φADサイクル(8MHz,f1で、約4μs)、10回連続で、約40μsです。 ジャンル別一覧
人気のクチコミテーマ
|