2015年4月29日水曜日

ぴゅんぴゅん3号 3次VCVS LPF版シールドでけた

はんだ付けは疲れるので、ちょっとずつやって完成(^q^/


いつものようにテスト表を作ってチェックした


テスト表は回路図の配線をもとに作っている

これぐらいの規模の回路でも毎回何かしらミスが見つかる(^q^;

めんどくさいがあんまり神経を使わずに機械的にできる作業なのでやることにしている

いきなり動かして部品を破壊するはめになるのはつらいですし


LPFの特性を決めるCR類は差し替えできるようにピンソケットを使った

あと、I2CのLCDに入れるRST信号をPSoCを5V駆動した時にRの分圧で3.3Vに降圧、
3.3V駆動した時は0Ω抵抗でショートして直接入力できるようにここもピンソケットにしていおいた


はんだ面のジャンパー線はエレキジャックのはんだ付けの記事「ユニバーサル基板のプロになる!」
http://www.eleki-jack.com/KitsandKids2/2009/06/br_1.html)を参考にしてジュンフロン線を使っているが、ELMさんの「プロト基板の配線テクニック」(http://elm-chan.org/docs/wire/wiring.html)などポリウレタン線を使っている方も多いようだ

ポリウレタン線は使ったことがないので今度使ってみたいと思います

ある程度納得できる回路ができたら、近いうちにプリント基板も作ってみたいです

回路図

基板配線図

PSoC Pioneer Kitのソース等はGitHubで公開しています
https://github.com/ryood/PSoC-PyunPyun-3rdLPF

出力波形

LFOをかけない状態で周波数をだいたい1kHzに設定して出力波形を見てみた

Sine

Triangle

Saw1

Saw2

Squre

クソ波形を目指してたわりには綺麗すぎな気もしないではないが(^q^;

PSoCについて

今回はPSoC 4 Pioneer Kit専用のシールドにしたが、PSoCらしい使い方をしたのはIDACぐらいだ

内蔵のOPAMPも使いたかったがPioneer KitとAruduino互換のシールドの仕様上あきらめた
「ぴゅんぴゅん3号 設計の下準備」(http://dad8893.blogspot.jp/2015/02/blog-post_24.html

Pioneer Kitの基板上で物理的にルーティングしたりとかすれば使えるかなぁ・・・?

PSoCのデジタルブロックも全然いじってないし、このシールドを使ってもう少し遊べそうな気がします

今後の予定(メモ)

  • Nucleo版のぴゅんぴゅん4号
  • ぴゅんぴゅん3号を使ってドラムマシン
  • エフェクタ DSP(Blackfin)
  • Resonant LPF
  • Envelope Generator(プログラムで?)→フィルターにかけられるようにできるかな?

夏コミに受かればぴゅんぴゅん3号について、もう少し詳しく製作記をまとめたいと思います

2015年4月27日月曜日

バンドリジェクト・フィルターとLPFをLTSpiceでシミュレーションしてみた

矩形波から30MHzのノイズを選択的に取ることを想定してLTSpiceでシミュレーションしてみた

バンドリジェクト


100kHzの矩形波に30MHzのSine波を重畳させるために、LTSpiceでBVというコンポーネントを使ってみた

参考:エレキジャック(http://www.eleki-jack.com/KitsandKids2/2008/04/ltspice10bi.html

過渡解析


緑色が元波形、青色がバンドリジェクト・フィルターを通したあと

ノイズはかなり軽減できたみたいだが(ほぼ完ぺき?)

拡大すると


見にくいのでフィルターを通した後は赤色にした

矩形波としてはまだノイズが重畳している方がましなレベルだ(@@;

2次VCVS LPF


OKAWA Electric Designさんのツールで(http://sim.okawa-denshi.jp/OPseikiLowkeisan.htm
カットオフ周波数 fc=16MHz 手持ちにある22pFのCで計算した

過渡解析

バンドリジェクトと同じく100kHzの矩形波に30MHzのSine波を重畳


拡大


大して減衰してないのに波形はかなりなまる(@@;

フィルターは入れないで、まずはなりゆきで実験した方がいいかな

2015年4月26日日曜日

矩形波だけのファンクションジェネレータ 回路の検討

いったん全体の回路図を書いてみた


左半分は単体では実験済み

電源部は省略しているが、9V電池からリニアレギュレーターで+5Vと+3.3Vを作るつもりだ

30MHz付近のノイズ対策

「ATMega328PのTimer1でPWMを使ってみる」(http://dad8893.blogspot.jp/2015/04/atmega328ptimer1pwm.html)で
オシロで波形を見たとき30MHz近辺のノイズが乗るようなのでこれをフィルターで除去できないかと考えてバンドリジェクト・フィルターを入れてみた(回路図の破線で囲ったFilterの部分)

この後段のR10のPOTで出力レベルを可変しようと思ったが、これは前段のFilterのR4と干渉しそうだ。なのでこの回路はたぶんNG(^q^;

出力部に入れているOPAMPをスルーレートはそれなりに高くて(矩形波をなまらせないため)
GB積の小さいタイプにすればOPAMPで減衰されてこのフィルターはいらなくなるかな・・・う~ん

それか単体のPOTではなくてIC2AのOPAMPを反転増幅回路にするか(反転増幅ならPOTで1倍以下に減衰できると思う)OPAMPをLPFの構成にするか

OPAMPを使ったバンドリジェクト・フィルター回路はあるのかどうかわからないが・・・

OPAMPの使い方

考えがまとまらないのでメモ的に箇条書きです

  • 単電源タイプかGNDまで出るフルスイングのOPAMPでないと矩形波のGNDレベルまで出力できないと思う
  • LM358は特性が心配、CMOSタイプはスルーレートが心配
  • 矩形波なので増幅回路ではなくてコンパレーターとして使えばいいのかな?
    →その場合出力レベル調整は?(OPAMPの後段にPOTを入れただけだと出力インピーダンスが上がりすぎる?)
    OPAMPの正電源で出力レベルを調節するとか(^q^;
    →OPAMPの電源電圧の下限より下は出力できなくなるか(^q^;;;;
  • OPAMPの正電源を+5Vではなくて9V電池からそのまま持ってくれば出力レベルの上限は上げられるかな?

仮想GNDの出力

IC2BでVCC/2の電位を作り出している

IC2Aをボルテージフォロワーとして使うならVGNDは関係ないのでLM358のゼロクロス歪は出ないと思う(たぶん)

IC2Aを増幅回路やフィルターとして使うならゼロクロス歪の出ない単電源オペアンプもあるみたいなので仕入れて実験する価値はあるかな?

ぴゅんぴゅん3号のはんだ付けをしながらもう少し考えてみたいと思います



2015年4月24日金曜日

OPAMPの周波数特性の比較 LCR2次LPF編

タブレットのファンクションジェネレータ出力用のLPF(http://dad8893.blogspot.jp/2015/04/lpf_4.html)をかましつつ
OPAMPを差し替えてWaveSpectra & WaveGeneで比較してみた

信号源はタブレットではなくオーディオインターフェイスのTASCAM US-144MKIIで1kHzのノコギリ波を生成した

PCとの相性が悪いのかもしれないがこのオーディオインターフェイス、Windows 8にしてから(前からかも?)USBにつないでしばらくするとノイズが乗りまくる

ので、結果は多少その辺もさっぴいて考えたいと思う

倍音が全部入っているノコギリ波で見てみた

LoopBack

NJM4558

NJM4556

NJM4580

NJM2114

NE5532

u4570

MUSE8820

LM358

TL072

OPA2134

MUSE8920

NJM7032

LoopBackがオーディオインターフェイスのもともとの特性だ

通した回路がカットオフ周波数が50kHzのLPFなのでどのOPAMPでも高域は減衰するはずだ

FFTしたグラフを見ると

NJM4558、LM358、TL072、NJM7032

があまり芳しくない(^q^;

古くからあるOPAMPとCMOSのオペアンプ、これは納得できる

と意外なのはTL072の30kHzあたりにある謎の減衰

オーディオインターフェイスのADCの折り返し的な何かが影響してこういう見え方になってるんだろうか?

わざわざLPFを入れなくてもOPAMPがLPF的な働きをしてくれれば音作り的には楽かもしれないが

測定ミスかもしれないがTL072は音作り以外では使わない方向でいくことにします

矩形波

とりあえずOPAMPをOPA2134にしてタブレットのファンクションジェネレーターとオーディオインターフェイス+WaveGeneの出力で比較

WaveGeneからのLoopBack

WaveGeneの出力にLPFを通した


AndoroidのFunGenから出力+LPF


やはり矩形波だけのファンクションジェネレーターはちゃんと作ったほうがよさそうな気がする

ついでに周波数固定でも波形の正確なノコギリ波とか

いけるかな?

<追記:2015.04.26>

やっぱきっちりしたノコギリ波は分解能のすばらしいDACを使わないとだめか(^q^;

矩形波だけのファンクションジェネレータ 機能仕様

あらかた実験してみたので「矩形波だけのファンクションジェネレータ」の機能仕様をまとめた

「機能仕様」という言葉をなんとなく思いついたが、調べたら普通にある言葉のようです

書いたことないので適当です

機能仕様


1.ロータリーエンコーダー

プッシュで波形を切り替える。波形は「矩形波」「インパルス関数」「ステップ関数」

1.1. 「矩形波」の場合、回して周波数を切り替える。周波数は1、2、5ステップで20Hz~1MHz
「2.可変抵抗」でデューティー比を可変する。デューティー比は0~100%

1.2. 「インパルス関数」の場合、回すとクリックごとに波形を生成する。

1.3. 「ステップ関数」の場合、回すとH/Lを切り替える

2. 可変抵抗

「矩形波」の時だけデューティー比設定用に使用

3. 電源SW

電源のON/OFFを切り替える

4. 出力ジャック

ステレオミニジャックとし、Lは出力波形、Rは仮想GND(VCC/2)、GNDはGND(0V)を出力する

5. 出力VOL

出力波形のレベルを調整する

6. LCD

出力波形、周波数、デューティー比を表示する


入出力デバイス

ケース内のスペースを空けるために最初考えてたよりPOTの数を1個減らした

うまくやれば「2.可変抵抗」も削れそうだが、使いやすさとかLCDの画面遷移の設計のめんどくささを考えて1個は残した

出力レベルはデジタル制御ではなくてアナログ的に減衰させるつもりだ

出力の仮想GND(波形の中点)は抵抗分圧で作ってボルテージフォロワーでバッファリングする

GND(0V)と仮想GND(VCC/2)を出しっぱなしにするという作戦だ

ちゃんとできるかもうちょっと実験しないとだめかな?

「2.可変抵抗」が矩形波のデューティー比の設定だけにしか使わなくてもったいないが
何かうまい手を思いついたらファームウェアで対応する予定

LCDがバックライト付なのでパイロットランプはつけなくていいかな

出力周波数

出力周波数はHz刻みではなくて20Hz, 50Hz, 100Hz, 200Hz ... みたいなとびとびの値にすることにした

まだちゃんと確認してないが、PWMのcount/秒を1MHzとすると


出力周波数(kHz) Hz count
1000 1000000 1
500 500000 2
200 200000 5
100 100000 10
50 50000 20
20 20000 50
10 10000 100
5 5000 200
2 2000 500
1 1000 1000
0.5 500 2000
0.2 200 5000
0.1 100 10000
0.05 50 20000
0.02 20 50000

となってちょうどいい

インパルス関数とステップ関数

これも結構悩んだが、ロータリーエンコーダーをカチッと回すと波形が出る、みたいな感じが使いやすいかなと思った

波形は連続出力するには矩形波出力の周波数をプリスケーラーを使って拡張すればできるかな?

この辺はプログラミングの問題なので必要ならあとで考えることにしてもうちょっと実験する予定

2015年4月21日火曜日

ATMega328PのTimer1でPWMを使ってみる

矩形波だけのファンクションジェネレーターの波形生成はTimer/CounterのPWMでやる方向で考えた。

単にTimerで割込みをかけてCPUで処理すると割込みのオーバーヘッドが大きいようだ

レジスタの退避で数十クロック使ってしまうらしいです

参考:「クレア工房」さん(http://www.clarestudio.org/elec/avr/mcu-interrupt.html

PWMなら周辺機能のハードウェアが勝手に仕事をしてくれるので(たぶん)任せることにした

音の生成には、今までのDACしか使ったことがないので多少ハマりつつPWMの実験してみた

Timer1

ATMega328PのTimer/Counterには、8bitのTimer0、Timer2、16bitのTimer1がある

ファンクションジェネレーターで生成する波形の周波数はできるだけ下から上まで取りつつ、分解能も細かくしたいので16bitのTimer1を使ったほうがよさそうだ

Timer1の動作モードは

  1. Normal Mode
  2. Fast PWM Mode
  3. Phase Correct PWM Mode
  4. Phase and Frequency Correct PWM Mode

とあって、どう違うのかもはっきりわからなくていきなりげんなり(^q^;

唯一持ってるAVRの本の「AVRマイコン・リファレンス・ブック」と、DATA SHEET(本家版と翻訳版(www.avr.jp/user/DS/PDF/mega88A.pdf))にランダムアクセスしながらテストプログラムを書いてみた

要件としては

  1. 周波数可変
  2. デューティー比可変



ブレッドボードの配線

<PWM_Test.c>
 #include <avr/io.h>  
 #include <avr/interrupt.h>  
 #include <stdint.h>  
 #define F_CPU     16000000UL  
 #include <util/delay.h>  
 void timer1_init_FastPWM(uint16_t cycle, uint16_t duty)  
 {  
      // Output Compare Register  
      OCR1A = cycle;  
      OCR1B = duty;  
      // Initialize Counter  
      TCNT1 = 0;  
      // Phase and Frequency Correct PWM Mode, TOP = OCR1A  
      TCCR1B |= (1 << WGM13) | (0 << WGM12);  
      TCCR1A |= (0 << WGM11) | (1 << WGM10);  
      // Compare Output OC1A, OC1B  
      TCCR1A |= (0 << COM1A1) | (1 << COM1A0);  
      TCCR1A |= (1 << COM1B1) | (0 << COM1B0);  
      // Timer1 Start, Set Prescaler to 8  
      TCCR1B |= (1 << CS11);  
 }  
 int main(void)  
 {  
      DDRB = 0xFF; // PB1(OC1A) 出力  
      timer1_init_FastPWM(500, 375);  
      sei();  
   while(1)  
   {  
     //PORTB ^= 0x06;  
     //_delay_ms(50);  
   }  
 }  

動作モードを指定するWGMは簡単に変更できるように(冗長ですが)しておいた

Timer1のPWMはOC1A,OC1B(328PだとPin15とPin16)から出力され、これも簡単に設定が変えられるようにしていおいた

試行錯誤しまくったので、最終的にこういうコードになっただけですが(^q^;


Fast PWM

Mode15 WGM[13:10] 0b1111

PWMで周波数、デューティー比可変できるもので一番基本っぽいので最初はこれからやってみた。

周波数をOCR1A、デューティー比をOCR1Bで指定。
OC1A, OC1Bの出力設定はよくわからないので適当に試してみたが波形が出力されなかった(全パターン試したわけではないです)

動作モードの指定は

// Fast PWM Mode, TOP = OCR1A
TCCR1B |= (1 << WGM13) | (1 << WGM12);
TCCR1A |= (1 << WGM11) | (1 << WGM10);

PWM出力の指定は

// Compare Output OC1A, OC1B
TCCR1A |= (1 << COM1A1) | (0 << COM1A0);
TCCR1A |= (1 << COM1B1) | (0 << COM1B0);

なんかおかしいのかな(@@;

PWM, Phase and Frequency Correct

Mode3 WGM[13:10] 0b0011

「ELECTRO SCHEMATIC」さんの「AVR PWM Pulse Width Modulation – Tutorial #12」
(http://www.electroschematics.com/9941/avr-pwm/)にデューティー比をいじるソースコードが載っていたのでコピペで動かしたらちゃんと動いた

が、これは「PWM, Phase Correct, 10-bit」というモードでデューティー比は可変だが、周波数は固定(プリスケーラーで大まかには設定できるかな?)

Mode9 WGM[13:10] 0b1001

TOP値をOCR1Aで指定するモードの中で、「Fast PWM Mode」はあきらめて「PWM, Phase and Frequency Correct」で動かしたら動いた(^q^/

波形をオシロで観測(上記ソースコードのパラメータで動作させています)


赤色はOC1A、黄色はOC2A OC1Bの出力

OC1Aは、
TCCR1A |= (0 << COM1A1) | (1 << COM1A0);
にしているのでコンペア・マッチでトグル出力

※この辺も、もうどういう動作を指定しているのか確信が持てません(^q^;

オシロの計測値


Dutyは75%になっているのでプログラムで指定した通りのデューティー比だ(cycle:500, duty:375)

出力周波数は、Duty比50%の赤色の方で見て1kHz

周波数は計算式はもうちょっとまじめにDATASHEETを読まないとわからないが、まあcycleが1あたり2μ秒だと思う

ということは
cycle = 1 で500kHz
cycle = UINT16_MAX(65536) でだいたい7.63Hz
がんばれば10Hz~500kHz程度の矩形波を生成できそうだ

周波数やデューティー比をLCDに表示しようと思うと
プログラムの計算に小数の乗算が出てきてCPUのリソースを食いそうなので
PWM波形生成がほんとにCPUと独立してるのかという点が気になるが。。。

今後AVRを使うことはあんまりないかもしれないので製作途中で問題が出てきたらまた調べたいと思います

矩形波のノイズ

オシロの波形を大まかに見ても矩形波にかなりノイズが乗っている(@@;

線が太くなっているところを拡大


だいたい32MHzなのでクロック由来のデジタル・ノイズのような気がする

前回の「測定器のまとめ」でオシロのアナログ帯域は20MHzで十分と書いたので、オシロの設定で20MHzの帯域制限をかけてみた

表示波形はフルバンド(帯域制限なし:100MHz)の時と大差ないです

↓フルバンドで計測


一次CR LPFをとりあえずかけてみた

「OKAWA Electric Design」さんのフィルタ計算ツール(http://sim.okawa-denshi.jp/CRlowkeisan.htm)でだいたいfc = 1MHzを計算して実験

fc = 1 / (2 * π * √(C * R)) fc = 1 / (2 * π * C * R)を変形してシミュレーションというのもすでにめんどくさくなってる(^q^;

R:100Ω C:100pF fc=だいたい16MHz

赤色がLPFを通した後、黄色がLPFを通す前

R:100Ω C:1000pF fc=だいたい1.6MHz

R:330Ω C:1000pF fc=だいたい480kHz

1次LPFだと多少カットオフ周波数をいじってもノイズの減衰は大差ない

過渡現象

R:100Ω C:100pF fc=だいたい16MHz

赤色がLPFを通した後、黄色がLPFを通す前

R:100Ω C:1000pF fc=だいたい1.6MHz

R:330Ω C:1000pF fc=だいたい480kHz

過渡現象はかなりはっきり違いが現れる(^q^;

矩形波に集中してるのに波形がなまってしまってはどうしようもないので弱めの2次LPFぐらい入れられればいいのかな

ケースの本体側に別基板を入れて、出力部だけ分けられるかどうか妄想中


ArduinoでPOTの不良をチェック

小ネタですが、実験で使っているPOTが動作不良っぽいのでArduinoを使ってチェックしてみた

ArduinoのanalogRead()で値を読み取ってUARTで出力して
CPLT(http://www.datatecno.co.jp/cplt/cplt-download.htm)でグラフ化する


スケッチ
 int analogPin = 0;  
 void setup() {  
  Serial.begin(9600);  
 }  
 void loop() {   
  int val = analogRead(analogPin);  
  Serial.println(val);  
  delay(100);  
 }  

比較対象はTOCOSの通信用のPOTを使った


POTのつまみを左から右、右から左へと回してみた

通信用POTのCPLTの表示

不良品のCPLTの表示

左いっぱいに回したときに0まで落ちていないし
回している途中も全然安定していない

ミノムシクリップを使えば新品のPOTのチェックもできると思う