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 件のコメント:
コメントを投稿