« GPS受信モジュールGE-612Tのバックアップ | トップページ | PIC/16F1705のオペアンプをDACのバッファとして使ってみた »

2014年11月22日 (土)

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を通したもの)
Sine_2_2

何せ5bitなのでギザギザが目立ちます。

これが8bitの16F1705ではこうなります。

L100s64

もちろんギザギザはあるのですがほとんど目立ちません。

スペクトラムを比較してみます。まず前回の結果。
Sine_2in_s

これが16F1705だとこうなります。
L100s64spc

せっかくですのでLPFを通したあとのも。まず5bit
Sine_2_lpf_s

LPFを通せば5bitでもまあなんてことはないのですが8bitだとこうなりました。
L100s64lpfspc

なんというかもうウィーンブリッジ発振回路の代わりに使えるんじゃないでしょうか。
(50Hzのところは例によって電源ノイズです)

大満足の結果です。

--------

何度も書きますからこういうきれいな波形がほしかったらDACの出力を高い入力抵抗で受ける必要があります。低い入力抵抗(例えば10kΩ)で受けてしまうとこんなことになってしまいます。
L100s6410kspc_2

--------

ソースです。

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/16F1705のDAC(DAコンバータ)を使ってみた(ソース付き):

« GPS受信モジュールGE-612Tのバックアップ | トップページ | PIC/16F1705のオペアンプをDACのバッファとして使ってみた »

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ