クモ、アナログの味を知る
STATUS: 故障中x2
ここのところ毎日 USBSPYDER08で遊んでますが、今日はADC(A/Dコンバーター)を動かしてみました。
ADCが動けば、アナログ値はなんでも入力できますからね。ボリュームからはじまって、温度センサーや距離センサー、加速度センサーなどみんなアナログで入力できます。
とりあえず、手軽なアナログ入力としてボリュームをつないでみました。
USBSPYDER08のCPUであるMC9S08QG4のコアは「HCS08」なのですが、丁度いいサンプルがみつからなかったので、「HC08」を使ったサンプルを参考にしました。
参考にしたページは、ここです。→ADCを使う
HC08とHCS08では、レジスタの名称が異なりますがデータシートみながら書きかえてみたらすんなり動きました。
ボリュームからの抵抗値をA/Dで8bit値として取得し、SPYDER08上のLEDを値に応じた明るさで点灯します。
HCS08用のソースは以下のようになります。
#include <hidef.h> /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ void main(void) { int n1,n2,i; EnableInterrupts; /* enable interrupts */ PTADD = 0b00000001; // PTAD bit 0 = out PTAD &= 0b11111110; // ADC start // 7 COCO // 6 AIEN // 5 ADCO // 43210 ADCH (select AD03 = 00011) ADCSC1 = 0b00000011; for(;;) { if ( ADCSC1 & 0b10000000 ) { n1 = ADCRH; // 0 n2 = ADCRL; // 0-255 ADCSC1 = 0b00000011; // ADC restart PTAD |= 0b00000001; for ( i=0; i<n2; i++ ) { __RESET_WATCHDOG(); } PTAD &= 0b11111110; for ( i=0; i<255-n2; i++ ) { __RESET_WATCHDOG(); } } __RESET_WATCHDOG(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ }
「ADCSC1」が、1つめのADCの制御レジスタで、変換方法や入力チャンネルの指定を行います。
連続変換が指定されていない場合は、このレジスタに書き込みがあるたびに、変換処理が開始されます。
また、今回は、ADP3のピンに接続しているので、入力チャンネルにAD03を選択しています。
AD変換には少し時間がかかります。「ADCSC1」の最上位ビットが、1になると変換は完了です。
「ADCRH」と「ADCRL」レジスタに値が入ってます。簡単ですね。
10bitの入力が可能ですが、デフォルトでは8bit入力となりますので、「ADCRL」に0〜255の値がはいります。
詳しくは、データシートの114ページを見てください。
あとは入力した値にしたがって、LEDを点灯しています。PTA0のON/OFFを制御しています。
入力値によって、LEDを点灯する時間を変更することで明るさを制御しています(PWM制御)。
配線は、写真をみてみてください。
→写真
USBSPYDER08上のピンから、ICクリップで直接ボリュームに繋いでいるだけです。
ICクリップの接続は次のとおりです。
赤…3番ピン(Vdd)
黒…4番ピン(Vss)
緑…8番ピン(ADP3)
簡単ですねえ。
ICクリップだけでいろいろ繋いで遊べます。
この後、CMOS温度センサー(S-8100B、秋月で100円で売ってました。データシート付き)をボリュームに繋ぎ変えてみました。
流石に、簡単に作り出せる温度変化ではLEDの明るさはほとんどかわらないので、デバッガで入力値をみると、手でつまんで暖めると約110、氷で冷やすと約140になりました。うんうん、それっぽいね。
これでだいたいこのマイコンの感じがつかめてきました。
何でも作れそうな気がしますよ〜