
写真1 AD9833 DDS MSOP 0.5ピッチ 変換基板に乗せる
それはさておき、
このチップは10ピンのMSOPで、写真にようにピンセットの先ほどの大きさです。
変換基板に取り付けましたが、ピンのピッチは0.5なので、半田付けにはちょっと技術が必要です。
まずチップをゲルタイプの瞬間接着剤で正確な位置に仮止めしておきます。
フラックスをほんのわずか塗って、すべてのピンにわざとまたがるくらい半田を盛ります。
半田吸い取り線で、余分な半田を吸い取って、出来上がり。
慣れれば簡単ですが、最初は数個パーにする覚悟がいります(笑)。
このDDSは、マスタクロック(MCLK)周波数は最高25MHzで、その場合最高発振周波数(ナイキスト周波数)は12.5MHzとなり、分解能は0.1Hzです。
今回は手持ち部品の関係で、20MHzのクリスタルを使用したので、10MHzまでのプログラマブルオシレータとして、実験してみました。この場合の分解能は約0.075Hzです。
1MHzを作ってみる STM32VL Discovery
投稿日 2012/03/22
STM32 VL Discoveryで1MHzを発振させてみました。
STM32 VL Discoveryには標準で8MHzのクロック用水晶発振子が搭載されていますが、ソケットになっており交換可能です。
8MHzのままだと500KHz(周期 2us)が限度ですが、16MHzに交換すると1MHz(1us)まで発振させることができました。

写真1 水晶発振子(中央)を16MHzに交換したディスカバリー PC8にプローブをあてる
発振といってもGPIOピンをトグルさせているだけです。
GPIOをトグルさせる方法には、STM32vldiscovery_LEDToggle()や、GPIO_SetBits()とGPIO_ResetBits()を交互に繰り返す方法がありますが、これらの関数を使うとオーバーヘッドがあるので、GPIOのメモリ上のレジスタを直接ON/OFFさせます。
LED4をトグルさせる場合は、GPIOCの8ピン(PC8)です。
メモリマップでは、0x40011000 + 0x0C = 0x4001100Cが、GPIOC_ODRのアドレスです。このアドレスのbit8をON/OFFしてやります。
クロック供給とGPIOCの初期化は標準関数を使います。
タイマー割り込みのTickを使い、SystemCoreClock を1000000で分周して0.5us周期の割り込みを得ます。
割り込みハンドラで、上記ビットをトグル(ON/OFF)します。
分周値を変更すれば好きな周波数の方形波が得られるので便利かと思います。

写真2 1MHzの波形観測 1v/div 0.5us/div
プログラム ソースコード
#include "stm32f10x.h"
#include "STM32vldiscovery.h"
#define GPIOC_ODR *(volatile unsigned short *) 0x4001100C
int main(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOC, &GPIO_InitStructure);
SysTick_Config(SystemCoreClock / 1000000);
while(1);
}
void SysTick_Handler(void){
if(GPIOC_ODR == 0x100) GPIOC_ODR = 0x000;
else GPIOC_ODR = 0x100;
}
補足: STM32VL Discoveryの最高クロック周波数は24MHz(水晶発振子8MHzの3倍)ですが、この実験では倍の48MHz(16MHzの3倍)で動かしています。当然動作補償はありませんし、他の機能にどのような影響があるかもわかりません..... が、そこはアマチュア精神で!
(JF1VRR)