【メモ書き】 ArduinoでPLL制御 2023年冬 | ||
中華PLLのADF4351、ADF5355とかMAX2870の周波数書き込みは いつもはPICでアセンブラでやっているのだが、Arduinoで書いてみた。 そのコードと作り方を忘れないように書いておく。 (ちゃんと動くかあまり確認してない。コードも用途に合わせ書き換え必要) 本件ポイントはArduino基板上でプログラム開発後、CPUチップだけを移しPLL基板を制御するものである。 必要なもの Arduino Uno R3 (例えば秋月電子M-07385) この上でプログラムを書き、ライター代わりに書き込みまで行うのでCPUはDIPソケットが良い CPU Atmega328P ブートローダー書き込み済み 秋月電子 I-12774 (5V 16MHz用のこと) 8MHz セラミック発振子 秋月電子 P−00153 プログラム Arduino開発環境が必要。ボードはArduinoUnoR3を選択するとかUSBでつながることなど準備は必要。 当然操作方法とかも。 以下 ADF4350で1296MHzを出した例、 ピン番号を回路に合わせ変更する PLLによりレジスタ数、書き込み順序が違うのでそれに合わせ変更する。 ADF4350はR5からR0の順に書くので以下のようになる。 レジスタ数は6に限らない、いくつでも書き込み順に並べて可。 レジスタは32bitのこと。 この例では1回設定すると無限ループに入る。 *************************************************************************** const int PIN_DATA = 2; const int PIN_LE = 3; const int PIN_CLK = 4; //1296.0MHz ref25MHz ADF4350 unsigned long reg[] = { 0x00580005, //reg5 書き込む順番に並べること 0x009C803C, //reg4 0x000004B3, //reg3 0x00004E42, //reg2 0x080080C9, //reg1 0x00338088 //reg0 }; void setup() { pinMode(PIN_DATA, OUTPUT); pinMode(PIN_LE, OUTPUT); pinMode(PIN_CLK, OUTPUT); } void loop() { for ( int i=0; i<sizeof(reg)/sizeof(unsigned long); i++) { digitalWrite(PIN_LE, LOW); shiftOut(PIN_DATA,PIN_CLK,MSBFIRST,reg[i]>>24); shiftOut(PIN_DATA,PIN_CLK,MSBFIRST,reg[i]>>16); shiftOut(PIN_DATA,PIN_CLK,MSBFIRST,reg[i]>>8); shiftOut(PIN_DATA,PIN_CLK,MSBFIRST,reg[i]); digitalWrite(PIN_LE, HIGH); } delay(1000); while(1); //無限LOOP } *************************************************************************** 回路、接続 左はArduinoUnoR3とPLLボードをつなぐ開発時のイメージ この時、CPUは16MHzで動きCLK,LE,DATA線は0-5Vとなる。 PLLボードの電源は省略したが5Vの場合、3.3Vの場合があり、PLLが3.3VでArduinoUnoは5Vの場合直接続は注意が必要 右はプログラム書き込み済みATMEGA328PとPLLボードを接続したもの。組み込み型のイメージ CPU ATMEGA328PはArduinoUno上で開発、デバッグが終わったものを抜いてくる。 CPUを8MHzで動作させる理由はCPUを3.3Vで動作させる場合があるので。 8MHzでの動作は開発時の16MHzにくらべ処理速度が半分になることを承知していること。 CPUを3.3Vで動作可能なのでPLLボードが3.3Vの時は特別な注意は必要ない。 PLLが5VならCPUも5Vでで動かせば簡単。 PLLボードの電源、その他CEなどの端子は省略してあるが適切に処理のこと。 ArduinoUno上でプログラムを作りそこからCPUを抜いてくることでライターは不要となる。 抜いたあとはブートローダ書き込み済みCPUを挿せばまた同じことができる。 |