2015年2月6日金曜日

PSoC 4 Pioneer KitのTimerを使ってみた

外付けのDACでDDSを使って音出しをしようかと思ったがまだちゃんとPSoCのTimerを試していなかった(^q^;

PSoC 5LPではTimerという固定機能(たぶんハードウェアで実装されている)のコンポーネントが使えるようだが
PSoC 4ではTCPWM_P4というPWMやTimer/Counterなどに汎用的に使えるブロックを利用するコンポーネントを使うようだ

Example ProjectではTimerExampleというのがPSoC 4用のExampleなのでこれをやってみた

Project TimerExample

このプロジェクトはちょっとややこしい動作をする

ドキュメントにある通り基板上のP2[0]とP0[1]を結線する


TopDesignはこうなっている


図を見るとunとLED_BLUE、ccとLED_GREENが内部でつながっているように見えるが
実はこれはつながっていない
たぶん(^q^; 
cy_pinをドラッグすればわかる
つながっていれば結線がマゼンタで表示されるがこいつらをドラッグしても表示されない

実際動作させるとBLUEのLEDとGREENのLEDが不規則に点灯するが
これは二つの処理が走っている結果だ

main.cのメインループで5000m秒、つまり5秒ごとにCapture_Out Pin(P2[0])にHigh→Lowの信号を発生させて、基板上で結線したCapture_In Pin(P0[1])に送りTimerコンポーネントに割込みをかけてる

割込みをうけたTimerコンポーネントはmain.cの割込み処理ルーチン(CY_ISR)で
割込み状態のレジスタをクリア(Timer_ClearInterrupt)した後、GREENのLEDを200m秒点灯させる

なので、5秒ごとに200m秒GREENのLEDが点灯する

もうひとつの処理はTimerコンポーネント自体がunderflowしたときにコンポーネントの内部で割込みをかけてCY_ISRに処理を移す

同じように割込み状態のレジスタをクリアした後、200m秒BLUEのLEDを点灯させる

このコンポーネントは25kHzのクロックを受けて(キャプったTopDesignの画像はクロックを100kHzに変更したあとのものです)16bitのMAX値(65535)サイクルでループしているので

↑Timerの周期は Periodのところで設定

25kHz / 65535の逆数2.6214秒ごとに点滅する


波形生成用にTimerを設定してみた

ぴゅんぴゅん2号(http://dad8893.blogspot.jp/search/label/%E3%81%B4%E3%82%85%E3%82%93%E3%81%B4%E3%82%85%E3%82%93%EF%BC%92%E5%8F%B7)はArduino Unoに載っているATMega328Pの処理能力の都合上サンプリングレートを15,625Hzにしていたが
せっかくARMベースのMPUを使うのでまずは48kHzで実験することにした

デフォルトではcy_clockのクロックが12MHzなのでそのまま使うことにして

12MHz / 48kHz = 250

Timerの周期を250にして割込みをそのまま補足してHigh→Lowを出力

TopDesign



配線



<main.c>
 #include <project.h>  
 /*******************************************************************************  
 * Define Interrupt service routine and allocate an vector to the Interrupt  
 ********************************************************************************/  
 CY_ISR(InterruptHandler)  
 {  
   Sampling_Timer_ClearInterrupt(Sampling_Timer_INTR_MASK_TC);  
   Timer_Out_PIN_Write(1u);  
   Timer_Out_PIN_Write(0u);  
 }  
 int main()  
 {  
   /* Place your initialization/startup code here (e.g. MyInst_Start()) */  
   CyDelay(50u);  
   CyGlobalIntEnable;  
   Timer_ISR_StartEx(InterruptHandler);  
   Sampling_Timer_Start();  
   for(;;)  
   {  
     /* Place your application code here. */  
   }  
 }  

出力


画像の左下の表示値のFの値が周波数→47.75kHz

だいたい48kHzの割込みでけた(^q^/

cy_clockの設定で許容誤差±5%に設定しているので(Tolearanceのところ)
50.4kHz~45.6kHzならOK



ちゃんとした音源ならクロックもしっかりしないといけないが
適当でいい感じがピュンピュンマシンの目標です(^q^;

気づいたこととか

デジタル回路をやるならオシロがあるととても便利

正月にシリコンハウスの店員さんにお勧めされた
Gabotonics Xminilab Portable(http://dad8893.blogspot.jp/2015/01/blog-post.html)も
サイズが小さくてこういう用途にはいいかもしれない

OWONは(結構コンパクトなほうだが)机の上に引っ張り出すのがなんかおっくうな時もある(^q^;

いやでも、う~ん

0 件のコメント:

コメントを投稿