« “水”温度計 (2) | トップページ | 本日9月28日土星食予想図(札幌/仙台/東京/名古屋) »

2014年9月27日 (土)

PICのDAC(DAコンバータ)を使ってみた

8bitDAC版も作ってみました。
  「PIC/16F1705のDAC(DAコンバータ)を使ってみた(ソース付き)

実用するにはバッファを入れます。
  「PIC/16F1705のオペアンプをDACのバッファとして使ってみた

(2014.11.22)

実際に実験に使えるようなものも作りました。

  「PIC16F1705の8ビットDACを使って(実用的)正弦波発振器を作る - 1

(2015.01.30)
------

風速計・風向計を作る - 1」で超音波風向風速計を作るんだと書いてもう一ヶ月経ちましたが手付かずです(超音波の送受信ユニットはひとまず一組入手しました)

こういうのをやろうとするとスピーカとかマイク(に相当するもの)を使うわけで最初から最後までデジタルで済むわけでもないので波形を調べたり、調べるためにいろんな周波数や波形の信号を作ったりしなければならなくなります。

以前は地道にコルピッツとかウィーンブリッジ発振器とか作ってましたが年とともに短気になりもうやっていられません。そこでなんとかPICですまそうと考えました。

ちょっと話がそれますがウィーンブリッジだとこんな記事を書かれている方がいらっしゃいます。

  「電子回路実験教材の部屋 - ウィーンブリッジ正弦波発振回路

何事にしてもやるならこのくらいとことんやりたいものです。他の記事も含めていろいろと参考にさせていただきました。

----

PICにはADコンバーター(ADC)とともにDAコンバータ(DAC)があるのでこれを使えないかというわけです。以下読んでいただくとわかるようにこれがいい方法とはいえないような気もするのですが、最低限のものはできそうです。

DACについても書いてる方はたくさんいらっしゃるのでソースは重要なところだけにします。

まず正弦波モドキを作ってGoldWaveで観察してみることにしました(オシロスコープは持ってません)

※ 回路的なことは
  「PICのDAコンバータ(DAC)を使ってみた - 補足
  に書きました。
  またこれを“実用”に使った例が
  「インダクタンスの測り方
  にあります。
  PIC自体の使い方やソースについてはまだです。
  じっさいに作ろうという方は次のページが参考になると思います。
  「きむ茶工房ガレージハウス  - PICの内蔵DAC機能を動作させて見る

-----

要するにこんなのが作りたいわけですね。
Sine_idl

ただPICからこんな波形が出力されるなんて思ってはダメです。PICのADCって10bitあるのでDACも10bitくらいあるだろうと思っていたらなんと5bitしかありませんでした。

まず波形データを計算して配列に格納しておきあとはタイマー割り込みでそれを順番にDACに出力していく方法を採ります。
以下Cで書いてありますが、もしアセンブラで書かれるのでしたら波形データの計算はExcelで済ましておいて波形データの計算結果を初期値として与えるという方法がいいでしょう。

波形データを作るところ

     for( i=0; i<32; i++) {

        //  正弦波
         if( PORTBbits.RB0 == 0 ) {
             level[i]=(unsigned char)(15-round(sin(6.2832*i/32.0)*15.0));

        //  鋸歯状波
         } else if( PORTBbits.RB1 == 0 ) {
             level[i]=i;

        //  三角波
         } else if( PORTBbits.RB2 == 0 ) {
             if( i < 16 ) {
                 level[i]=i*2+1;
             } else {
                 level[i]=(31-i)*2;
             }

        //  方形波
        } else {
             if( i < 16 ) {
                 level[i]= 0;
             } else {
                 level[i]=31;
             }
         }
     }

まあ雑といえば雑なんですが、5bitと聞くとあんまり真剣に作ろうという気になりません。

割り込みがかかったらこんな風に出力します。

void interrupt itr( void )
{
    static unsigned char i=0;
     if (T0IF == 1) {

        i &=0x1F;
        VREFCON2=level[i];
        i++;

        TMR0 = 0;
        T0IF = 0 ;
     }
}

まず正弦波を作って波形を見てみたらギザギザどころかとんでもないことになってました。
これじゃ三角波です。というか三角波よりとんがってます。
Sine_rl_0_2

例えばDAC出力の出力(能力)不足とすると波形の上部がつぶれたりクリップされたりするのですが、これはそれとは逆の不思議な現象です。電圧の低い部分は電圧の高い部分以上に伸びているようです。

これはデータシートにあるDACの内部構成を示す図を見たら理由がわかりました。
DAC出力は出力電圧によって出力抵抗が変化してしまうようです。出力抵抗が一番高くなるのは中くらいの電圧が出力されたときで(おそらく)40kΩくらいです。一方出力抵抗が一番低くなるのは出力電圧が最低のときでほぼ0kΩ、次が出力電圧が最高のときで(おそらく)5kΩのようです。これらの間を出力抵抗は出力電圧に応じて連続的に変化していきます。

確かにこれなら上のような波形になるはずです。要するに負荷抵抗が低すぎました。このとき10kΩにしていたのです。どんなに低くても100kΩとか200kΩが必要でしょう。
実際に使うのであればボルテッジフォロワーをかましたほうが話がはやそうです。

PICと言うと内部プルアップとかいたれりつくせりな印象があるんですが、ぜったいバッファが必要になりそうなDAC出力にバッファがついてないのはなぜなんでしょう。不思議です。

以下負荷100kΩでやっています。

-----

正弦波

雰囲気的には正弦波になりました。5bitだとこんなものだと思います。
波形データの作成方法にもう一工夫必要だとは思いますが....
Sine_rl_1_2


上のような波形なのでとうぜん高調波もあればサンプリング周波数の影響もあります。
ただスペクトラムを見ると基本は以外はそんなにレベルが高いわけでもありません。ローパスフィルターを通せば(目的にもよりますが)なんとか使えそうなものにはなりそうです。
Sine_rl_1s_2




矩形波

さすがにこれは問題なさそうです。よく見るとリンギングがありますが、これは波形を記録したPC側の問題ではないかと思います。
Square_1_2


奇数次の高調波が高い周波数まで存在するというのが矩形波の特徴です。
Square_1s_2




三角波

これは明らかに波形データの作り方がいい加減なんですが、まあまあ三角波らしくはなっています。
Triangle_1_2


これも矩形波と同じく奇数次の成分だけですが、高い周波数の成分はどんどん減衰していくので、2kHzあたりのサンプリング周波数の影響が目立っています。
Triangle_1s_2




鋸歯状波

のこぎりの刃の部分が直線になっていないのがDACの出力抵抗が一定していないことの影響です。つまり負荷は100kΩでもまだ小さすぎたということになります。何せ出力電圧が中くらいのときの出力抵抗は40kΩもありますから。
Saw_1_2

スペクトラムは矩形波や三角波とは異なり偶奇関係なくかなり高い周波数まで高調波が存在します。
Saw_1s_2


------

関連
  「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
  「ミニ恒温槽の作成に向けて - 魔法瓶の活用

参考

きむ茶工房ガレージハウス - PICの動かせ方入門はこちら - 16F1938覚書
きむ茶工房ガレージハウス - I2C通信の実験
きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」

以上は予習として拝見していたのですが、とても参考になります。他にも勉強になる記事が多いです。
私の記事を読んでI2Cのセンサーを使って温度計とか気圧計とかそういうものを作りたくなった方も実際に作られるときはこちらを読まれた方がいいと思います。

« “水”温度計 (2) | トップページ | 本日9月28日土星食予想図(札幌/仙台/東京/名古屋) »

趣味の電子工作」カテゴリの記事

コメント

これはステレオミニプラグで取り込んだ波形です?
どんな回路なのか気になります(≧∇≦)

ところで、リンク先のページを見たのですがオペアンプで発振回路が作れるのですね

じゃあ、次の記事としてもう少し具体的なことを書きますね (^^)
Cがイヤなら波形データを計算しておいて初期値として与えれば済むのでアセンブラでも作成可能です。環境はお持ちだったと思うのでぜひ挑戦してみてください。

低周波でできるだけきれいな波形の正弦波がほしかったらオペアンプでやることになると思います。
トランジスタやFETでも同じことですが設計がよくないとなかなか思うように発振してくれないこともあります。オペアンプが確実でしょう。
リンク先をご覧になったそうですが、きれいな波形が必要であれば振幅制限が必須です。
あのなかだとFETを使う方法をお勧めします。電球、サーミスタでもいいのですが適当なものを入手するのが手間だと思います。他の方法はやめたほうがいいかもしれません。

ウィーンブリッジ発振回路に挑戦しているのですが、発振せずに苦戦しています(ノ_-。)

リンク先のブレッドボードの絵と回路図で少し違うところがあって、
ブレッドボードの両端の±のところに、それぞれコンデンサが入っているようですが、
このコンデンサはノイズ除去の役割として入れている物なのでしょうか?

GNDと+電源、GNDと-電源の間に入っているコンデンサーだと思いますが、デバイスに供給される電圧を一定にするためのもので目的が何かと聞かれると“(電源を含めて回路同士が干渉しないようにして動作を安定させるためのもの”ということになるでしょうか。
ノイズ除去と言えばそうなんですが、ふつうバイパス・コンデンサーとかデカップリングコンデンサーと言います。いつも“パスコン”と書いているものです。
こういう発振回路の場合、まず波形はどうでもいいので増幅度が大きい状態にして(つまり振幅制限されない状態にして)発振させることを優先させます。発振したらそこから徐々に波形がきれいになるように調整して行きます。
波形がきれいになるのは発振するかしないかくらいの微妙なところなんですが、最初からそこを狙わないようにした方がいいです。

ありがとうございます。
ちなみに+電源とー電源は同じ電圧でないとまずいでしょうか?

例えば片方が9Vで片方が6Vでは上手く発振しないものなのでしょうか、、、

±の電源電圧が違うから動作しないということはないのですが、こういうのに慣れないうちからそういのはあんまりやらない方がいいと思います (^^;;
なんといいますか“基本に忠実”がいちばん安全です (^^)

同じ電圧源が用意出来なくて、9V電池と単3電池4本でやっていました^^;
なんとなく発振しているようにも見えるようになってきたのですが、出力レベルがすごく小さいです。

波形をPCオーディオで(設計どおりの周波数の)きれいな正弦波になっているか純音に聞こえるのであれば振幅制限がきつすぎるのでしょう。
さっき惑さんの記事にコメントしてきたのですが、最初から“最終形”を目指さず、何でもいいからとにかく発振させるというほ方が“急がば回れ”です (^^)
今、振幅制限してちゃんと発振する状態にあるのでしたら焦らず少しずつ調整していけばいいと思います。

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: PICのDAC(DAコンバータ)を使ってみた:

« “水”温度計 (2) | トップページ | 本日9月28日土星食予想図(札幌/仙台/東京/名古屋) »

フォト

サイト内検索

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

新着記事

リンク元別アクセス数

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

人気記事ランキング

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