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

写真1 FM3にロータリーエンコーダをつなぐ
アルゴリズムは同じです。
ロータリエンコーダのAチャネルはPF4(FM3 CN4 Pin9)、BチャネルはPF5(FM3 CN4 Pin10)にプルアップ抵抗10KΩを付けてつなぎました。
カウントミスがなく、非常に滑らかに動きます。
ソースコード(LCDハンドラは省略)
SysTick_Handlerは、ディレイのカウント、ハートビートLED、ロータリエンコーダのハンドリングを行っています。
//Tick_Interrupt_Handler.c
#include "mcu.h"
void delay_ms(__IO uint32_t nTime);
static __IO uint32_t TimingDelay;
uint16_t change = 0;
uint16_t cnt = 0;
uint8_t Encorder_int_cnt = 0;
uint8_t prev = 0x03;
uint8_t now = 0;
uint8_t A_Ch;
uint8_t B_Ch;
void SysTick_Handler(void){
//Delay
if (TimingDelay != 0x00) {
TimingDelay--;
}
//Heartbeet LED
cnt++;
if (cnt >= 500) {
FM3_GPIO->PDORF_f.P3 = ~FM3_GPIO->PDORF_f.P3; //Heartbeat
cnt = 0;
}
//Encorder
if(Encorder_int_cnt == 6) { //make 3ms
Encorder_int_cnt = 0;
A_Ch = FM3_GPIO->PDIRF_f.P4;
B_Ch = FM3_GPIO->PDIRF_f.P5;
now = (A_Ch << 1) + B_Ch;
if(prev != now) {
if (((prev << 1) + now) & 0x02) {
if(now == 0x03){ //right, lock position
change = 1;
}
} else {
if(now == 0x03){ //left, lock position
change = -1;
}
}
prev = now;
}
} else Encorder_int_cnt++;
}
void delay_ms(__IO uint32_t nTime){
TimingDelay = nTime;
while(TimingDelay != 0);
}
//main,.c
#include "mcu.h"
#include "stdio.h"
extern uint16_t change;
void Init_Port(void);
void delay_ms(__IO uint32_t nTime);
void Init_LCD(void);
void lcd_xy(uint8_t x, uint8_t y);
void lcd_puts(uint8_t *str);
void lcd_write(uint8_t x, uint8_t y, char *str);
void lcd_clearall(void);
void lcd_clearline1(void);
void lcd_clearline2(void);
void Init_Encorder(void);
int16_t counter = 0;
void Init_LED(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_Encorder(void){
//PF4 Encorder A Ch
FM3_GPIO->PFRF_f.P4 = 0; //PF4をGPIOとして使用
FM3_GPIO->DDRF_f.P4 = 0; //PF4を入力にする
//PF4 Encorder B Ch
FM3_GPIO->PFRF_f.P5 = 0; //PF5をGPIOとして使用
FM3_GPIO->DDRF_f.P5 = 0; //PF5を入力にする
}
int32_t main(void){
char str[10];
SysTick_Config(SystemCoreClock / 1000);
Init_LED();
Init_LCD();
Init_Encorder();
NVIC_EnableIRQ(ADC0_IRQn);
lcd_write(1, 1, "FM3 Encorder" );
for( ;; ){
if(change != 0){
counter = counter + change;
change = 0;
}
sprintf(str, "%6d", counter);
lcd_write(1, 2, str);
delay_ms(100);
}
}
(JF1VRR)