AVRを始めました。
皆様のHPを参考にさせてもらいながらのスタートです。
まずは、ISP書き込み用のケーブルからです。
リサイクルショップから、プリンタケーブルを買ってきて加工しました。
|
|
まずは皮膜の一部を切り取り中をすべて取り出して作りました。 |
最初は、LEDのチカチカから始めました。
その後は、2年位前に仕入れてあったアナデバのADF4117というRF PLL FrequencySynthesizers用のデバイス
を使って1GHzのPLLを作ってみることにしました。
(これは、スペアナの第2LOに不満があるため作り変える前実験も兼ねています)
超初心者が最初に作ったものです。笑わないでください。Hi
英語のデーターシートを、辞書片手に迷訳しながらなんとか結果が出ましたが本来の使い方とは違うかも知れません。
|
実験中の様子です。 AVRは、AT90S2313を使っています。 VCOは秋月で入手した1GHz付近のものです。 目標出力周波数は1000MHzです。 ADF4117は、ダイセン電子の変換基盤を使っています。 リファレンスは、12.8MHzを1/128して100KHzを取り出しています。 VCOの出力を、1/10000するためにNカウンタの構成をBカウンタ312、Aカウンタ16として N=312×32+16=10000 としています。 |
|
|
スパン10KHzで見たものです。 左側が今回作ったもの 右側は8657Bのものです。 比べる相手が悪すぎますが バッラク実験ですのでもう少し きちんと作ればもう少しは良くなるのではと思います。 |
|
|
少し広い範囲の様子です。 |
何はともあれ、なんとかPLLをロックさせることに成功しました。
次は、AT90S8535を使って、LCD表示・ロータリーエンコーダ制御・キーボード入力の実験をしてみました。
|
テストボードの様子です。 LCDはBポートに ロータリーエンコーダはDポートに キーボードはCポートにつなぎました。 |
|
ロータリーエンコーダーを使ってカウントアップさせた ところです。 プログラムはこんなものです。 意外と簡単に制御できました。 Debounceという便利な命令があります。 簡単に説明すると、 DEBOUNCE Px,y , state , label , [ , sub] Px、yの状態(state)を持ってlabelに行きなさいという ような命令のようです。 今回は、Portd.5が0ならSubに行きPortd.6の状況を 確認してPortd.6が0ならカウントアップ、1ならカウントダウンするというプログラムにしました。 こんな簡単なプログラムですが、結構早く回しても取りこぼしはほとんどありません。 |
キーボードを使った、入力実験です。
こちらも、GETKBDという命令があり、これ一つですみます。
Dim A As Word
Config Portc = Input ‘Portcを入力にする
Config Kbd = Portc ‘Portcにキーボードを繋ぐ
Config Debounce = 3 ’チャタリング防止
Do
A=Getkbd()
Lcd A
Loop
End
プログラムはこれだけで、キーを押すとディスプレィに表示されます。
DDS制御
AD9851を使ってみました。
|
実験の様子です。 AD9851は、変換基盤に実装して穴明き基盤に取り付けています。 プログラムの内容はともかく、DDS出力できました。 |
|
50MHzを出力した様子です。 実装の問題もあり、かなり不要出力があります。 LPFも通していない状態ですから仕方ないのではと 思います。 きちんと実装してやれば、もう少し良くなると思います。 |
なにはともあれ、DDSの制御に成功したので一安心です。
FrequencyCounter
AVRを使った定番のFrequencyCounterです。
これは、JA9TTT/1加藤さんのHPにある「Daddy's AVR Microchip Challenge! 」の中のThe AVR Frequency Counter,Real simple !
を元にして、自分なりにカスタマイズして作っています。詳細な内容は加藤さんのHPを御覧ください。
残念ながら、加藤さんのHPは閉鎖されました。
|
DDSから、1MHZの信号を入力しています。 少し見えにくいですが、「999996」を表示して います。 原典から、カスタマイズした点は、 ・ ゲートタイムを、0.01S、0.1S、1S、10S の4段階に切り替えれるようにしました。 切り替えにはINT0割り込みを利用しました。 ・ 将来的な事を考えて表示は別のAVRを使って7segLED で7桁表示するようにしました。 今回のプログラムで、2Kバイトの約90%を使用しました ので、2313を使ってDEMO版では7segLEDを表示させ る事は無理でした。 そこでデータを別のAVRに送ってそちらで表示させるように しました。 データの送受には、「Shiftin,Shiftout」命令を使いました。 ゲートタイムは押しボタンを押すたびに0.01→0.1 →1→10→0.01Sと変わります。 |
このままで、約6MHzまでカウントできました。
参考文献 BASCOM AVR Manual
JA9TTT/1加藤さんのHP Radio Experimenter's site(閉鎖されました)
A/D変換
A/D変換の実験をしました。
使用したAVRは、Atmega48-20PIです。(クロックは10MHz、この程度ではあまり早くしなくても十分のようです)
最初は、基本の電圧測定からです。
ATmega48の場合、Pin21のAREFがA/D変換の基準電圧になります。(2V~AVCC)
ここの電圧が不安定だとA/D変換値の誤差要因になります。
AVRのコマンドは GETADCです。
書式としては、 W=Getadc(n)となります。
nはポート番号になります。Atmega48の場合Pin23〜Pin28(PortC.0〜PortC.5)までがA/D変換用です。
PortC.5を使う場合は、 W=Getadc(5)になります。
AREFと同電圧になったとき1023が出力されます。
AREFの電圧をE1とすると、変換値を電圧に直すには 電圧=(変換値/1023)×E1にすればいいことになります。
|
|
実際に変換して表示してみたところです。 電圧を表示したところです。 少し誤差がありますが、856の指示値も校正していないのでどちらがどうかは??です。 又、AREFの実電圧とプログラム中の電圧値にも誤差があります。 |
今度は、dbm表示にして7segLEDに表示してみます。
入力部にはAD8307を使用しました。
AD8307の出力値を測ったところ10dbm入力が変化すると出力は平均0.2149V変化しました。
そこでプログラムでは、1dbmの変化を0.021493VとしてA/D変換した電圧を0.021493で割って
実際の値に合わせるために85.1を引いています。
下に、実際に測定したデータを示します。
入力が小さくなると誤差が大きくなってきます。これはAD8307の切片の傾きが少し狂っているためです。
AD8307の4番Pinに付いている50KのVRで調整できます。
|
|
30MHz IN=13.09dbm |
|
|
30Mhz IN=−16.79dbm |
|
|
30MHz IN=−46.17dbm |
ということで、A/D変換も無事出来ました。
AVRを使ってDDSの実験をしてみました。
|
実験中の様子です。 R−2Rのラダー抵抗を使ってD/A変換して Sin波を作ろうというものです。 使ったAVRはATmega88です。 PORT.Dをすべて使っています。 ポートは8つあるので8bitとなり 0−255までの256通りの出力が出せます。 Sin波の1周期を256分割してそれぞれの 値を求めてData化します。 |
|
この方法で作ったSin波です。 周波数は、NOP命令の数で変えています。 |
|
高調波が結構出ています。 8bitでは、この程度のものなのでしょうか。 |
|
これは、ATmega88のクロックを 12.8MHzで駆動したときの波形の拡大図です。 ギザギザになっているのが判ります。 |
|
こちらは、クロックを27MHzにUPした ときのものです。 (オーバークロックについては自己責任です) なだらかな波形になっています。 簡単な方法で、Sin波を発生させることが 出来ました。 27MHzで駆動したときの最大発生周波数は 約7KHzでした。 ASMなどを使えばかなり高い周波数まで作る ことが出来るようです。 今回この実験をしたのは、AF−TTGを作る ためです。 |