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です。


© Rakuten Group, Inc.