⑧SSD1306(OLED) ⑨I2C LCD1602 ⑩AD9833 DDS ⑪AS9850 DDS ⑫Si5351A
参考サイト
●Seeed Studio XIAO SAMD21 入門ガイド
XIAO SAMD21
・強力な CPU:ARM® Cortex®-M0+ 32bit 48MHz マイクロコントローラー(SAMD21G18)、256KB Flash、32KB SRAM を搭載。
・柔軟な互換性:Arduino IDE と互換性があります。
・11 個のデジタル/アナログピン、10 個の PWM ピン、1 個の DAC 出力、1 個の SWD ボンディングパッドインターフェース、1 個の I2C インターフェース、1 個の UART インターフェース、1 個の SPI インターフェース。
ピン配置
seeed studio から抜粋
【https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json】追加
⑧SSD1306(OLED)
Arduinoはメモリ容量(Flashが32KB)が少なく【#include <Adafruit_SSD1306.h>】ライブラリーを使うとプログラムによってはメモリ不足なる。XIAO SAMD21のメモリ容量(Flashが256 KB)多いので気にしないで使用できる。
結線
XIAO SSD1306
3.3V -- VCC
GND -- GND
SCL -- SCL
SDA -- SDA
プログラム Arduino IDE【ボード:Seeeduino XIAO】
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Wire.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306:0 allocation failed"));
for (;;);
}
display.setTextColor(SSD1306_WHITE);
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0, 20);
display.println("Hello");
display.println("World!");
display.display();
}
void loop() {
}
⑨I2C LCD1602 ディスプレイ
結線
XIAO LCD1602
5V -- VCC
GND -- GND
SCL -- SCL
SDA -- SDA
プログラム Arduino IDE【ボード:Seeeduino XIAO】
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
float count = 1.0;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Ready...");
delay(3000);
}
void loop(){
char line1[15] = "Hello, world!";
char line2[15];
char floatString[4];
dtostrf(count, 3, 1, floatString);
snprintf(line2, 15, "Count: %s", floatString);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
count = count + 0.1;
delay(100);
}
⑩AD9833 DDS
●AD9833 波形発生器 DDS信号発生器モジュール 0〜12.5MHz DIY 波/三角波/方形波信号生成プログラム Arduino IDE【ボード:Seeeduino XIAO】
#include <AD9833.h>
#define FREQ 1000000.0 // サイン波1MHzを指定
#define FNC_PIN D7
AD9833 gen(FNC_PIN);
void setup() {
gen.Begin();
gen.ApplySignal(SINE_WAVE, REG0, FREQ); // サイン波
//gen.ApplySignal(TRIANGLE_WAVE, REG0, FREQ); //三角波
//gen.ApplySignal(SQUARE_WAVE, REG0, FREQ); //矩形波
float actFreq = gen.GetActualProgrammedFrequency(REG0);
gen.EnableOutput(true);
}
void loop() {
}
⑪AD9850 DDS
結線
XIAO AD9850
3.3V -- VCC
GND -- GND
D7 -- W_CLK
D8 -- FU_UD
D9 -- DATA
D10 -- RESET
プログラム Arduino IDE【ボード:Seeeduino XIAO】
#include <EF_AD9850.h>
EF_AD9850 AD9850(D7, D8, D10, D9); //CLK ,FQ_UP,RESET,DATA
void setup()
{
AD9850.init();
AD9850.reset();
}
void loop(){
AD9850.wr_serial(0x00,10000000);//10MHz
}
⑫Si5351Aクロックジェネレータ(90度位相シフト)
結線
XIAO Si5351A
5V -- VCC
GND -- GND
SCL -- SCL
SDA -- SDA
CLK0 -- CH1(オシロ)
CLK1 -- CH2(オシロ)
10MHz 90度位相シフト
プログラム Arduino IDE【ボード:Seeeduino XIAO】
/*
* Si5351A 位相制御test
* 2017.10.10
* JH7UBC Keiji Hata
* 秋月電子のSi5351Aモジュール使用
*/
#include <Wire.h>
#define Si5351A_ADDR 0x60
#define OUTPUT_CTRL 3 //Output Enable Control
#define CLK0_CTRL 16 //CLK0 Control
#define CLK1_CTRL 17 //CLK1 Control
#define CLK2_CTRL 18 //CLK2 Control
#define MSNA_ADDR 26 //Multisynth NA Parameters
#define MSNB_ADDR 34 //Multisynth NB Parameters
#define MS0_ADDR 42 //Multisynth0 Parameters
#define MS1_ADDR 50 //Multisynth1 Parameters
#define MS2_ADDR 58 //Multisynth2 Parameters
#define CLK0_PHOFF 165 //CLK0 Initial Phase Offset
#define CLK1_PHOFF 166 //CLK1 Initial Phase Offset
#define PLL_RESET 177 //PLL Reset
#define XTAL_LOAD_C 183 //Crystal Internal Load Capacitance
uint32_t frequency;
const uint32_t XtalFreq = 25000000; //25MHz
uint32_t P1;
uint32_t P2;
uint32_t P3;
uint32_t PllFreq;
uint32_t l;
float f;
uint8_t mult;
uint32_t num;
uint32_t denom;
uint32_t divider;
char PLL;
uint8_t PLL_ADDR;
uint8_t MS_ADDR;
void setup(){
Wire.begin(); // Arduino is Master
Si5351_init(); //Si5351 initialize
//PLLAのセット 900MHz,CLK0=10MHz
//N(divider) = fvco(PLLA) / fout(CLK0)
frequency = 10000000;
divider = 900000000 / frequency; //divider = fvco / fout
if (divider % 2) divider--;
PLL_Set('A',frequency,divider);
//CLK0の設定
Si5351_write(CLK0_CTRL,0x4C); //Reg16 Sorce PLLA
MS_Set(0,divider);
Si5351_write(CLK0_PHOFF,0);//CLK0 delay 0
//CLK1の設定
Si5351_write(CLK1_CTRL,0x4C); //Reg17 Sorce PLLA
MS_Set(1,divider);
Si5351_write(CLK1_PHOFF,divider);//Reg166 delay T/4 (90degree)
Si5351_write(PLL_RESET,0xA0); //Reg177 PLLA and PLLB
}
void loop(){
}
//Si5351のレジスタに1バイトデータを書き込む。
void Si5351_write(byte Reg , byte Data)
{
Wire.beginTransmission(Si5351A_ADDR);
Wire.write(Reg);
Wire.write(Data);
Wire.endTransmission();
}
//Si5351Aの初期化
void Si5351_init(){
Si5351_write(OUTPUT_CTRL,0xFF); //Reg3 Disable Output
Si5351_write(CLK0_CTRL,0x80); //Reg16 CLOCK0 Power down
Si5351_write(CLK1_CTRL,0x80); //Reg17 CLOCK1 Power down
Si5351_write(CLK2_CTRL,0x80); //Reg18 CLOCK2 Power down
Si5351_write(XTAL_LOAD_C,0x92); //Reg183 Crystal Load Capasitance=8pF
Si5351_write(PLL_RESET,0xA0); //Reg177 Reset PLLA and PLLB
Si5351_write(CLK0_CTRL,0x4F); //Reg16 CLOCK0 Power up
Si5351_write(CLK1_CTRL,0x4F); //Reg17 CLOCK0 Power up
// Si5351_write(CLK2_CTRL,0x4F); //Reg18 CLOCK0 Power up
Si5351_write(OUTPUT_CTRL,0xFC); //Reg3 Enable CLOCK0,CLOCK1
}
//PLLの設定
void PLL_Set(char Pll,uint32_t Freq,uint32_t Div){
PllFreq = Div * Freq; //fvco =d * fout
mult = PllFreq / XtalFreq; //整数部 mult = a = fvco / fxtal
l = PllFreq % XtalFreq; // L = fvco % fxtal
f = l;
f *= 1048575;
f /= XtalFreq;
num = f;
denom = 1048575;
P1 = (uint32_t)(128 * ((float)num /(float)denom)); //128*(b/c)
P1 = (uint32_t)(128 * (uint32_t)(mult) + P1 - 512); //128*a + (128*(b/c))-512
P2 = (uint32_t)(128 * ((float)num / (float)denom)); //128*(b/c)
P2 = (uint32_t)(128 * num -denom * P2); //128*b–c*(128*(b/c))
P3=denom;
if (Pll == 'A')
{
PLL_ADDR = MSNA_ADDR;
}else
{
PLL_ADDR = MSNB_ADDR;
}
Parameter_write(PLL_ADDR,P1,P2,P3);
}
//MultiSynth(分周器)のセット
void MS_Set(uint8_t MS_No,uint32_t Div){
P1 = 128 * Div - 512;
P2 = 0;
P3 = 1;
switch(MS_No){
case 0:
MS_ADDR = MS0_ADDR;
break;
case 1:
MS_ADDR = MS1_ADDR;
break;
case 2:
MS_ADDR = MS2_ADDR;
break;
default:
MS_ADDR = MS0_ADDR;
}
Parameter_write(MS_ADDR,P1,P2,P3);
}
//レジスタにパラメータP1,P2,P3を書き込む。
void Parameter_write(uint8_t REG_ADDR,uint32_t Pa1,uint32_t Pa2,uint32_t Pa3)
{
Si5351_write(REG_ADDR + 0,(Pa3 & 0x0000FF00) >> 8);
Si5351_write(REG_ADDR + 1,(Pa3 & 0x000000FF));
Si5351_write(REG_ADDR + 2,(Pa1 & 0x00030000) >> 16);
Si5351_write(REG_ADDR + 3,(Pa1 & 0x0000FF00) >> 8);
Si5351_write(REG_ADDR + 4,(Pa1 & 0x000000FF));
Si5351_write(REG_ADDR + 5,((Pa3 & 0x000F0000) >> 12) | ((Pa2 & 0X000F0000) >> 16));
Si5351_write(REG_ADDR + 6,(Pa2 & 0x0000FF00) >> 8);
Si5351_write(REG_ADDR + 7,(Pa2 & 0x000000FF));
}
.png)
.png)
.png)
.png)
.png)
.png)
0 件のコメント:
コメントを投稿