2010年02月14日
D/A変換、正弦波を出力
みなさん、おはようございます。
休日出勤のみなさん、お勤めご苦労さまです。
昨日紹介した回路は、D/A変換機能があり、
プログラミングによって、自由な波形を出力できます。
回路の仕組みは、
デジタル出力(RB0~RB7)の計8本のビット信号を、
ラダー回路でアナログ電圧に置き換えます。
つまり、8ビット0~255の値を、
アナログ電圧の0V~5Vで出力します。
では、実際に出力した波形を、
オシロスコープで測定してみました。
写真では縦の線が薄くて見えませんが、
波形が階段のようになっていますね~
正弦波(サイン波)になんとか見える程度まで、
分かりやすくデーターを荒くしてみたのですが、
逆に精度上げて細かくしても、
拡大してみればD/A変換では、
このように階段状になります。
次にプログラムを紹介しますが、
波形出力のポイントだけ説明します。
こちらはアセンブラですが、
頑張って読んでみてくださいね~(^^;;
● get32 のサブルーチン関数で、
サイン派の値を、テーブルから取り出してリターンするだけです。
メインに戻ったところで、
その値を、★PORTB に出力するだけです。
;------------------------------------ ;サイン波形の出力 ;------------------------------------ DIV32 CLRF ix LP32 BSF ix,4 LP32_1 MOVF ix,W CALL get32 ;● MOVWF PORTB ;★ MOVF cnt_ini,W MOVWF cnt LP32_2 DECFSZ cnt,F GOTO LP32_2 DECFSZ ix,F GOTO LP32_1 GOTO LP32 ;------------------------------------ ;サイン波の出力する値を、返り値とする。 ;------------------------------------ get32 ADDWF PCL,f RETLW d'0' ;DUMMY RETLW d'128' ;0 RETLW d'177' ;1 RETLW d'218' ;2 RETLW d'245' ;3 RETLW d'255' ;4 RETLW d'245' ;5 RETLW d'218' ;6 RETLW d'177' ;7 RETLW d'128' ;8 RETLW d'79' ;9 RETLW d'38' ;10 RETLW d'11' ;11 RETLW d'1' ;12 RETLW d'11' ;13 RETLW d'38' ;14 RETLW d'79' ;15
こちらのテーブルの値と、実際の画像を見比べると、
一致しているのが、分かりますね~
d'128'からはじまって、d'177'と増えていきます。
d'255'で頂点になって、そこから下がって行きます。
C言語でも書けますが、プログラムメモリーが、
1024 バイトしかないので、注意が必要です。
math 関数を組み込むだけで、オーバーしてしまいます。(^^;;
まあ~、1個250円のマイコンチップですから、
そんなものですよね~
PICマイコン PIC16F84A-20/P
次は、こちらをご覧ください。
先ほどと同じプログラムですが、
値を補間して、線がこんなに滑らかになっていますね~
とても不思議なのですが、
2個のコンデンサーを追加しただけなんです。
※赤枠、0.022uF、青枠、47uFの電解コンデンサー
※回路の名前は積分回路です。
このようにゲームや組み込み系では、
プログラムとハードが密接に関係しています。
今日も「いいスマイル」で行きましょう!
ツイッターはじめました~フォロー待ってま~す!!
↓↓↓下記の3つのバナーをクリックして下さい。ランキングUPにご協力をお願いします。↓↓↓
投稿者 shiozumi : 01:01