「Arduino UNO R4」、そろそろ試してみないとなぁ
と思ってネットをさまよっていたら、
・Arduino UNO R4 の代替品1(RA4M1 コアボード):それ、やってみよう!
というページを発見。
・WeACT-RA4M1_CoreBoard
RA4M1コアボードが紹介されていました。
Arduino UNO R4、チップは高性能になっても、
基板サイズがUNO R3と同じ。
これでは、「ケースにちっこく組み込んで」という
工作ができません。
UNO R3は28ピンDIPのATmega328Pをソケットから
引っこ抜いて、ユニバーサル基板に組んだ回路に
乗せてということができるんでありがたいのです。
トラ技編集部からは、
・FLINT ProMicro R4(SWITCH SCIENCE扱い)
というのもあるよっとお聞きしてました。
このくらいの大きさなら、ユニバーサル基板に乗
せられるっと。
しかし、64ピンマイコンの多くの足が端子に出ないままに
なってます。
ところが、RA4M1コアボードはダブルの端子を使って
いるのでほとんどの信号が足に出ています。
こりゃエエかもっと買ってみました。
※ブートローダーの書き込み方法は前述の紹介
記事を参照。
まずやってみたのがI/Oポートのアクセス速度チェック。
digitalWriteとポートの直書きを比較してみました。
// 出力ピンのテスト
// D8ピン P304 digitalWriteでH/L
// D9ピン P303 直接I/OでH/L
// RA4M1 CoreBoardのLEDはP012(VREFH:DAC用Vref)につながっている
/***** SETUP *****/
void setup()
{
pinMode(8, OUTPUT); // P304
pinMode(9, OUTPUT); // P303
}
/***** LOOP *****/
void loop()
{
while(1){
digitalWrite(8, 1); // P304 H/L/H
digitalWrite(8, 0);
digitalWrite(8, 1);
R_PORT3->PODR_b.PODR3 = 1; // P303 H/L/H
R_PORT3->PODR_b.PODR3 = 0;
R_PORT3->PODR_b.PODR3 = 1;
R_PORT3->PODR &= ~(0b11 << 3); // 304,303 L
}
}
コネクタはまだ付けてないので、スルーホールに
クリップを引っかけて波形観察。
こんな波形が得られました。
digitalWriteでのH/Lだと1.34μs。
直書きだと0.42μs。
※思ったより速くありませんでした。
RA4M1コアボード、メイクロック用として16MHzの
水晶発振子が乗っています。
これを基準にPLLして48MHzを出すとどうなるかを
試してみたいと思います。
※RA4M1のスペックでは12.5MHzが最大。
16MHzをPLL入力が受け入れてくれるのかどうかが問題。
※UNO R4の回路を見ると、実装されていないけれど
同じように発振子(Y1)のパターンが見えます。
部品名がFTX16.000M12SM3S-30/30てなってい
てこれも水晶発振子。
※PLLは逓倍数が8~31で、それを1/2か1/4して
メインクロックの48MHzに。
ということは16MHz×12して192MHz。
それを1/4して48MHzという流れ。
※水晶の周波数を12MHzとか8MHzに落とせばエエですが、
R4の現パターンに乗るような小型の水晶が無いようです。
※しかし、もう、誰かやってるかな?
※1MHzパルスを出してメインクロックの様子を見る
// 1MHz出力のテスト
// D5ピン P102 GT2B 1MHzでトグル出力
// D8ピン P304 loopでH/L
// D9ピン P303 millis変化でトグル(500Hz)
// ポートH/L制御出力
#define D8_H (R_PORT3->PODR_b.PODR4 = 1) // D8:P304 H/L
#define D8_L (R_PORT3->PODR_b.PODR4 = 0)
#define D9_H (R_PORT3->PODR_b.PODR3 = 1) // D9:P303 H/L
#define D9_L (R_PORT3->PODR_b.PODR3 = 0)
/***** SETUP *****/
void setup()
{
pinMode(8, OUTPUT); // D8:P304
pinMode(9, OUTPUT); // D9:P303
// D5:P102
R_PMISC->PWPR_b.B0WI = 0; // PFS書き込みプロテクト解除
R_PMISC->PWPR_b.PFSWE = 1; // (プロテクト戻してないよ)
R_PFS->PORT[1].PIN[2].PmnPFS_b.PDR = 1; // ポート出力に
R_PFS->PORT[1].PIN[2].PmnPFS_b.PSEL = 0b00011; // GTIOC2B
R_PFS->PORT[1].PIN[2].PmnPFS_b.PMR = 1; // 機能出力有効
// GPT2 B出力を1MHzでトグル
R_MSTP->MSTPCRD_b.MSTPD6 = 0; // PWMモジュールストップ解除
R_GPT2->GTCR_b.MD = 0b000; // ノコギリ波モード
R_GPT2->GTUDDTYC = 0b11; // 強制的にupカウント
R_GPT2->GTUDDTYC = 0b01; // up継続
R_GPT2->GTCR_b.TPCS = 0b000; // PCLKD/1 48MHz
R_GPT2->GTPR = 24 - 1; // 48MHz/24=2MHz トグルで1/2して1MHz
R_GPT2->GTCNT = 0; // 初回カウント値
R_GPT2->GTIOR_b.GTIOB = 0b01100; // GTIOC2B 周期の終わりでトグル出力
R_GPT2->GTIOR_b.OBE = 1; // B出力許可
R_GPT2->GTCR_b.CST = 1; // カウント開始
}
/***** LOOP *****/
void loop()
{
uint32_t ms , a; // 1msチェックデータ
int f_x9 = 0; // D9ポート反転フラグ
ms = millis(); // 現1ms値
while(1){
D8_H; // D8:P304 H/L
D8_L;
a = millis(); // 新1ms値
if(ms != a){ // 1ms変化?
f_x9 ^= 1; // 0/1
if(f_x9) D9_H; // D9:P303 H/L
else D9_L;
ms = a; // 次の1msを待つ
}
}
}
タイマー2を使って、メインクロックを1/48して1MHzの
方形波を出してみました。
今回、RA4M1コアボードは3枚買いました。
そのうちの2枚の出力周波数が1MHzより10~30Hz高い
だけで「水晶発振で動いてるんとちゃうん?」と思う
くらいでした。
残り1枚がプラス400Hzほど。
ただし、みんなけっこう変動しています。
周波数カウンタのゲート時間1秒で観察すると平均化さ
れてしまって分かりにくいのですが、0.1秒にすると
400~600Hzほどで変動してるのが目立ちます。
さて、うまいこと水晶発振によるPLL化はできるかな?
もう一つ。
メインクロックの短期間周波数変動を見ようとするとど
うしたらよいでしょか。
計測時間を長くすると平均化されてしまうし。
別に置いた基準発振周波数とMIXして、差を見る
なんて方法かな。
「BFO」ですな。
※こんな銀色袋に入ってきた
買ったのは「5V」タイプ。
※続き
・2025年5月3日:RA4M1コアボードの16MHz水晶をPLLでメインクロックに
とりあえず、16MHz水晶からPLLで48MHzメインクロックを
作るのはできました。
安定性の検証はこれから。
最近のコメント