AVR

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]

Pxyの状態(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の場合、Pin21AREFA/D変換の基準電圧になります。(2V~AVCC

ここの電圧が不安定だとA/D変換値の誤差要因になります。

AVRのコマンドは GETADCです。

書式としては、 W=Getadc(n)となります。

nはポート番号になります。Atmega48の場合Pin23〜Pin28(PortC.0PortC.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の4Pinに付いている50KVRで調整できます。

 

30MH

IN=13.09dbm

30Mhz

IN=−16.79dbm

30MH

IN=−46.17dbm

 

ということで、A/D変換も無事出来ました。

 

2009.10.11

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を作る

ためです。

 

 

戻る