
写真1 AD9833 DDS MSOP 0.5ピッチ 変換基板に乗せる
それはさておき、
このチップは10ピンのMSOPで、写真にようにピンセットの先ほどの大きさです。
変換基板に取り付けましたが、ピンのピッチは0.5なので、半田付けにはちょっと技術が必要です。
まずチップをゲルタイプの瞬間接着剤で正確な位置に仮止めしておきます。
フラックスをほんのわずか塗って、すべてのピンにわざとまたがるくらい半田を盛ります。
半田吸い取り線で、余分な半田を吸い取って、出来上がり。
慣れれば簡単ですが、最初は数個パーにする覚悟がいります(笑)。
このDDSは、マスタクロック(MCLK)周波数は最高25MHzで、その場合最高発振周波数(ナイキスト周波数)は12.5MHzとなり、分解能は0.1Hzです。
今回は手持ち部品の関係で、20MHzのクリスタルを使用したので、10MHzまでのプログラマブルオシレータとして、実験してみました。この場合の分解能は約0.075Hzです。
FM3 AD変換でLEDチカチカのスピードを変える
投稿日 2012/05/04
インターフェース6月号付録のFM3で遊んでいます。
今回はADコンバータを動かしてみました。
前回の500ms固定のLED点滅から一歩進んで、点滅スピードを可変できるようにしてみました。

写真1 ADコンバータ AN16の電圧をボリュームで可変し、その値でLED点滅スピードを変える
インターフェース誌6月号にADコンバータの使い方が載っていますが、そのとおりやると若松の拡張ボードを購入しなければならない(これがまた高い)ので、波形生成して音にするのはあきらめて、LEDチカチカのスピードを変えるだけにしました。これだと拡張ボードは要らず、単に可変抵抗(ボリューム)をつなぐだけです。
FM3ボードにはピンヘッダを半田付けして、ブレッドボード用のジャンパワイヤがつながるようにしておきます。
プログラムは一から作るのは面倒なので、インターフェース誌のサンプルプログラムの一部を使わせていただきました。このサンプルはここからダウンロードできます。
このサンプルプログラムからADC関連の部分のみ使います。

写真2 FM3ボードにピンヘッダを半田付けし、ボリュームとはブレッドボード用ジャンパでつなぐ
プログラムは、ごく簡単で、SysTickの周期割り込みでLEDを点灯/消灯していたものを、ADCから読み込んだ電圧値で周期を可変できるようにしただけです。
可変抵抗(ボリューム)は、何Ωでも構いませんが、以下のようにつないでおきます。
VR-pin1 Vcc 3.3V(CN2-pin39)
VR-Pin2 AN16(CN2-pin1)
VR-pin3 GND(CN2-pin40)
私は、10KΩBを使いました。
下記プログラムをIAR EWARNでコンパイル/リンクし、USB Direct ProgrammerでFM3にダウンロードします。
LEDの点滅スピードを、約2.5秒間隔から可変できるようになります。
#include "mcu.h"
void Init_Port(void);
void init_adc(void);
uint16_t adc_get12bit(void);
void Init_Port(void)
{
FM3_GPIO->PFRF_f.P3 = 0; //PF3 set to GPIO
FM3_GPIO->PZRF_f.P3 = 1; //PF3 set to open drain mode
FM3_GPIO->DDRF_f.P3 = 1; //FP3 set to output
FM3_GPIO->PDORF_f.P3 = 0; //FP3 set to init value low
}
void Init_adc(void){
FM3_ADC0->ADCEN_f.ENBL = 1; //動作許可
while (!(FM3_ADC0->ADCEN_f.READY));
FM3_ADC0->SCIS2_f.AN16 = 1; //スキャン変換入力選択
FM3_ADC0->ADST0 = 0xFF; //サンプリング時間 1/HCLK * ((31 + 1) * 256 + 1)
FM3_ADC0->ADCR_f.SCIE = 1; //スキャン変換割込み許可
FM3_ADC0->SCCR_f.SSTR = 1; //変換スタート
return;
}
uint8_t adc8bit;
uint16_t adc_get12bit(void){
return (FM3_ADC0->SCFD >> 20) & 0xFFF;
}
void ADC0_IRQHandler(void){
FM3_ADC0->ADCR_f.SCIF = 0; //スキャン変換割込み要求クリア
adc8bit = (adc_get12bit() >> 4) & 0xFF;
FM3_ADC0->SCCR_f.SSTR = 1; //変換スタート
}
void SysTick_Handler(void)
{
static uint8_t cnt = 0;
cnt++;
if (cnt >= adc8bit) { //10ms x adc8bit
FM3_GPIO->PDORF_f.P3 = ~FM3_GPIO->PDORF_f.P3; //Toggle LED
cnt = 0;
}
}
int32_t main(void)
{
uint32_t period;
Init_Port();
Init_adc();
NVIC_EnableIRQ(ADC0_IRQn);
period = SystemCoreClock / 100; //10mms tick
SysTick_Config(period);
for(;; ) {};
}
(JF1VRR)