製作モジュール一覧

ラベル ぴゅんぴゅん3号 の投稿を表示しています。 すべての投稿を表示
ラベル ぴゅんぴゅん3号 の投稿を表示しています。 すべての投稿を表示

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月10日金曜日

ぴゅんぴゅん3号 3次VCVS LPF版シールドの設計

ぴゅんぴゅん3号のシールドをはんだ付けする前にブレッドボードでもう少し実験してみた




aitendoのI2C LCD(SPLC792-I2C)

今まで使っていたStrawberry LinuxのI2C LCDのピンヘッダが細いタイプで
ブレッドボードならいいが、ピンソケットに差すとぐらつくので交換しようと思ったが
作業途中でプリント・パターンを破壊してしまった(^q^;

aitendoのSPLC792-I2Cはなんか在庫が補充されているみたいなのでこっちを使うことにした
(1回の注文で2個までしか買えないが)

PSoC 4 Pioneer Kitはジャンパの設定で5V駆動、3.3V駆動が切り替えられるが
3.3V駆動にすると動作開始後しばらくするとI2Cの通信エラーが起こる

5V駆動なら正常動作する

PSoC 4 Pioneer Kitを5V駆動してもSPLC792-I2Cの電源は3.3V供給だし
I2CのプルアップはSPLC792-I2Cの基板上でされているので3.3Vだ

問題となりそうなのはRSTのレベルが普通の信号線なので5.0Vになる
→起動時に1回だけRSTしているので1回だけ仕様外

<追記:2015.04.18>RST信号は負論理(通常時はVDD)なのでRESET時以外は常に仕様外でした</>

I2Cの信号線が3.3Vレベルになるので5V駆動のPSoC 4 Pioneer KitのI2Cの入力が仕様外(だと思う)

本来なら3.3V駆動で正常動作するはずだが、原因は不明(@@;

深追いしないで、PSoC版のぴゅんぴゅん3号は5V駆動でいくことにする
(といってもPSoC 4 Pionner Kitのジャンパを切り替えるだけだが)

3次VCVS LPFの定数決め

シールド上でもピンソケットを使ってCRを交換できるようにするつもりだが
ブレッドボードでももう少し実験

OKAWA Electric Designさんのフィルター計算ツールを使って
http://sim.okawa-denshi.jp/Sallenkey3Lowkeisan.htm
バターワース特性でカットオフ周波数が2kHz、10kHz、50kHzになるようにして
できるだけ手持ちの部品で近い値のCRに置き換えてLTSpiceでシミュレーションした

そのあと実際にぴゅんぴゅん3号で波形を生成してオシロで見てみた

カットオフ周波数2kHz

シミュレーション

AC分析

<追記:2015.04.13>
このRCLフィルタで出る∧∨みたいなピークはなんだ?共振の発振を後段の2次LPFで抑えてるっていうことか?位相はOPAMPのフィルターで考えると信じられないぐらい回ってるし

終わりよければすべてよしみたいなものなのだろうか

そういえばLPFで進み位相になったのが何故なんだと思ってたが
タブレットのファンクションジェネレータ出力用のLPF でけた&いろいろ測定(http://dad8893.blogspot.jp/2015/04/lpf_6.html
一瞬でこんだけ位相が回されると元に戻るのか

気が付けば360度

2kHzは普通に可聴帯域で計測できそうだし調べてみる価値はあるかな
</追記>

オシロで観測: 2kHz矩形波

赤色がIDAC8からの出力、黄色がフィルターの出力

回路の後段に容量成分があるのでIDAC8からの出力もなまってるが
後段の回路を切り離すとこのようにちゃんとした矩形波が出力される


2kHzの矩形波は相当なまっているので、ちょっとこれはフィルターが効きすぎだ
三角波やノコギリ波もほとんどサイン波に近くなってしまった

カットオフ周波数10kHz

シミュレーション

AC分析

オシロで観測: 2kHz矩形波

なまっているがまあ矩形っぽい原型をとどめている

オシロで観測: 2kHzノコギリ波

これもなまっているがノコギリ波っぽい。

アナログシンセの波形ってこんな感じになまっているのでむしろ好都合かも(^q^/

カットオフ周波数50kHz

オシロで観測: 2kHzサイン波

LPFが効かな過ぎてDACからの出力のガタガタが取れなくなってしまった

フィルターとしてはどうかと思うが、デジタルとアナログの中間みたいでこれはこれで面白いかもしれない

ジッター

DDSの宿命なのかジッターはやはり出ているが
ピュンピュンマシンはもともと波形をLFOで揺らす作りなのでこれは問題ない

基板設計


1日ぐらいではんだ付けできるかな?

2015年3月21日土曜日

ぴゅんぴゅん3号 ファームウェアのプログラミング

やっとやる気が出たのでファームウェアのプログラミングをした

音出ししてyoutubeにあげました


http://youtu.be/r40BGVstZGs

パラメーターを適当にいじってそれっぽい音を作った

Name FREQ LFO DEPT Wave Shape LFO Shape
Pat Car 504 35 128 SQR SQR
Ame Pat 674 38 124 SQR SW1
Packman 504 35 128 TRI TRI
Invader 612 102 173 SW1 SW1
Psy Trance 157 25 255 SIN SW1
Robo Talk 手動 77 89 SQR SQR

機能的にはぴゅんぴゅん2号とほとんど同じなので目新しさはないですが、
32bit処理しているので音質は向上していると思います

MPUのリソースに余裕があるのでもう少し機能追加するかも

パラメーターを保存できるようにするとか

内蔵のflashメモリーに記録できればいいんだがだめならSDカードかな

3次VCVSローパスフィルタを使ったシールドを完成させれば3号プロジェクトはとりあえず完了とする予定

ファームウェアのPSoC ProjectはGitHubで公開しています

https://github.com/ryood/PSoC-PyunPyun
のPSoC_PyunPyun.cydsn/PSoC_PyunPyun-000.cywrk

いずれ整理して上げなおします

2015年3月14日土曜日

PSoC 4 Pioneer Kit ADCとDebouncerをPollingで使う

Pollingで使うExampleは見つからなかったが
普通にAPIを呼び出すことでPollingはできた

TopDesign


<main.c>

 #include <project.h>  
 #include <stdio.h>  
 #define CH0_N        (0x00u)  
 #define CH1_N        (0x01u)  
 #define CH2_N        (0x02u)  
 #define ADC_LOW_LIMIT  ((int16)0x000)  
 #define ADC_HIGH_LIMIT ((int16)0x7FF)  
 #define ADC_LIMIT(x) \  
   ((x)<ADC_LOW_LIMIT?ADC_LOW_LIMIT:((x)>=ADC_HIGH_LIMIT?ADC_HIGH_LIMIT:(x)))  
 volatile int16 adcResult[ADC_TOTAL_CHANNELS_NUM];  
 volatile uint32 sw1Count = 0;  
 volatile uint32 sw2Count = 0;  
 int main()  
 {  
   char uartLine[250];  
   uint8 sw1, sw2;  
   uint8 prevSw1 = 0u;  
   uint8 prevSw2 = 0u;  
   /* Initialize the UART */  
   UART_Start();  
   UART_PutCRLF();  
   UART_PutCRLF();  
   UART_PutString("Starting Controller measurement...");  
   UART_PutCRLF();  
   /* Init and start sequencing SAR ADC */  
   ADC_Start();  
   CyGlobalIntEnable;  
   for(;;)  
   {  
     // Polling ADC  
     ADC_StartConvert();  
     while (ADC_IsEndConversion(ADC_RETURN_STATUS) == 0u) {  
       // 変換終了を待つ  
       ;  
     }  
     adcResult[CH0_N] = ADC_LIMIT(ADC_GetResult16(CH0_N));  
     adcResult[CH1_N] = ADC_LIMIT(ADC_GetResult16(CH1_N));  
     adcResult[CH2_N] = ADC_LIMIT(ADC_GetResult16(CH2_N));  
     // Polling Debouncer Rising Edgedを検出  
     sw1 = Pin_5_Read();  
     if (sw1 && !prevSw1) {  
       sw1Count++;  
     }  
     sw2 = Pin_7_Read();  
     if (sw2 && !prevSw2) {  
       sw2Count++;  
     }  
     /* Print voltage value to UART */  
     sprintf(  
       uartLine, "ADC: %4d %4d %4d SW1: %d %d %lu SW2: %d %d %lu",  
       adcResult[CH0_N], adcResult[CH1_N], adcResult[CH2_N],   
       sw1, prevSw1, sw1Count, sw2, prevSw2, sw2Count  
       );  
     prevSw1 = sw1;  
     prevSw2 = sw2;  
     UART_PutString(uartLine);  
     UART_PutCRLF();  
     CyDelay(100);  
   }  
 }  

ADC_SAR_SEQ

ハードウェア割込みで使う場合とほとんど同じだが、値が条件の範囲に収まっているかどうかの判定は割込みを通してではないと使えない。
→マイナスの値が出てしまうのでソフトウェアで処理した

読み取り値を平均化するAverage ModeはPollingでも使えるようだ

Sample ModeはFree Runningでも大丈夫だと思うが
Hardware Triggerにしてプログラムで明示的にADC_StartConvert() APIを呼び出して
変換を開始するようにした

Debouncer

ロジック回路で(CPUとは独立に)動作するので使うことにした

入力用のPin_4、Pin_6は設定でPullupモードにしている

NOTコンポーネントで反転してDebouncerのdに入力、
qからPINに出力している


qはチャタリングを除去しただけの出力だ

これをプログラムでPIN_Read() APIを呼び出してPollingしている

SW_Tx_UART

UARTのコンポーネントはいくつかあるが、このコンポーネントが一番リソースが少なくて済むらしい

Txだけしか使えないが、PutString()やPutCRLF()など便利なAPIがある


Pollingでもうまく動いてくれたようですが
波形生成と組み合わせてどうなることやら。。。

2015年3月12日木曜日

PSoC 4 Pioneer Kit DDSの波形生成とADCの同時利用

PSoC 4内蔵のIDACを使ってのDDS波形生成と入力デバイスのテストがうまくいったので
両方合わせてテストしてみた



自作した可変電源のテストみたいに高圧ではないので配線はわりと気楽(^q^/

Arduino Unoほどタフではないと思うが、PSoC 4 Pioneer Kitも多少誤接続しても簡単には壊れない

気を許しすぎると危ないと思うが(^q^;

PSoC 4 Prototyping Kitの方は電源回りに保護回路が入っていないので
ラフな扱いをしたらたぶんすぐ壊れると思う(安いけど)

LCD表示とコントローラーの入力値が一発でうまくいったので喜んでたら
肝心の出力波形がグダグダ(^q^;;;


フィルターを通す前のPSoCのIDACの出力波形からグダグダ波形なのと
周波数が336.1Hzと低下していることから目星をつけた。

ADCの割込みと波形生成の割込みが干渉している

波形生成のISRは48,000Hzで呼び出される
ADCのISRはSAR ADCのConvert処理が終了するたびに呼び出される

ADCの処理が長引いて波形生成の割込みが48,000Hzで行われていないんだろう

PSoC 4 Pioneer Kitのシステムクロックは初期状態では24MHzだ
(設定で48MHzまで上げられる)

ARMベースだと思って油断してたがシステムクロックはArduino Uno(16MHz)の2倍もない

ADCの設定をいじってできるだけ処理時間が短くなるようにして
何とか1kHz付近の波形が出るようにしたが


理屈で考えて波形生成のクロックとADCのコンバート処理のタイミングが重なると波形が揺らぐ

ジッターの強烈なやつだ

面白いと言えば面白いのかもしれないが(^q^;

対応策

入力系はPollingで処理する

波形生成以外の割込みは使わない。
ぴゅんぴゅん2号(Arduino版のピュンピュンマシン)でもこの方法でやった

ADCの処理が終わるまでWaitしていても割込みがかかればそっちに処理が流れるので
遅延は起こらない

CPUで処理しているのでクロック単位の誤差はどうしても出るので
デジタル回路で処理しているオーディオインターフェイスみたいに
めちゃくちゃ正確とは言えないが、まあまあ正確に波形をを出せるだろう

割込みではなくPollingでのADCとDebouncerのテストが必要

Exampleがないかもしれないで真面目にやらないとダメっぽい

DebouncerコンポーネントはDATASHEETを見てみるとUDB(PSoCのデジタルブロック:PLDみたいなやつ)で実装されているみたいだ

UDBをいじることになると、まだ全然使ってないので深みにはまっていく可能性がある(^q^;

多重割込みをかける

ADCの割込みの優先度を上げて、他の割込みは多重割込みさせる

入力系の割込みの処理時間を十分小さくできればいけるかなと思ったが

う~ん

やっぱ、ちょっとでも遅延すると危ないな

Pollingがうまくいかないときの次善策として保留

今日は時間がないので続きは次回

2015年3月7日土曜日

3次VCVS Low Pass Filter

「回路の素101」 を眺めていたら3次VCVSローパスフィルタは、2次の前段にCRを追加するだけで済むようだ

R1とC1を追加

カットオフ周波数は
fc = 1 / 2 * π * 3√(C1 * C2 * C3 * R1 * R2 * R3)
で求まるが、フィルターの特性はそれぞれの値の配分で変わってくる。

できるだけ急峻なフィルターが欲しいので、OKAWA Electric Designさんのフィルター計算ツール
http://sim.okawa-denshi.jp/Sallenkey3Lowkeisan.htm)でチェビシェフ特性で計算した
特性周波数 fc = 5,000Hz
ゲイン・リップル gr = 3dB 
R1 = 11kΩ
R2 = 110kΩ
R3 = 33kΩ
C1 = 0.01uF
C2 = 0.0047uF
C3 = 68pF
ここから、自分の手持ちのパーツでできるだけ近い値のものを選んでもう一度計算してみた
R1 = 10kΩ
R2 = 100kΩ
R3 = 33kΩ
C1 = 0.01uF
C2 = 3900pF
C3 = 100pF
ボード線図


ナイキスト軌跡


過渡解析

等価ブロック線図における遮断周波数(カットオフ周波数)
  fc1 = 1596.20902951[Hz]
  fc2 = 4429.92162224[Hz]
去年制御工学の本を読んだのにナイキストの安定判別法とかもうすっかり忘れてしまった(^q^;
「MATLAB Simulinkによる わかりやすい制御工学」(http://dad8893.blogspot.jp/2014/08/matlab-simulink.html
過渡解析がそんなに暴れていないので、まあ安定してるんだろう(^q^;

Arduino互換のピンの配列も修正しつつ、ぴゅんぴゅん3号の回路図を書き直した


とりあえず、3次VCVSローパスフィルタの部分だけブレッドボードで実験してみた



WeveSpectra + WaveGeneで周波数特性を計測

オーディオインターフェイスの入力はGuitarモード(1MΩ)でダミーの負荷はつないでいない


350Hzあたりでグラフが折れ曲がってしまった(^q^;
シミュレーションと1桁違うなあ

WaveGeneでサイン波を生成してオシロで入出力を見てみた

1kHz


2kHz


5kHz

↑この辺で位相が90度以上遅れているようだ

10kHz


20kHz


サンプル数が少ないが、Excelで手作業でグラフ化してみた


4,500Hzあたりで-5dBぐらいかな?

まあ、だいたいでいいか(^q^;;;

1kHzの矩形波


オーバーシュートが出てるが(元がチェビシェフ特性なのでしかたない)
無事サイン波の方向になまってくれている(^q^/

PSoCから波形を出力

PSoCのIDACから1kHzのガタガタのサイン波を出力して
3次VCVSローパスフィルタを通してみた


きれいにはなっているが細かいことはわからない

WaveSpectraでFFT

3次VCVS LPF


2次VCVS LPF(以前とったもの)


高次の高調波歪はかなり減っているが、2次~5次あたりは逆に増えているようだ

思い付きでC2を1000pFに変更してみた


1kHzのサイン波だとかなり高調波歪が減ったが、実際音出ししてみないとなんとも言えない。

またCRを差し替えられるようにしてユニバーサル基板で組んでみて、音出ししながら決めようと思います