« 秋月電子通商の金属皮膜抵抗器の話 - KOA MF1/4CC2002F 20kΩ | トップページ | PICのオーバクロック - 87MHzで動いた(?)PIC16F1705 »

2015年3月16日 (月)

PIC16F1705のDAコンバータを使った正弦波発振器(発生器) - 改良版

以前PIC16F1705の12ビットDACを使って正弦波を作る記事を書きましたがその後画期的な進展がありました。この回路は問題点として最高出力周波数が数kHzまでに限られると言う点と出力周波数が離散的であるということがあります。
この二点が解決しました。と言っても私が何かやったわけではないくほよほよさんがやられたわけですがその成果を利用させていただいたので新たに記事を書きます。
ほよほよさんの記事は最後に一覧にしてあります。

===

ほよほよさんの方法ではまず出力周波数の上限はアセンブラでコーディングすることによって一桁以上高くなっています。また周波数が離散的になる点についてはPICのクロックを変化させるというコロンブスの卵的方法で完全に連続的に出力できるようになっています。

ほよほよさんが作成されたものそのままだったら私が記事を書く必要はないわけで、少しだけ手直ししてあります。

1. 以前と同様二つのPIC16F1705を使って90度位相が異なる正弦波(正弦波と余弦波?)を作れるようにしてあります。

2. 基本64*4=256命令サイクルで正弦波の一周期を作成、多少波形が乱れてもかまわないなら64*2=128命令サイクルでも可、となっていましたがデータを見直し64*2での作成だけにしました。

ちゃんと正弦波になっていたかという点も見ておきます。
Vf_sinephase

1/4周期ずれた正弦波ができています。ほんとに1/4周期ずれているかはリサジューで確かめます。
Vf_sineres

円になっており1/4周期ずれているのは間違いなさそうです(縦横比が違ってますので楕円になるのはOKです。もし縦横比が同じで楕円になったら位相より振幅に問題があります)

スペクトラムは
Vf_sinespec

基本波の64倍のところに高調波が出るはずですが、これはPCオーディオなので表示はされません。それからレベルが高かすぎたせいか電源周波数と混変調を起こしてしまったようで±50Hzのところに側波帯みたいなのでできてしまっています。

-------

それから本題とは直接関係ないのですが周波数特性を調べるようなことを自動化するためのスイープ(掃引)もできるようにしました。
これについては先日「インダクタンス測定法 - LC並列共振周波数測定装置」で記事にしました。
Vfsin_sweep

今回はLMC555を使っているところを(これもほよほよさんと同じですが)LT1799を使うようにしました。LT1799は(電圧、電流でも制御できるのですが)基本は外部抵抗による制御なので上の回路(つまりCdSフォトカプラ)がそのまま使えます。

交流電圧計は「一歩進んだ交流電圧計(ミリバル)の製作 - 1」で作ったものです。測定対象回路のところには今は何も入っておらず二つのボルテージフォロアをそのまま接続しています。

実際にLT1799のディバイダを10分周にしてやったらこういう結果が得られました。
Vfsin64k400fv

制御電圧というのはCdSフォトカプラの入力電圧になります。“交流電圧計の読み“というのは上の図の最後にある交流電圧計の読みのことです。途中にいろいろ入っていますがこれがフラットであれば実験に使えるだろうと考えてもいいと思います。

周波数の対数と電圧の関係がほぼ線形になっています。
高い周波数でカーブが寝てくるのはLT1799は秋月のDIP化したものを使っており、保護のために3.3kΩの抵抗が内蔵されているのが主因です。低い周波数の方はCdSと並列に2MΩの抵抗を入れている影響ですが、もともとこんな低い周波数まで使うべきでない(注)とデータシートにありましたので特に問題はないでしょう。

注 正確に書くと(周波数を低くするため)抵抗値をむやみに大きくしてはいけない、ということです。使っているCdSフォトカプラの特性については「VFコンバータ(VCO)の製作(1) - 自動周波数特性測定器に向けて」に書きましたが、印加する電圧が低くなるとCdSの抵抗値は簡単に数MΩに達します(確か数十MΩまで行ったような....)

周波数と交流電圧計の読みの関係です。
Vfsin64k400fv2

高い方でわずかに電圧が落ち始めています。PIC16F1705から交流電圧計までいろいろはいっており、どれがボトルネックになっているかは現時点ではわかりません。
低い方でばらけていますがこれはリップルを完全に除去しきれていないためだと思います(あるいはLT1799の外部抵抗を大きくしたため発振が不安定になりジッタが発生したから、とかそういうのかもしれません)


ここで回路図やその詳細を書かなければいけないのですが、LT1799の使い方などを含めてほよほよさんの記事にあるので省略します。

ただソースは上に書いたようにカスタマイズ(?)してあるので記事の最後に追加しておきます。

------

関連
  「記事一覧(天文、電子工作、測定)
  「PIC16F1705の8ビットDACを使って(実用的)正弦波発振器を作る

参考
ほよほよのブログ - 周波数可変な正弦波発生回路」 (原理、回路図)
ほよほよのブログ - 周波数可変な正弦波発生回路 プログラムソース」 (プログラム)
ほよほよのブログ - 正弦波発生回路(67Hz~67kHz)のモジュール化」 (実装)
ほよほよのブログ - LTC1799オシレータを購入
ほよほよのブログ - ファンクションジェネレータ」 (応用)
ほよほよのブログ - LC直列共振回路でインダクタンス測定」(応用)
ほよほよのブログ - ミリバルアダプタの周波数特性」 (評価)
ほよほよのブログ - 正弦波発生器の周波数帯域を広げてみる
ほよほよのブログ - 続 - 正弦波発生器の周波数帯域を広げてみる

-------------

// 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)
#include <pic.h>
// DAC1CON0
#define DAC1EN  0x80
#define DAC1OE2 0x10
#define DAC1PSS_VDD     0x00
#define DAC1NSS_VSS     0x00
// OPAxCON
#define OPAxEN  0x80
#define OPAxSP_High 0x40  // 扱う周波数が高いときはこちらの方が安全でしょう。
#define OPAxSP_Low  0x00
#define OPAxUG_ON   0x10
#define OPAxCH_DAC  0x02
#pragma config WDTE=OFF,FOSC=ECH,PLLEN=ON
// 2台のPICの波形生成を同時にスタートさせるために割込みを使います。
short Interrupt=1;
void interrupt InterFunction( void )
{
    // INT割込み
    if( INTF == 1 ) {
        Interrupt = 0;
        INTF = 0;
    }
}
#define VOUT(x) asm("MOVLW "#x); asm("MOVWF DAC1CON1")
void main()
{
    OSCCON = 0b11110000;
    ANSELAbits.ANSA2 = 0;
    //    DAC1CON0 = DAC1EN | DAC1OE2 | DAC1PSS_VDD | DAC1NSS_VSS;
    DAC1CON0 = DAC1EN | DAC1PSS_VDD | DAC1NSS_VSS;
    OPA2CON = OPAxEN | OPAxSP_High | OPAxUG_ON | OPAxCH_DAC;
    // マスターとスレーブが同時にスタートできるように割込みを待ちます。
    INTE = 1;
    GIE=1;
    while( Interrupt );
    asm("MOVLB 0x02");  // バンクセレクトレジスタでDAC1CON1のバンクを指定
// 1台は1/4周期遅れてスタートさせます。
// これによって90度位相がずれた波形が得られます。
#define MASTER
#ifdef MASTER
        VOUT(0x8A); VOUT(0x94); VOUT(0x9E); VOUT(0xA7);
        VOUT(0xB1); VOUT(0xB9); VOUT(0xC1); VOUT(0xC9);
        VOUT(0xD0); VOUT(0xD6); VOUT(0xDB); VOUT(0xDF);
        VOUT(0xE3); VOUT(0xE5); VOUT(0xE7); VOUT(0xE7);
#endif
    loop:
        VOUT(0xE7); VOUT(0xE5); VOUT(0xE3); VOUT(0xDF);
        VOUT(0xDB); VOUT(0xD6); VOUT(0xD0); VOUT(0xC9);
        VOUT(0xC1); VOUT(0xB9); VOUT(0xB1); VOUT(0xA7);
        VOUT(0x9E); VOUT(0x94); VOUT(0x8A); VOUT(0x80);
        VOUT(0x76); VOUT(0x6C); VOUT(0x62); VOUT(0x59);
        VOUT(0x4F); VOUT(0x47); VOUT(0x3F); VOUT(0x37);
        VOUT(0x30); VOUT(0x2A); VOUT(0x25); VOUT(0x21);
        VOUT(0x1D); VOUT(0x1B); VOUT(0x19); VOUT(0x19);
        VOUT(0x19); VOUT(0x1B); VOUT(0x1D); VOUT(0x21);
        VOUT(0x25); VOUT(0x2A); VOUT(0x30); VOUT(0x37);
        VOUT(0x3F); VOUT(0x47); VOUT(0x4F); VOUT(0x59);
        VOUT(0x62); VOUT(0x6C); VOUT(0x76); VOUT(0x80);
        VOUT(0x8A); VOUT(0x94); VOUT(0x9E); VOUT(0xA7);
        VOUT(0xB1); VOUT(0xB9); VOUT(0xC1); VOUT(0xC9);
        VOUT(0xD0); VOUT(0xD6); VOUT(0xDB); VOUT(0xDF);
        VOUT(0xE3); VOUT(0xE5); VOUT(0xE7);
    goto loop;
}

« 秋月電子通商の金属皮膜抵抗器の話 - KOA MF1/4CC2002F 20kΩ | トップページ | PICのオーバクロック - 87MHzで動いた(?)PIC16F1705 »

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

コメント

おお!LTC1799購入されたんですね(o^-^o)
しかし高周波あたりまで性能のよいミリバルがあるようでうらやましいです。
自動でスイープ測定ができるところはいいですね。

そしていつもながら私の記事をまとめてくださって感謝です。
ちなみにアクセス解析するとセッピーナさんのところからジャンプしてくる人が毎日コンスタントにいらっしゃいます^^。

はい、物欲に負けました (^^;;
使い勝手がいいですね。
じつはこれを使い始めてとんでもないことに気が付きましたよ (^^)
ミリバルは例のオペアンプを二つ使うシングルエンド出力のやつです。
抵抗は秋月の20kΩに変えてしまいましたが (^^;;

こんにちは。初めまして。
3年以上前の記事へのコメントご容赦ください。
貴殿とほよほよさんの記事を参考にさせていただいてファンクションジェネレータを製作しました。
私なりに色々とこねくり回しております。
取り敢えずお知らせということなんですが、ご意見、ご感想などいただけたら有難いです。

コメントありがとうございました。
同じ趣味・嗜好の方に少しでも役にたてばという気持ちで記事を書いていますので、過去記事にコメントいただけるのはうれしいです。
「PICファンクションジェネレータ」(http://vabenecosi.blog.fc2.com/?no=53
にもコメントさせていただきましたが、波形を作っている途中でリセットして波形・分周比の更新をしているところなど興味深かったです。
これからもよろしくお願いいたします。

当方のブログ記事を見ていただいて有難うございます。
うっかりして図を一つアップロードし忘れていましたので、更新しました。

こちらこそよろしくお願いいたします。

追加された図というのは「波形の更新がスキップされて...」のところでしょうか。
わざわざお知らせいただきありがとうございます。
なお、マニアック(?)な興味としてはどこまでクロックをあげられるか(正常に機能するのか)だったりします (^^;;

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

トラックバック


この記事へのトラックバック一覧です: PIC16F1705のDAコンバータを使った正弦波発振器(発生器) - 改良版:

« 秋月電子通商の金属皮膜抵抗器の話 - KOA MF1/4CC2002F 20kΩ | トップページ | PICのオーバクロック - 87MHzで動いた(?)PIC16F1705 »

フォト

サイト内検索

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

新着記事

リンク元別アクセス数

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

人気記事ランキング

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