fslashtの日記: [SPYDER08] クモ、アナログの味を知る
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になりました。うんうん、それっぽいね。
これでだいたいこのマイコンの感じがつかめてきました。
何でも作れそうな気がしますよ~
[SPYDER08] クモ、アナログの味を知る More ログイン