PIC/16F1705のDAC(DAコンバータ)を使ってみた(ソース付き)
先日PICで正弦波を作ろうということで
「PICのDAC(DAコンバータ)を使ってみた」
「PICのDAコンバータ(DAC)を使ってみた - 補足」
を書いたのですが、5bitじゃどうしようもないな、というのが実感でした。
ところが最近きむしげさん(きむ茶工房ガレージハウス)から耳寄りな情報がもたらされました。
最近秋月電子にて16F1705が販売されています。
これはDAC出力が5ビット(32レベル)から8ビット(256)に変更なっています。
さっそく飛びつきました (^^)
16F1705の全体像についてもきむ茶工房ガレージハウスの
「16F1705覚書」
が詳しいです。
前回と同じように正弦波発振器(?)を作ってみました。
ソースもつけましたが、これは可能な限りシンプルに作ってあります。
この記事を読むとけっこうきれいな波形が得られるように見えますが、これは高い入力抵抗で出力を受けているからです。実用するならDAC出力を内蔵オペアンプでバッファした例を参考にしていただいた方がいいと思います。
「PIC/16F1705のオペアンプをDACのバッファとして使ってみた」
として記事にしました。
さらに“実用”に使うのであれば
「PIC16F1705の8ビットDACを使って(実用的)正弦波発振器を作る - 1」
が参考になると思います。
=======
16F1705の特長は上に書いたようにDACが8bitになっていることです。
データシートを見る限り“出力抵抗が出力電圧に依存する”という特性は引き継いでいるようです。ただ16F1705はなんとオペアンプを内蔵しています。これを利用すれば低い出力インピーダンスで歪のないDAC出力を取り出すこともできそうです。
------
実験のやり方は上にリンクした記事とだいたい同じなので回路図は省略してさっそく結果を示します。
前回の出力波形はこうでした。
(上が出力波形、下がLPFを通したもの)
何せ5bitなのでギザギザが目立ちます。
これが8bitの16F1705ではこうなります。
もちろんギザギザはあるのですがほとんど目立ちません。
スペクトラムを比較してみます。まず前回の結果。
これが16F1705だとこうなります。
せっかくですのでLPFを通したあとのも。まず5bit
LPFを通せば5bitでもまあなんてことはないのですが8bitだとこうなりました。
なんというかもうウィーンブリッジ発振回路の代わりに使えるんじゃないでしょうか。
(50Hzのところは例によって電源ノイズです)
大満足の結果です。
--------
何度も書きますからこういうきれいな波形がほしかったらDACの出力を高い入力抵抗で受ける必要があります。低い入力抵抗(例えば10kΩ)で受けてしまうとこんなことになってしまいます。
--------
ソースです。
16F1705は初めてなので動かすのには最低何が必要なのかと考えながらコーディングしてみました。こう書いたら動いた、というだけでこれが正しいとか適切であるとかいう意味じゃありませんので念のため。
クロックの記述がありませんが、この場合500kHzになります。
回路的には/MCLRを10kでプルアップしてあるだけです。DAC出力は11ピン(RA2/DAC1OUT2)から取り出しています。DAC出力は(波形が歪まないように)MΩオーダーの入力抵抗で受けています。
------
#include <pic.h> #include <math.h> #define _XTAL_FREQ 500000 // delay用クロック設定 // DAC1CON0 #define DAC1EN 0x80 #define DAC1OE2 0x10 #define DAC1PSS_VDD 0x00 #define DAC1NSS_VSS 0x00 #pragma config WDTE = OFF void main() { static short lvl[64]; float PIx2=6.2832; unsigned short i; for( i=0; i<64; i++) lvl[i]=(int)(100.0*sin(PIx2*(float)i/64.0)+128.0); DAC1CON0 = DAC1EN | DAC1OE2 | DAC1PSS_VDD | DAC1NSS_VSS; while(1) { DAC1CON1 = lvl[i & 0x3F]; i++; __delay_us(50); } } // 16F1075 // 01 VDD....(2) // 02 RA5/T1CKI/SOSCI/CLCIN3/OSC1/CLKIN // 03 RA4/AN3/T1G/SOSCO/OSC2/CLKOUT // 04 RA3/MCLR/VPP....(1) // 05 RC5/OPA2IN+/CCP1/RX // 06 RC4/OPA2IN-/CK/CLCIN1 // 07 RC3/AN7/C1IN3-/C2IN3-/OPA2OUT/CCP2/SS/CLCIN0 // 08 RC2/AN6/C1IN2-/C2IN2-/OPA1OUT // 09 RC1/AN5/C1IN1-/C2IN1-/OPA1IN-/SDI/SDA/CLCIN2 // 10 RC0/AN4/C2IN+/OPA1IN+/SCK/SCL // 11 RA2/AN2/DAC1OUT2/ZCD/T0CKI/COGIN/INT // 12 RA1/AN1/VREF+/C1IN0-/C2IN0-/ICSPCLK....(5) // 13 RA0/AN0/VREF-/C1IN+/DAC1OUT/ICSPDAT....(4) // 14 VSS....(3) // #define DAC1EN 0x80 // #define DAC1OE1 0x20 // #define DAC1OE2 0x10 // #define DAC1PSS_FVR 0x08 // #define DAC1PSS_VREF 0x04 // #define DAC1PSS_VDD 0x00 // #define DAC1NSS_VREF 0x01 // #define DAC1NSS_VSS 0x00
関連
「記事目次・趣味の電子工作」
「I2Cデバイス・アドレス一覧」
「同じアドレスのI2Cデバイスを使う」
「PICで平方根 - 白金薄膜抵抗で温度を測る」
「PICでI2C - ADコンバーター・MCP3425の使い方」
「PICでI2C - MPL115A2の大気圧計算法」
「I2C大気圧センサーLPS331の驚くべき分解能」
「I2C大気圧温度センサーLPS331 - 海面更生気圧を気象庁とくらべてみた」
「I2C大気圧センサーLPS331の分解能はほんとうに高いのか?(温度編)」
「PICでI2C - 1 (温度計を作る)」
「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」
「PICでI2C - LCD(液晶)ディスプレイによる違い」
「サーミスタによる温度測定の精度」
「サーミスタ温度計の精度を調べる - 1」
「PICで作るお手軽サーミスタ温度計」
「炭素皮膜抵抗の温度係数を測定する話」
「ミニ恒温槽の作成に向けて - 1」
「ミニ恒温槽の作成に向けて - 魔法瓶の活用」
« GPS受信モジュールGE-612Tのバックアップ | トップページ | PIC/16F1705のオペアンプをDACのバッファとして使ってみた »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
この記事へのコメントは終了しました。
« GPS受信モジュールGE-612Tのバックアップ | トップページ | PIC/16F1705のオペアンプをDACのバッファとして使ってみた »
コメント